Patroni, ETCD ve HAProxy kullanarak Cluster Kurulumu ve Yapılandırması

Abdulkadir Erbas - Oct 16 - - Dev Community

Veri tabanlarının güvenilir ve kesintisiz çalışması, özellikle kritik uygulamalar için büyük önem taşır. Cluster mimarisi, birden fazla sunucunun birlikte çalışarak aynı veri tabanını yönetmesini sağlar. Bu sayede, herhangi bir sunucuda arıza meydana geldiğinde, diğer sunucular devreye girerek hizmetin kesintisiz devam etmesini mümkün kılar.

Yüksek Erişilebilirlik (High Availability - HA), sistemlerin her zaman erişilebilir olmasını sağlamak için arızalara karşı dayanıklı bir yapı kurmayı amaçlar. Bir PostgreSQL veritabanı cluster’ı, özellikle yüksek trafikli ve 7/24 çalışması gereken sistemler için bu ihtiyacı karşılar.

Patroni ve etcd gibi araçlar, PostgreSQL üzerinde bir HA mimarisi kurmamızı kolaylaştırır. Patroni, PostgreSQL cluster'ını yönetirken kendi içinde lider seçme mekanizması uygular, ancak bu mekanizmanın tutarlı ve güvenilir çalışabilmesi için etcd gibi bir dış koordinasyon aracı gereklidir. Patroni düğümleri arasında iletişim koptuğunda veya belirsizlik durumlarında etcd, liderliği güvence altına alır ve hizmetin sürekliliğini sağlar.

Bu yazıda, Patroni ve etcd kullanarak bir PostgreSQL cluster’ının nasıl yapılandırılacağını ve kurulacağını adım adım ele alacağız.

Kuruluma Başlamadan Önce,
Kurulum için aşağıdaki görselde belirtilen ip adreslerine göre düzenleme yapacağım. Siz kurduğunuz sunucunuzun ip adresine göre ilgili kısımları düzenlemelisiniz.

Image description

 

Patroni ve PostgreSQL Cluster Kurulumu

Her iki sunucuda da (Node1 ve Node2) aşağıdaki adımları sırayla uygulayın.

1. PostgreSQL ve Bağımlılıkların Kurulumu

Öncelikle PostgreSQL’i ve gerekli modülleri yükleyin.

sudo apt install postgresql postgresql-contrib -y
Enter fullscreen mode Exit fullscreen mode

2. PostgreSQL Servisini Durdur

systemctl stop postgresql
Enter fullscreen mode Exit fullscreen mode

3. Kısayol Oluştur

