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
Bu url ile http://: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.


Top comments (0)