DEV Community

Abdulkadir Erbas
Abdulkadir Erbas

Posted on

Patroni ve ETCD kullanarak Cluster Yapılandırılması ve Kurulumu

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 gi descriptionbi 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 cluster

 

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

systemclt 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 -u postgres psql
ALTER USER postgres PASSWORD 'Parola01.!';
CREATE USER replicator WITH ENCRYPTED PASSWORD 'Parola01.!';
\q
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

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

Tebrikler. Yapılandırma tamamlandı.
Patroni hakkında daha fazla bilgi için bu yazıma göz atabilirsiniz.

Top comments (0)