Sales5 min read1119 words

تثبيت العقدة العالية الاتاحة (HA) لـ PostgreSQL باستخدام Patroni

Fatih Çevik

Fatih Çevik

PlusClouds Author

Cloud & SaaS

PostgreSQL açık kaynak kodlu, çok yönlü ve dünyadaki en yaygın veritabanı sistemlerinden biridir. Her ne kadar çok yönlü ve yaygın olsa da Yüksek Erişilebilirlik(HA) için bir çözüm sunmamaktadır.

Patroni Nedir ?

Patroni yüksek erişilebilir PostgreSQL clusterlarının kurulumlarını, yönetimlerini vb. süreçleriniz otomatize edebileceğiniz bir cluster manager aracıdır. Python diliyle yazılmıştır ve maksimum erişilebilirlik için etcd kullanır. Ek olarak Patroni veritabanı replikasyonu, backup ve konfigürasyon restore etme konularında da yeteneklidir.

PostgreSQL Cluster Ana Bileşenleri

  • Patroni : Yüksek erişilebilir PostgreSQL clusterlarının konfigürasyonu için template sağlar.

  • ETCD : PostgreSQL clusterının anlık durumunu saklar. Eğer herhangi bir PostgreSQL node'unuzda değişilik olursa Patroni , ETCD içerisinde saklanan key-value değerini günceller. ETCD bu bilgiyi cluster içindeki master node seçimi için kullanır ve clusterı devamlı ayakta tutar.

  • HAProxy : Master/Slave nodelar arasındaki değişiklikleri takip eder ve herhangi bir clienttan istek geldiğinde master node üzerinde bağlantıyı gerçekleştirir.

Bu yazımızda Ubuntu 20.04 işletim sistemi üzerinde Patroni ile 4 adet node bulunduran cluster kurulumu gerçekleştireceğiz.

Aşağıdaki adımları hiç birini atlamadan takip edin ve kendi node bilgilerinize göre gereken güncellemeleri yapın .

Servers Application IP Address
node1 Postgres, Patroni 10.0.0.1
node2 Postgres, Patroni 10.0.0.2
node3 etcd 10.0.0.3
node4 HAProxy 10.0.0.4

1. PostgreSQL Kurulumunu Gerçekleştirin

İlk olarak yapmanız gereken node1 ve node2 üzerinde PostgreSQL kurulumunu gerçekleştirmek. Aşağıdaki komut ile kolayca PostgreSQL kurulumunu gerçekleştirin.

apt install postgresql postgresql-contrib -y

Kurulumdan sonra aşağıdaki komut ile bütün node'larda PostgreSQL servisini durdurun.

systemctl stop postgresql

Sıradaki adımda, /usr/lib/postgresql/12/bin/ ile /usr/sbin dizinleri arasında symlink'e ihtiyacınız var çünkü Patroni tarafından ihtiyaç duyulan araçlar bu dizinde bulunmakta. Aşağıdaki komut ile işlemi gerçekleştirin.

