pg_auto_failover ile PostgreSQL Cluster Kurulumu

Fatih ASLAN
3 min readSep 14, 2021

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 bashsudo 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.servicesudo 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 - postgresexport PGDATA=./monitorpg_autoctl create monitor --ssl-self-signed --hostname 10.10.10.147 --auth trust --runctrl+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.servicesudo 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 - postgresexport PGDATA=./datapg_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' --runctrl+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.servicesudo 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 - postgresexport PGDATA=./datapg_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' --runctrl+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.servicesudo 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 - postgresexport PGDATA=./datapg_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' --runctrl+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.servicesudo 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=./monitorpg_autoctl show stateName |  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=./monitorpg_autoctl show uriType |    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=./monitorpg_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ığındaexport PGDATA=./dataexport PATH=/usr/lib/postgresql/13/bin:$PATHpg_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:

--

--