Patroni İle PostgreSQL Yüksek Erişilebilir(HA) Cluster Kurulumu

  • Fatih Çevik
  • 31 Mar 2022

PostgreSQL açık kaynak kodlu, çok yönlü ve dünyadaki en yaygın veritabanı sistemlerinden biridir. Her ne kadar çok yönlü ve yaygın olsa da Yüksek Erişilebilirlik(HA) için bir çözüm sunmamaktadır.

Patroni Nedir ?

Patroni yüksek erişilebilir PostgreSQL clusterlarının kurulumlarını, yönetimlerini vb. süreçleriniz otomatize edebileceğiniz bir cluster manager aracıdır. Python diliyle yazılmıştır ve maksimum erişilebilirlik için etcd kullanır. Ek olarak Patroni veritabanı replikasyonu, backup ve konfigürasyon restore etme konularında da yeteneklidir.

PostgreSQL Cluster Ana Bileşenleri

  • Patroni : Yüksek erişilebilir PostgreSQL clusterlarının konfigürasyonu için template sağlar.

  • ETCD : PostgreSQL clusterının anlık durumunu saklar. Eğer herhangi bir PostgreSQL node'unuzda değişilik olursa Patroni , ETCD içerisinde saklanan key-value değerini günceller. ETCD bu bilgiyi cluster içindeki master node seçimi için kullanır ve clusterı devamlı ayakta tutar.

  • HAProxy : Master/Slave nodelar arasındaki değişiklikleri takip eder ve herhangi bir clienttan istek geldiğinde master node üzerinde bağlantıyı gerçekleştirir.

Bu yazımızda Ubuntu 20.04 işletim sistemi üzerinde Patroni ile 4 adet node bulunduran cluster kurulumu gerçekleştireceğiz.

Aşağıdaki adımları hiç birini atlamadan takip edin ve kendi node bilgilerinize göre gereken güncellemeleri yapın .

Servers Application IP Address
node1 Postgres, Patroni 10.0.0.1
node2 Postgres, Patroni 10.0.0.2
node3 etcd 10.0.0.3
node4 HAProxy 10.0.0.4

1. PostgreSQL Kurulumunu Gerçekleştirin

İlk olarak yapmanız gereken node1 ve node2 üzerinde PostgreSQL kurulumunu gerçekleştirmek. Aşağıdaki komut ile kolayca PostgreSQL kurulumunu gerçekleştirin.

apt install postgresql postgresql-contrib -y

Kurulumdan sonra aşağıdaki komut ile bütün node'larda PostgreSQL servisini durdurun.

systemctl stop postgresql

Sıradaki adımda, /usr/lib/postgresql/12/bin/ ile /usr/sbin dizinleri arasında symlink'e ihtiyacınız var çünkü Patroni tarafından ihtiyaç duyulan araçlar bu dizinde bulunmakta. Aşağıdaki komut ile işlemi gerçekleştirin.