ln -s /usr/lib/postgresql/12/bin/* /usr/sbin/

2. Patroni, ETCD ve HAProxy Kurulumlarını Gerçekleştirin

İlk olarak, node1 ve node2 üzerinde gerekli paketlerin yüklemesini aşağıdaki komut ile gerçekleştirin.

apt -y install python3-pip python3-dev libpq-dev

Şimdi PIP güncel sürüm yükseltmesini aşağıdaki komut ile gerçekleştirin.

pip3 install --upgrade pip

Son olarak, PIP komutunu kullanarak node1 ve node2 üzerinde Patroni ve diğer gereksinimlerin kurulumunu gerçekleştirin.

pip install patroni

pip install python-etcd

pip install psycopg2

Şu anda Patroni node1 ve node2 makineleri üzerinde kurulmuş durumda.

Şimdi ETCD servisimizin çalışacağı node3 makinesine ulaşın ve aşağıdaki komut ile kurulumu gerçekleştirin.

apt -y install etcd

Kurulumun bitmesinin ardından node4 makinesine giriş yapın ve HAproxy servisini aşağıdaki komut ile yükleyin.

apt -y install haproxy

3. ETCD ve Patroni Konfigürasyonlarını Düzenleyin

ETCD ana konfigürasyon dosyası aşağıdaki dizinde bulunmaktadır .

/etc/default/etcd

Nano editör ile konfigürasyon dosyasını düzenleyin.

nano /etc/default/etcd

Aşağıdaki konfigürasyonları ekleyin. Kendi IP bilgilerinize göre güncellemeyi unutmayın .

    ETCD_LISTEN_PEER_URLS  =  "http://10.0.0.3:2380,http://127.0.0.1:7001"   
ETCD_LISTEN_CLIENT_URLS = "http://127.0.0.1:2379, http://10.0.0.3379"
ETCD_INITIAL_ADVERTISE_PEER_URLS = "http://10.0.0.3:2380"
ETCD_INITIAL_CLUSTER = "etcd0=http://10.0.0.3:2380"
ETCD_ADVERTISE_CLIENT_URLS = "http://10.0.0.3:2379"
ETCD_INITIAL_CLUSTER_TOKEN = "node1"
ETCD_INITIAL_CLUSTER_STATE = "new"

Konfigürasyon dosyasını düzenleyip ETCD servisini yeniden başlatın.

systemctl restart etcd

Aşağıdaki komut ile servis durumunu görüntüleyebilirsiniz.

systemctl status etcd

Şimdi node1 ve node2 için patroni.yml dosyası oluşturmanız gerekiyor. Node1 üzerinde aşağıdaki komut ile yeni bir patroni.yml dosyası oluşturup sıradaki konfigürasyonları ekleyin.

nano /etc/patroni.yml

    scope:   postgres 
namespace: /db/
name: postgresql0

restapi:
listen: 10.0 .0 .1 : 8008
connect_address: 10.0 .0 .1 : 8008

etcd:
host: 10.0 .0 .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.0 .0 .1 / 0 md5
- host replication replicator 10.0 .0 .2 / 0 md5
- host all all 0.0 .0 .0 / 0 md5

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

postgresql:
listen: 10.0 .0 .1 : 5432
connect_address: 10.0 .0 .1 : 5432
data_dir: /mnt/ patroni
pgpass: /tmp/ pgpass
authentication:
replication:
username: replicator
password: "Strong Password"
superuser:
username: postgres
password: "Strong Password"
parameters:
unix_socket_directories: '.'

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

Dosyayı kaydedin, ardından Patroni için bir data dizini oluşturun ve sahipliğini düzenleyin.

   
mkdir -p /mnt/ patroni
chown postgres:postgres /mnt/ patroni
chmod 700 /mnt/ patroni

Ardından Node2 üzerinde aşağıdaki benzer işlemleri gerçekleştirin.

nano /etc/patroni.yml

Aşağıdaki konfigürasyonları ekleyin.

     
scope: postgres
namespace: /db/
name: postgresql1

restapi:
listen: 10.0 .0 .2 : 8008
connect_address: 10.0 .0 .2 : 8008

etcd:
host: 10.0 .0 .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.0 .0 .1 / 0 md5
- host replication replicator 10.0 .0 .2 / 0 md5
- host all all 0.0 .0 .0 / 0 md5

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

postgresql:
listen: 10.0 .0 .2 : 5432
connect_address: 10.0 .0 .2 : 5432
data_dir: /mnt/ patroni
pgpass: /tmp/ pgpass
authentication:
replication:
username: replicator
password: "Strong Password"
superuser:
username: postgres
password: "Strong Password"
parameters:
unix_socket_directories: '.'

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

Kaydedin ve Node1 üzerinde de yaptığınız gibi data dizini oluşturun.

   
mkdir -p /mnt/ patroni
chown postgres:postgres /mnt/ patroni
chmod 700 /mnt/ patroni

Patroni İçin Systemd Dosyası Oluşturun.

Node1 ve Node2 üzerinde Patroni servisini yönetmek için aşağıdaki servis dosyasını oluşturun.

nano /etc/systemd/system/patroni.service

Aşağıdaki konfigürasyonları ekleyin.

   
[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

Dosyayı kaydedin ve ardından aşağıdaki komutu çalıştırın.

systemctl daemon-reload

Şimdi Node1 ve Node2 üzerinde Patroni servisini çalıştırın. DİKKAT EDİN YALNIZCA PATRONI .

systemctl start patroni

Patroni servisinin durumunu aşağıdaki komutla kontrol edebilirsiniz.

systemctl status patroni

Yalnızca Patroniyi çalıştırma sebebimize gelecek olursak, Konfigürasyonlardan da gördüğünüz üzere Patroni PostgreSQL ile aynı porta bind edili durumda ve kendine ait farklı bir data dizini ile konfigürasyonları mevcut. Bu da Postgresql servisini patroni üzerinden kullandığımız anlamına geliyor. Yani özetleyecek olursak postgresql ve patroni bir arada çalışıyor olursa 5432 portundan bağlandığınızda replikasyon işlemi gerçekleşmemiş olacak çünkü postgresql data dizini üzerinden bağlanıyor olacaksınız.

4. HAProxyi Konfigürasyonunu Düzenleyin

Node4 üzerinde HAProxy ana konfigürasyonunu aşağıdaki şekilde düzenleyin.

nano /etc/haproxy/haproxy.cfg

Standart konfigürasyonu kaldırın ve aşağıdaki şekilde güncelleyin

   
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 *:5000
option httpchk
http-check expect status 200
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server postgresql1 10.0.0.1:5432 maxconn 100 check port 8008
server postgresql2 10.0.0.2:5432 maxconn 100 check port 8008

Dosyayı kaydedin ve HAProxy servisini yeniden başlatın.

systemctl restart haproxy

Durumunu doğrulamak için aşağıdaki komutu kullanabilirsiniz.

systemctl status haproxy

5. PostgreSQL Clusterına Erişin

Artık postgresql clusterınız kullanıma hazır. http://10.0.0.4:7000 adresi üzerinden cluster durumunuzu görüntüleyebilir ve 5432 portundan veritabanınıza bağlanarak replikasyon kontrol testlerinizi gerçekleştirebilirsiniz. Bir sonraki yazımızda da Nginx ile clusterınıza nasıl domain tanımlayacağınızı anlatacağız . Görüşmek üzere :)

Frequently Asked Questions

Patroni nedir ve PostgreSQL HA ile nasıl çalışır?

Patroni yüksek erişilebilir PostgreSQL clusterlarının kurulumlarını ve yönetimlerini otomatikleştiren bir cluster manager aracıdır. Python diliyle yazılmıştır ve maksimum erişilebilirlik için etcd kullanır; ayrıca veritabanı replikasyonu, backup ve konfigürasyon restore etme konularında yeteneklidir.

PostgreSQL cluster ana bileşenleri nelerdir ve her biri ne işe yarar?

Patroni, yüksek erişilebilir PostgreSQL clusterlarının konfigürasyonu için template sağlar. ETCD, PostgreSQL clusterının anlık durumunu saklar ve Patroni bu bilgiyi master node seçimi için kullanır. HAProxy ise Master/Slave nodeları arasındaki değişiklikleri takip eder ve isteği master node üzerinden yönlendirir.

Patroni ile 4 nodluk bir cluster kurulumunda hangi temel adımlar izlenir?

Bu yazıda Ubuntu 20.04 üzerinde dört nodlu bir cluster kurulumu örneği verilmiştir; önce node1 ve node2 üzerinde PostgreSQL kurulumu yapılır, ardından Patroni, ETCD ve HAProxy kurulumu gerçekleştirilir. Sonrasında ETCD’nin node3 üzerinde, HAProxy’nin ise node4 üzerinde çalışması için adımlar uygulanır.

ETCD konfigürasyonu hangi dosyada bulunur ve hangi ayarlar değiştirilir?

ETCD ana konfigürasyon dosyası /etc/default/etcd'dir. Burada ETCD_LISTEN_PEER_URLS, ETCD_LISTEN_CLIENT_URLS, ETCD_INITIAL_ADVERTISE_PEER_URLS, ETCD_INITIAL_CLUSTER, ETCD_ADVERTISE_CLIENT_URLS, ETCD_INITIAL_CLUSTER_TOKEN ve ETCD_INITIAL_CLUSTER_STATE gibi ayarları kendi IP bilgilerinizle güncellemelisiniz ve ardından ETCD servisini yeniden başlatmalısınız.

Patroni için patroni.yml nasıl hazırlanır ve hangi bölümler içerir?

Patroni için Node1 ve Node2 üzerinde patroni.yml dosyası oluşturulur ve içinde scope, namespace, name, restapi, etcd, bootstrap, initdb, pg_hba ve postgresql gibi bölümler yer alır. Bu yapılar clusterin adı, REST API adresi, ETCD ile ilgili ayarlar ve PostgreSQL başlangıç konfigürasyonlarını belirler.

Patroni için sistemd hizmeti nasıl kurulur ve başlatılır?

Node1 ve Node2 üzerinde Patroni hizmetini yönetmek için /etc/systemd/system/patroni.service dosyası oluşturulur ve ExecStart olarak /usr/local/bin/patroni ile /etc/patroni.yml kullanılır. Ardından systemctl daemon-reload komutu ile yeniden yüklenir ve systemctl start patroni ile başlatılır.

HAProxy konfigürasyonu nasıl düzenlenir ve PostgreSQL bağlantısı nasıl yönlendirilir?

Node4 üzerinde /etc/haproxy/haproxy.cfg dosyasını açıp standart konfigürasyonu kaldırarak verilen yapı ile güncellemeniz gerekir; PostgreSQL için listen/postgresql server satırları ve sağlık kontrolleri eklenir. Ardından HAProxy servisini yeniden başlatıp durumunu systemctl status haproxy ile kontrol edebilirsiniz.

PostgreSQL clusterına nasıl erişilir ve hangi URL üzerinden durum kontrolü yapılır?

Cluster kullanıma hazır hale geldiğinde http://10.0.0.4:7000 adresinden cluster durumunu görüntüleyebilir ve 5432 portundan veritabanınıza bağlanarak replikasyon testlerini gerçekleştirebilirsiniz.