You are currently viewing Postgresql HA Cluseter

Postgresql HA Cluseter

Bu yazımızda Postgresql için (High Availability) Cluster yapısının kurulmasından bahsedeceğiz. 3 node lu bir ortam kuracağız. Postgresql Açık kaynak kodlu ve popüler bir veri tabanı olmasına karşılık doğrudan, Cluster yapısına desteği bulunmamaktadır, fakat Patroni ile cluster desteği sağlanabilmektedir. Bizde bu yazımızda Patroni ile işleme devam edeceğiz.

Biz aşağıdaki yapı ile 3 node lu bir yapı kuracağız.

SunucularUygulamalarIP
etcdetcd, HAProxy172.15.1.10
psqlnode01patroni, Postgresql172.15.1.11
psqlnode02patroni, Postgresql172.15.1.12

ETCD kurulumu ile başlıyoruz.

sudo apt install etcd

Kurulum işlemi tamamlandıktan sonra etcd conf dosyasını düzenleyelim.

sudo vi /etc/default/etcd

Bu dosya içinde başında #olan yerleri silelim ve localhost yazan yerleri kendi IP miz ile değiştirelim.

ETCD_LISTEN_PEER_URLS="http://172.15.1.10:2380"
ETCD_LISTEN_CLIENT_URLS="http://172.15.1.10:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.15.1.10:2380"
ETCD_INITIAL_CLUSTER="default=http://172.15.1.10:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://172.15.1.10:2379"

dosyayı düzenledikten sonra “etcd” servisini restart edelim.

sudo systemctl restart etcd

Servisin durumunu kontrol edelim.

systemctl status etcd

HAProxy kurulumu

Etcd kurulumunu yaptıktan sonra, HAProxy kurulumuna geçelim. Burada HAProxy ile Node lar arası değişiklikleri takip ederek clientlar arasında gelen istekleri uygun noda yönlendirmekle görevli olacak.

sudo apt install haproxy

HAProxy bu komuttan sonra kurulmuş olacak. Biz PostgreSQL ve Patroni kurulumlarımız ile devam edeceğiz. Sonrasında HAProxy yapılandırma adımına geri döneceğiz.

PostgreSQL kurulumu

Yukarıda verdiğimiz tablodan görüldüğü üzere bu işlemleri psqlnode01 ve psqlnode02 sunucuları için yapacağız. Aşağıdaki komut ile önce postgresql imizi kuralım.

sudo apt install postgresql-contrib postgresql

sonra aşağıdaki komut ile postgres default userına geçelim. şifrede “postgres”

sudo -i -u postgres

Hemen sonrasında psql komutu ile postgreye bağlanalım sorunsuz bağlanabiliyorsak. PostgreSQL imiz çalışıyordur.

psql

Patroni kurulumu

Buraya kadar PostgreSQL imizi kurduk şimdi cluster yapımızı oluşturabilmek için Patroni yi kuruyoruz. Patroni’nin config dosyası clusterın bütün detaylarını içeren bir yml dosyasıdır. Patroni clusterını yönetirken postgresql kullanıcılarına ihtiyaç duyar ilk olarak bu kullanıcıları iki postgresql node unda da belirlemeniz gerekiyor. Hem default kullanıcı olan postgres kullanıcısının şifresini berliliyeceğiz hem de replicator diye yeni bir kullanıcı create edip onu da patroni configinde kullanacağız. En son postgresql bağlantımızı yapmıştık kaldığımız yerden, sırasıyla aşağıdaki komutları çalıştırın.

ALTER USER postgres PASSWORD 'Ab123456';
CREATE USER replicator WITH ENCRYPTED PASSWORD 'Ab123456';

Patroninin bazı postgresql dosyalarına erişebilmesi için bir link oluşturmak gerekiyor, bu link klasörü PostgreSQL versiyonumuza göre değişiklik göstermektedir. aşağıdaki komut ile link için gerekli veriyi alalım.

 ls /usr/lib/postgresql/

