Monitor(10.10.10.147) + 3 PostgreSQL(10.10.10.144, 10.10.10.145, 10.10.10.146) Toplam 4 NODE

Aşağıdaki komut tüm node‘lerde, sudo yetkili kullanıcı ile çalıştırılmalıdır.

curl https://install.citusdata.com/community/deb.sh | sudo bash
sudo apt-get install postgresql-13-auto-failover-1.5

NoT: PostgreSQL default‘ta 5432 portundan çalışır, yukarıdaki kurulum esnasında otomatik olarak PostgreSQL ayağa kalktığı için 5432 port kullanımda olur. Biz de gelecekte herhangi bir karışıklığa sebebiyet vermemek için(yani dışarıdan bir kullanıcı veritabanına bağlanmak için psql dediğinde varsayılan olarak 5432 portu üzerinden çalışan PostgreSQL instance veritabanına bağlantı yapacaktır. Doğal olarak pg_auto_failover ile biz farklı portlar üzerinden cluster kurulumu yapabileceğimiz için psql ile cluster‘a ip ya da portu belirterek cluster PostgreSQL‘e bağlantı sağlayabiliriz. Biz hem bu durumun önüne geçip birden fazla instance PostgreSQL çalışmasını önlemek hem de farklı kullanıcılarda oluşabilecek kafa karışıklığının önüne geçebilmek için varsayılan PostgreSQL servisini kapatıp, pasif hale getiriyoruz. )

sudo systemctl stop postgresql.service

sudo systemctl disable postgresql.service

Akabinde Monitor Node‘sinde(10.10.10.147) çalıştırılır.

Posgres kullanıcısına geçilir.

sudo su - postgres

export PGDATA=./monitor

pg_autoctl create monitor --ssl-self-signed --hostname 10.10.10.147 --auth trust --run

ctrl+c   # servisin çalıştığı görülür ve kesilir

postgres kullanicisindan çıkılır ve sudo yetkili kullaniciya dönülür.

pg_autoctl -q show systemd --pgdata /var/lib/postgresql/monitor | sudo tee /etc/systemd/system/pgautofailover.service

sudo systemctl daemon-reload
sudo systemctl enable pgautofailover
sudo systemctl start pgautofailover
sudo systemctl status pgautofailover

1. Node(10.10.10.144)

Posgres kullanıcısına geçilir.

sudo su - postgres

export PGDATA=./data

pg_autoctl create postgres --hostname 10.10.10.144 --auth trust --ssl-self-signed --monitor 'postgres://autoctl_node@10.10.10.147:5432/pg_auto_failover?sslmode=require' --run

ctrl+c    # servisin çalıştığı görülür ve kesilir

postgres kullanicisindan çıkılır ve sudo yetkili kullaniciya dönülür.

pg_autoctl -q show systemd --pgdata /var/lib/postgresql/data | sudo tee /etc/systemd/system/pgautofailover.service

sudo systemctl daemon-reload
sudo systemctl enable pgautofailover
sudo systemctl start pgautofailover
sudo systemctl status pgautofailover

2. Node(10.10.10.145)

Posgres kullanıcısına geçilir.

sudo su - postgres

export PGDATA=./data

pg_autoctl create postgres --hostname 10.10.10.145 --auth trust --ssl-self-signed --monitor 'postgres://autoctl_node@10.10.10.147:5432/pg_auto_failover?sslmode=require' --run

ctrl+c    # servisin çalıştığı görülür ve kesilir

postgres kullanicisindan çıkılır ve sudo yetkili kullaniciya dönülür.

pg_autoctl -q show systemd --pgdata /var/lib/postgresql/data | sudo tee /etc/systemd/system/pgautofailover.service

sudo systemctl daemon-reload
sudo systemctl enable pgautofailover
sudo systemctl start pgautofailover
sudo systemctl status pgautofailover

3. Node(10.10.10.145)

Posgres kullanıcısına geçilir.

sudo su - postgres

export PGDATA=./data

pg_autoctl create postgres --hostname 10.10.10.146 --auth trust --ssl-self-signed --monitor 'postgres://autoctl_node@10.10.10.147:5432/pg_auto_failover?sslmode=require' --run

ctrl+c    # servisin çalıştığı görülür ve kesilir

postgres kullanicisindan çıkılır ve sudo yetkili kullaniciya dönülür.

pg_autoctl -q show systemd --pgdata /var/lib/postgresql/data | sudo tee /etc/systemd/system/pgautofailover.service

sudo systemctl daemon-reload
sudo systemctl enable pgautofailover
sudo systemctl start pgautofailover
sudo systemctl status pgautofailover

Cluster kurulumumuz tamamlandı.

Şimdi Monitör node‘sinde cluster statusunu gostermek için, posgres kullanıcısına bağlanıp,

export PGDATA=./monitor

pg_autoctl show state
  Name |  Node |        Host:Port |       LSN |   Connection |       Current State |      Assigned State
-------+-------+------------------+-----------+--------------+---------------------+--------------------
node_1 |     1 | 10.10.10.144:5432 | 0/8000B78 |   read-write |             primary |             primary
node_2 |     2 | 10.10.10.145:5432 | 0/8000B78 |    read-only |           secondary |           secondary
node_3 |     3 | 10.10.10.146:5432 | 0/8000B78 |    read-only |           secondary |           secondary

Monitör node‘sinde connection string‘i görmek için yine posgres kullanıcısında,

export PGDATA=./monitor

pg_autoctl show uri
        Type |    Name | Connection String
-------------+---------+-------------------------------
     monitor | monitor | postgres://autoctl_node@10.10.10.147:5432/pg_auto_failover?sslmode=require
   formation | default | postgres://10.10.10.145:5432,10.10.10.144:5432,10.10.10.146:5432/postgres?target_session_attrs=read-write&sslmode=require

Monitör node‘sinde cluster log‘larını görmek için yine posgres kullanıcısında,

export PGDATA=./monitor

pg_autoctl show events

Veritabanına dışarıdan(remote vs) erişim için pg_hba.conf dosyasında ilgili ayarlamalar yapılmalıdır, nasıl yapılacağına dair dosya içinde gerekli yönlendirme mevcuttur. Bu değişiklikler her node için ayrı ayrı yapılmalıdır.

#pg_hba.conf değişiklik yapıldığında

export PGDATA=./data

export PATH=/usr/lib/postgresql/13/bin:$PATH

pg_ctl reload

PostgreSQL db connection example;

sudo -u postgres psql postgres://10.10.10.144:5432,10.10.10.145:5432,10.10.10.146:5432/postgres?target_session_attrs=read-write

PostgreSQL JDBC Spring read replica example;

spring.datasource.url=jdbc:postgresql://10.10.10.144:5432,10.10.10.145:5432,10.10.10.146:5432/postgres?currentSchema=postgres&targetServerType=master

ref:

pg_auto_failover github readthedocs ytube