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.
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
2. PostgreSQL Servisini Durdur
systemctl stop postgresql
3. Kısayol Oluştur
sudo ln -s /usr/lib/postgresql/14/bin/* /usr/sbin/
4. Python ve PostgreSQL Bağımlılıları Kurulumu
sudo apt install python3-pip python3-dev libpq-dev -y
5. Pip Paket Yöneticisini Güncelle
sudo pip3 install --upgrade pip
pip3 install --upgrade pip
6. Patroni Kur
sudo pip install patroni
pip install patroni
7. Etcd İçin Python Modülü Kur
sudo pip install python-etcd
8. PostgreSQL İçin Psycopg2 Kur
sudo pip install psycopg2
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
10. Patroni Yapılandırması
sudo nano /etc/patroni.yml
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
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
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/
12. Dizin Sahipliğini PostgreSQL Kullanıcına Vermek
sudo chown postgres:postgres /dev/data/patroni/
13. İzinlerin Düzenlenmesi
sudo chmod 700 /dev/data/patroni/
14. Patroni Servislerinin Ayarlanması
sudo nano /etc/systemd/system/patroni.service
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
15. Systemd Daemon'un Yeniden Yüklenmesi
systemctl daemon-reload
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
2. Etcd Servisi Yapılandırması
nano /etc/default/etcd
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"
3. Etcd Servisini Yeniden Başlat
systemctl restart etcd
4. Etcd Servis Durumunu Kontrol Et
systemctl status etcd
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
2. PostgreSQL Servisini Başlat
systemctl start postgresql
Aşağıdaki komutla node'larınızı görüntüleyebilirsiniz.
Patroni Cluster Durumunu Kontrol Et
patronictl -c /etc/patroni.yml list
+ 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 |
+--------+-------------+---------+---------+-----------+
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
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
3. Servisi Yeniden Başlat
systemctl restart haproxy
systemctl status haproxy
4. HAProxy Servisini Görüntülemek
tarayıcıya haproxy'nin kurulu olduğu makinenin ip adresi:7000 ile arayüze erişebilirsiniz.
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.