ln -s /usr/lib/postgresql/12/bin/* /usr/sbin/

2. Patroni, ETCD ve HAProxy Kurulumlarını Gerçekleştirin

İlk olarak, node1 ve node2 üzerinde gerekli paketlerin yüklemesini aşağıdaki komut ile gerçekleştirin.

apt -y install python3-pip python3-dev libpq-dev

Şimdi PIP güncel sürüm yükseltmesini aşağıdaki komut ile gerçekleştirin.

pip3 install --upgrade pip

Son olarak, PIP komutunu kullanarak node1 ve node2 üzerinde Patroni ve diğer gereksinimlerin kurulumunu gerçekleştirin.

pip install patroni

pip install python-etcd

pip install psycopg2

Şu anda Patroni node1 ve node2 makineleri üzerinde kurulmuş durumda.

Şimdi ETCD servisimizin çalışacağı node3 makinesine ulaşın ve aşağıdaki komut ile kurulumu gerçekleştirin.

apt -y install etcd

Kurulumun bitmesinin ardından node4 makinesine giriş yapın ve HAproxy servisini aşağıdaki komut ile yükleyin.

apt -y install haproxy

3. ETCD ve Patroni Konfigürasyonlarını Düzenleyin

ETCD ana konfigürasyon dosyası aşağıdaki dizinde bulunmaktadır .

/etc/default/etcd

Nano editör ile konfigürasyon dosyasını düzenleyin.

nano /etc/default/etcd

Aşağıdaki konfigürasyonları ekleyin. Kendi IP bilgilerinize göre güncellemeyi unutmayın .

    ETCD_LISTEN_PEER_URLS  =  "http://10.0.0.3:2380,http://127.0.0.1:7001"   
ETCD_LISTEN_CLIENT_URLS = "http://127.0.0.1:2379, http://10.0.0.3379"
ETCD_INITIAL_ADVERTISE_PEER_URLS = "http://10.0.0.3:2380"
ETCD_INITIAL_CLUSTER = "etcd0=http://10.0.0.3:2380"
ETCD_ADVERTISE_CLIENT_URLS = "http://10.0.0.3:2379"
ETCD_INITIAL_CLUSTER_TOKEN = "node1"
ETCD_INITIAL_CLUSTER_STATE = "new"

Konfigürasyon dosyasını düzenleyip ETCD servisini yeniden başlatın.

systemctl restart etcd

Aşağıdaki komut ile servis durumunu görüntüleyebilirsiniz.

systemctl status etcd

Şimdi node1 ve node2 için patroni.yml dosyası oluşturmanız gerekiyor. Node1 üzerinde aşağıdaki komut ile yeni bir patroni.yml dosyası oluşturup sıradaki konfigürasyonları ekleyin.

nano /etc/patroni.yml

    scope:   postgres 
namespace: /db/
name: postgresql0

restapi:
listen: 10.0 .0 .1 : 8008
connect_address: 10.0 .0 .1 : 8008

etcd:
host: 10.0 .0 .3 : 2379

bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true

initdb:
- encoding: UTF8
- data-checksums

pg_hba:
- host replication replicator 127.0 .0 .1 / 32 md5
- host replication replicator 10.0 .0 .1 / 0 md5
- host replication replicator 10.0 .0 .2 / 0 md5
- host all all 0.0 .0 .0 / 0 md5

users:
admin:
password: admin
options:
- createrole
- createdb

postgresql:
listen: 10.0 .0 .1 : 5432
connect_address: 10.0 .0 .1 : 5432
data_dir: /mnt/ patroni
pgpass: /tmp/ pgpass
authentication:
replication:
username: replicator
password: "Strong Password"
superuser:
username: postgres
password: "Strong Password"
parameters:
unix_socket_directories: '.'

tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false

Dosyayı kaydedin, ardından Patroni için bir data dizini oluşturun ve sahipliğini düzenleyin.

   
mkdir -p /mnt/ patroni
chown postgres:postgres /mnt/ patroni
chmod 700 /mnt/ patroni

Ardından Node2 üzerinde aşağıdaki benzer işlemleri gerçekleştirin.

nano /etc/patroni.yml

Aşağıdaki konfigürasyonları ekleyin.

     
scope: postgres
namespace: /db/
name: postgresql1

restapi:
listen: 10.0 .0 .2 : 8008
connect_address: 10.0 .0 .2 : 8008

etcd:
host: 10.0 .0 .3 : 2379

bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true

initdb:
- encoding: UTF8
- data-checksums

pg_hba:
- host replication replicator 127.0 .0 .1 / 32 md5
- host replication replicator 10.0 .0 .1 / 0 md5
- host replication replicator 10.0 .0 .2 / 0 md5
- host all all 0.0 .0 .0 / 0 md5

users:
admin:
password: admin
options:
- createrole
- createdb

postgresql:
listen: 10.0 .0 .2 : 5432
connect_address: 10.0 .0 .2 : 5432
data_dir: /mnt/ patroni
pgpass: /tmp/ pgpass
authentication:
replication:
username: replicator
password: "Strong Password"
superuser:
username: postgres
password: "Strong Password"
parameters:
unix_socket_directories: '.'

tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false

Kaydedin ve Node1 üzerinde de yaptığınız gibi data dizini oluşturun.

   
mkdir -p /mnt/ patroni
chown postgres:postgres /mnt/ patroni
chmod 700 /mnt/ patroni

Patroni İçin Systemd Dosyası Oluşturun.

Node1 ve Node2 üzerinde Patroni servisini yönetmek için aşağıdaki servis dosyasını oluşturun.

nano /etc/systemd/system/patroni.service

Aşağıdaki konfigürasyonları ekleyin.

   
[Unit]
Description =Runners to orchestrate a high-availability PostgreSQL
After =syslog.target network.target

[Service]
Type =simple

User =postgres
Group =postgres

ExecStart =/usr/local/bin/patroni /etc/patroni.yml
KillMode =process
TimeoutSec =30
Restart = no

[Install]
WantedBy =multi-user.targ

Dosyayı kaydedin ve ardından aşağıdaki komutu çalıştırın.

systemctl daemon-reload

Şimdi Node1 ve Node2 üzerinde Patroni servisini çalıştırın. DİKKAT EDİN YALNIZCA PATRONI .

systemctl start patroni

Patroni servisinin durumunu aşağıdaki komutla kontrol edebilirsiniz.

systemctl status patroni

Yalnızca Patroniyi çalıştırma sebebimize gelecek olursak, Konfigürasyonlardan da gördüğünüz üzere Patroni PostgreSQL ile aynı porta bind edili durumda ve kendine ait farklı bir data dizini ile konfigürasyonları mevcut. Bu da Postgresql servisini patroni üzerinden kullandığımız anlamına geliyor. Yani özetleyecek olursak postgresql ve patroni bir arada çalışıyor olursa 5432 portundan bağlandığınızda replikasyon işlemi gerçekleşmemiş olacak çünkü postgresql data dizini üzerinden bağlanıyor olacaksınız.

4. HAProxyi Konfigürasyonunu Düzenleyin

Node4 üzerinde HAProxy ana konfigürasyonunu aşağıdaki şekilde düzenleyin.

nano /etc/haproxy/haproxy.cfg

Standart konfigürasyonu kaldırın ve aşağıdaki şekilde güncelleyin

   
global
maxconn 100

defaults
log global
mode tcp
retries 2
timeout client 30m
timeout connect 4s
timeout server 30m
timeout check 5s

listen stats
mode http
bind *:7000
stats enable
stats uri /

listen postgres
bind *:5000
option httpchk
http-check expect status 200
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server postgresql1 10.0.0.1:5432 maxconn 100 check port 8008
server postgresql2 10.0.0.2:5432 maxconn 100 check port 8008

Dosyayı kaydedin ve HAProxy servisini yeniden başlatın.

systemctl restart haproxy

Durumunu doğrulamak için aşağıdaki komutu kullanabilirsiniz.

systemctl status haproxy

5. PostgreSQL Clusterına Erişin

Artık postgresql clusterınız kullanıma hazır. http://10.0.0.4:7000 adresi üzerinden cluster durumunuzu görüntüleyebilir ve 5432 portundan veritabanınıza bağlanarak replikasyon kontrol testlerinizi gerçekleştirebilirsiniz. Bir sonraki yazımızda da Nginx ile clusterınıza nasıl domain tanımlayacağınızı anlatacağız . Görüşmek üzere :)

Size yardımcı olmamı
ister misiniz ?