sudo ln -s /usr/lib/postgresql/14/bin/* /usr/sbin/
Enter fullscreen mode Exit fullscreen mode

4. Python ve PostgreSQL Bağımlılıları Kurulumu

sudo apt install python3-pip python3-dev libpq-dev -y
Enter fullscreen mode Exit fullscreen mode

5. Pip Paket Yöneticisini Güncelle

sudo pip3 install --upgrade pip
pip3 install --upgrade pip
Enter fullscreen mode Exit fullscreen mode

6. Patroni Kur

sudo pip install patroni
pip install patroni
Enter fullscreen mode Exit fullscreen mode

7. Etcd İçin Python Modülü Kur

sudo pip install python-etcd
Enter fullscreen mode Exit fullscreen mode

8. PostgreSQL İçin Psycopg2 Kur

sudo pip install psycopg2
Enter fullscreen mode Exit fullscreen mode

9. PostgreSQL için kullanıcı ve parola oluştur

sudo systemctl start postgresql
sudo -u postgres psql
ALTER USER postgres PASSWORD 'Parola01.!';
CREATE USER replicator WITH ENCRYPTED PASSWORD 'Parola01.!';
\q
sudo systemctl stop postgresql
Enter fullscreen mode Exit fullscreen mode

10. Patroni Yapılandırması

sudo nano /etc/patroni.yml
Enter fullscreen mode Exit fullscreen mode

10.1 Node1 için yapılandırma

node1 için yukarıdaki komutu yazdıktan sonra editöre aşağıdaki örnek yapılandırmayı kopyalayın.

scope: postgres
namespace: /db/
name: node1

restapi:
    listen: 10.20.30.1:8008
    connect_address: 10.20.30.1:8008
etcd:
    hosts: 10.20.30.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.20.30.1/0 md5
    - host replication replicator 10.20.30.2/0 md5
    - host all all 0.0.0.0/0 md5

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

postgresql:
    listen: 10.20.30.1:5432
    connect_address: 10.20.30.1:5432
    data_dir: /dev/data/patroni/
    pgpass: /tmp/pgpass
    authentication:
        replication:
            username: replicator
            password: Parola01.!
        superuser:
            username: postgres
            password: Parola01.!
    parameters:
        unix_socket_directories: '.'

tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false
Enter fullscreen mode Exit fullscreen mode

10.2 node2 için yapılandırma

scope: postgres
namespace: /db/
name: node2

restapi:
    listen: 10.20.30.2:8008
    connect_address: 10.20.30.2:8008
etcd:
    hosts: 10.20.30.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.20.30.1/0 md5
    - host replication replicator 10.20.30.2/0 md5
    - host all all 0.0.0.0/0 md5

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

postgresql:
    listen: 10.20.30.2:5432
    connect_address: 10.20.30.2:5432
    data_dir: /dev/data/patroni/
    pgpass: /tmp/pgpass
    authentication:
        replication:
            username: replicator
            password: Parola01.!
        superuser:
            username: postgres
            password: Parola01.!
    parameters:
        unix_socket_directories: '.'

tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false
Enter fullscreen mode Exit fullscreen mode

Fark edildiği node1 ve node2 yapılandırması neredeyse aynı. Sadece node1'in ip adresi yerine node2, node2'nin ip adresi yerine node1 yazdık.

Burada dikkat edilmesi gereken 2 önemli nokta var:

  • Bu yapılandırmayı, kendi node sunucularınızın ip adresine göre yazmalısınız.
  • 9. adımda belirlediğiniz parolayı doğru bir şekilde yazdığınızdan emin olunuz.

11. Gerekli Dizinlerin Oluşturulması

Burada 10. adımda yazdığımız yapılandırma dosyasına göre gerekli dizinleri oluşturuyoruz. Söz konusu /etc/patroni.yml dosyasındaki data_dir: kısmında yer alan dosya yoludur. Verilen örnekte /dev/data/patroni/ yazmaktadır. Bu dosya yolu ne ise aşağıdaki komutları ona göre yazmalısınız.

sudo mkdir -p /dev/data/patroni/
Enter fullscreen mode Exit fullscreen mode

12. Dizin Sahipliğini PostgreSQL Kullanıcına Vermek

sudo chown postgres:postgres /dev/data/patroni/
Enter fullscreen mode Exit fullscreen mode

13. İzinlerin Düzenlenmesi

sudo chmod 700 /dev/data/patroni/
Enter fullscreen mode Exit fullscreen mode

14. Patroni Servislerinin Ayarlanması

sudo nano /etc/systemd/system/patroni.service
Enter fullscreen mode Exit fullscreen mode

Bu kısma aşağıdaki ayarlamayı kopyalayıp kaydedin.

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

15. Systemd Daemon'un Yeniden Yüklenmesi

systemctl daemon-reload
Enter fullscreen mode Exit fullscreen mode

node1 ve node2 için bunları yaptıysanız, patronide lider seçimi için etcd sunucusu kurulumuna geçelim

 

1. Etcd Kurulumu

sudo apt install etcd -y
Enter fullscreen mode Exit fullscreen mode

2. Etcd Servisi Yapılandırması

nano /etc/default/etcd
Enter fullscreen mode Exit fullscreen mode

bu kısma aşağıdaki yapılandırmayı kopyalayıp en alta yapıştırın. Kendi sunucularınızın ip adresine göre yapılandırmayı unutmayın.

ETCD_LISTEN_PEER_URLS="http://10.20.30.3:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://10.20.30.3:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.20.30.3:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://10.20.30.3:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="node1"
ETCD_ADVERTISE_CLIENT_URLS="http://10.20.30.3:2379"
Enter fullscreen mode Exit fullscreen mode

3. Etcd Servisini Yeniden Başlat

systemctl restart etcd
Enter fullscreen mode Exit fullscreen mode

4. Etcd Servis Durumunu Kontrol Et

systemctl status etcd
Enter fullscreen mode Exit fullscreen mode

Etcd kurulumunu tamamladık. Tekrar node1 ve node2'ye dönüp aşağıdaki işlemleri yapıyoruz.

 

1. Patroni Servisini Başlat

systemctl start patroni.service
Enter fullscreen mode Exit fullscreen mode

2. PostgreSQL Servisini Başlat

systemctl start postgresql
Enter fullscreen mode Exit fullscreen mode

Aşağıdaki komutla node'larınızı görüntüleyebilirsiniz.

Patroni Cluster Durumunu Kontrol Et

patronictl -c /etc/patroni.yml list
Enter fullscreen mode Exit fullscreen mode
+ Cluster: postgres-cluster (....)----+----+-----------+
| Member | Host        | Role    | State   | Lag in MB |
+--------+-------------+---------+---------+-----------+
| node1  | 10.20.30.1  | Leader  | running |           |
| node2  | 10.20.30.2  | Replica | running | 0         |
+--------+-------------+---------+---------+-----------+
Enter fullscreen mode Exit fullscreen mode

 

PostgreSQL'in yüksek erişilebilir yük dengesi için HAProxy ile kullanımı

Ayrı bir sunucuda aşağıdaki gibi haproxy sunucu kurup yapılandırma dosyasında PostgreSQL düğümlerini tek tek eklemek gerekmektedir.

1. HAProxy Kurulumu

sudo apt install haproxy
Enter fullscreen mode Exit fullscreen mode

2. HAProxy Yapılandırma

global
    maxconn 1000

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 node1 10.20.30.1:5432 maxconn 100 check port 8008
    server node2 10.20.30.2:5432 maxconn 100 check port 8008
Enter fullscreen mode Exit fullscreen mode

3. Servisi Yeniden Başlat

systemctl restart haproxy
systemctl status haproxy
Enter fullscreen mode Exit fullscreen mode

4. HAProxy Servisini Görüntülemek

tarayıcıya haproxy'nin kurulu olduğu makinenin ip adresi:7000 ile arayüze erişebilirsiniz.

Image description

Tebrikler. Yapılandırma tamamlandı.

 
Patroni hakkında daha fazla bilgi için Patroni Nedir? başlıklı yazıma göz atabilirsiniz.

zabbix üzerinde patroni API'sinden gelen verileri monitoring etmek için Patroni'ye Özel Zabbix Template'ı Oluşturma başlıklı yazıma göz atabilirsiniz.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .