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.
Sunucular | Uygulamalar | IP |
etcd | etcd, HAProxy | 172.15.1.10 |
psqlnode01 | patroni, Postgresql | 172.15.1.11 |
psqlnode02 | patroni, Postgresql | 172.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.