Bende dönen klasör 14 isminde ve bende zaten postgreSQL in 14 versiyonunu kullanıyorum ve aşağıdaki komut ile linkimizi oluşturuyoruz.

sudo ln -s /usr/lib/postgresql/14/bin/* /usr/sbin/

Son olarak Patroni’nin data için kullanacağı klasörleri belirleyip gerekli izinleri vermemiz gerekiyor.

sudo mkdir -p /data/patroni
sudo chown -R postgres:postgres /data/
sudo chmod -R 700 /data/

Şimdi artık patroni kurulum komutlarımızı çalıştıralım.

sudo apt install patroni

Kullanıcıları ve klasör izinlerini ayarladık, patroniyi kurduk, şimdi de patroni.yml dosyamızı yazmaya başlayabiliriz.

sudo vi /etc/patroni/config.yml
scope: prodcluster # Cluster ismi
namespace: /db/
name: psqlnode01 # Node ismi

restapi:
    listen: 172.15.1.11:8008 # Node IP'si
    connect_address: 172.15.1.11:8008 # Node IP'si

etcd:
    host: 172.15.1.10:2379 # etcd server IP'si

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 172.15.1.11/0 md5 # psql01 IP'si
    - host replication replicator 172.15.1.12/0 md5 # psql02 IP'si
    - host all all 0.0.0.0/0 md5

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

postgresql:
    listen: 172.15.1.11:5432
    connect_address: 172.15.1.11:5432
    data_dir: /data/patroni # Patroninin kullanacağı data klasörü
    pgpass: /tmp/pgpass
    authentication:
        replication:
            username: replicator
            password: Ab123456
        superuser:
            username: postgres
            password: Ab123456
    parameters:
        unix_socket_directories: '.'

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

PSQLNODE2 için ayarlar

sudo vim /etc/patroni/config.yml

scope: prodcluster # Cluster ismi
namespace: /db/
name: psqlnode02 # Node ismi

restapi:
    listen: 172.15.1.12:8008 # Node IP'si
    connect_address: 172.15.1.12:8008 # Node IP'si

etcd:
    host: 172.15.1.10:2379 # etcd server IP'si

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 172.15.1.11/0 md5 # psql01 IP'si
    - host replication replicator 172.15.1.12/0 md5 # psql02 IP'si
    - host all all 0.0.0.0/0 md5

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

postgresql:
    listen: 172.15.1.12:5432
    connect_address: 172.15.1.12:5432
    data_dir: /data/patroni # Patroninin kullanacağı data klasörü
    pgpass: /tmp/pgpass
    authentication:
        replication:
            username: replicator
            password: Ab123456
        superuser:
            username: postgres
            password: Ab123456
    parameters:
        unix_socket_directories: '.'

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

Cluster’ ımız için tüm ayarlarımızı yaptık, şimdide başlatma sırası.

sudo systemctl daemon-reload
sudo systemctl enable patroni
sudo systemctl enable postgresql
sudo systemctl start patroni
sudo systemctl start postgresql

Artık sona doğru geliyoruz, şimdide HAProxy mizi yapılandıralım. şimdi tekrar HAProxy için etcd sunucumuza bağlanıyoruz.

HAProxy Ayarları

Şimdi önce aşağıdaki komut ile bir config dosyamızın yedeğini alıyoruz.

sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

HAProxy node’unda gerekli config dosyasını düzenleyeceğiz. Ben configimde database endpoint için 50001 portunu kullandım siz değiştirebilirsiniz.

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 *:50001
    option httpchk
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server psqlnode01 172.15.1.11:5432 maxconn 100 check port 8008
    server psqlnode02 172.15.1.12:5432 maxconn 100 check port 8008

Config dosyamızı düzenledikten sonra HAProxy servisimizi restart edelim.

sudo systemctl restart haproxy

https://172.15.1.10:7000 adresine giderek Cluster yapımızı kontrol ediyoruz, ve Voala clusterımız aktif ve sorunsuz çalışıyor. Node2 nin down görünmesi çalışmamasından değil, aktif node pasif node durumundan kaynaklanan bir olay.

Bir yanıt yazın