Sales5 min read1119 words

Installatie van PostgreSQL Hoge Beschikbaarheid (HA) Cluster met 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 clusterlarındaki rolü nedir?

Patroni Python ile yazılmış bir cluster yöneticisidir ve yüksek erişilebilir PostgreSQL clusterlarının kurulumu, yönetimi ve otomasyonunu sağlar. etcd kullanarak master seçimini gerçekleştirir ve konfigürasyonlar arasındaki tutarlılığı sağlar; ayrıca veritabanı replikasyonu, yedekleme ve konfigürasyon kurtarma konularında da yeteneklidir.

ETCD'in PostgreSQL clusterındaki rolü nedir?

ETCD clusterın anlık durumunu saklar; herhangi bir node'da değişiklik olduğunda Patroni ETCD içindeki değerleri günceller. ETCD bu bilgiyi master node seçimi için kullanır ve clusterı ayakta tutar.

HAProxy bu kurulumda hangi görevi üstlenir?

HAProxy master/slave değişikliklerini izler ve gelen istemci isteklerini master node üzerinden bağlar, böylece veritabanı erişimini tek bir noktadan sağlar.

Bu kurulumu hangi ana adımlar takip eder?

Başlangıç olarak node1 ve node2 üzerinde PostgreSQL kurulumu yapılır. Ardından ETCD, Patroni ve HAProxy kurulumları gerçekleştirilir ve konfigürasyonlar düzenlenir. Patroni için gerekli systemd servisleri oluşturulur ve son olarak HAProxy konfigürü güncellenir; ardından cluster erişimi sağlanır.

PostgreSQL servisini neden durdurmalısınız ve nasıl devam etmelisiniz?

Kurulumdan önce bütün nodlarda PostgreSQL servisini durdurun. Bu adım Patroni yönetimine geçiş için gerekli olan uyum adımlarını kolaylaştırır.

ETCD ve Patroni konfigürasyon dosyaları nasıl düzenlenir?

ETCD ana konfigürasyon dosyası /etc/default/etcd'dir ve nano ile düzenlenir. Etkin konfigürasyonda ETCD_LISTEN_PEER_URLS, ETCD_LISTEN_CLIENT_URLS, ETCD_INITIAL_ADVERTISE_PEER_URLS, ETCD_INITIAL_CLUSTER, ETCD_ADVERTISE_CLIENT_URLS ve ETCD_INITIAL_CLUSTER_STATE gibi ayarlar bulunur; düzenleme tamamlandıktan sonra ETCD servisini yeniden başlatın.

Patroni için systemd servis dosyası nasıl oluşturulur ve başlatılır?

Node1 ve Node2 üzerinde Patroni için bir systemd servis dosyası oluşturulur ve üzerinde ExecStart olarak /usr/local/bin/patroni /etc/patroni.yml kullanılır. Dosya kaydedildikten sonra systemctl daemon-reload komutu ile yüklenen servisi etkinleştirip systemctl start patroni komutu ile başlatılır.

PostgreSQL clusterına nasıl erişilir ve hangi testler yapılabilir?

Artık cluster kullanıma hazırdır; http://10.0.0.4:7000 adresinden cluster durumunu görüntüleyebilirsiniz ve 5432 portundan veritabanınıza bağlanarak replikasyon testlerinizi gerçekleştirebilirsiniz.