DEV Community

Fatih ASLAN
Fatih ASLAN

Posted on

pg_auto_failover ile PostgreSQL Cluster Kurulumu

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode
  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

Enter fullscreen mode Exit fullscreen mode

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

export PGDATA=./monitor

pg_autoctl show uri
Enter fullscreen mode Exit fullscreen mode
        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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

ref:

pg_auto_failover github | readthedocs | ytube

Discussion (0)