DatabaseLinux

Patroni ilə Postgresql HA cluster qurulması

Patroni ilə Postgresql HA Cluster qurulması – Ubuntu 20.04

Salam əziz oxucular, bu gün sizinlə 4 node-dan ibarət yüksək əlçatan PostgreSQL klasterini qurmaq üçün aşağıdakı addımları izləmək lazımdır. Bu prosesdə PostgreSQL, Patroni, ETCD və HAProxy kimi vasitələrdən istifadə olunur.PostgreSQL açıq mənbə və məşhur verilənlər bazasıdır. Bununla belə, yüksək əlçatanlıq üçün heç bir xüsusiyyəti yoxdur. Burada ən çox istifadə edilən həll Patronidir. Patroni, yüksək əlçatan PostgreSQL klasterlərinin yerləşdirilməsi və saxlanmasını fərdiləşdirmək və avtomatlaşdırmaq üçün istifadə olunan klaster meneceri vasitəsidir. Python-da yazılmışdır və yüksək əlçatanlıq üçün paylanmış konfiqurasiya mağazası kimi etcd, Consul və ZooKeeper istifadə edir. Bundan əlavə, Patroni verilənlər bazası replikasiyasını, backup  çıxara və konfiqurasiyaları bərpa edə bilər. Bu yazıda 4 serverdən ibarət bir klaster quraşdıracağıq, ancaq istəsəniz Postgresql nodlarını ehtiyaclarınıza uyğun artıra bilərsiniz.

Quraşdırmaq üçün tələb olunanalar

4 Ubuntu 20.04 Server
SSH vasitəsilə serverlərin bir-birinə tam görə bilsinlər. (SSH key trust)

Server    Yüklenəcək proqramlar              IP
psql01     Postgresql, Patroni           172.16.16.101
psql02      Postgresql, Patroni          172.16.16.102
etcd        etcd                         172.16.16.103
haproxy     HAProxy                      172.16.16.104

ETCD qurulmasına baxaq
Qeyd: Bu quraşdırmanı yalnız etcd üçün göstərilən node üçün edin.

ETCD PostgreSQL klasterinin vəziyyətini saxlayır. Hər hansı PostgreSQL nodun statusunda hər hansı dəyişiklik olduqda, Patroni Patroni ETCD key/value bazasında status dəyişikliyini yeniləyir. ETCD bu məlumatı əsas nodu seçmək üçün istifadə edir və klasterin işləməsini təmin edir.

apt install etcd

etcd qurulması tamamlandıqdan sonra conf faylını yaradaq.

vim /etc/default/etcd

 

ETCD_LISTEN_PEER_URLS="http://172.16.16.103:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://172.16.16.103:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.16.103:2380"
ETCD_INITIAL_CLUSTER="default=http://172.16.16.103:2380,"
ETCD_ADVERTISE_CLIENT_URLS="http://172.16.16.103:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

vim ilə conf faylını redaktə edin  və onu ETCD maşın IP-yə uyğun olaraq təyin edin. Conf redaktəsi başa çatdıqdan sonra etcd servisini restart edin.

systemctl restart etcd
systemctl status etcd

 

HAProxy qurulmasına baxaq
Qeyd: Bu quraşdırmanı yalnız haproxy üçün müəyyən edilmiş nod üçün edin.

HAProxy Master/Slave nodlarında dəyişiklikləri izləyir və kilent bağlantı tələb etdikdə clienti müvafiq master node-a yönləndirir.

apt install haproxy

HAProxy quraşdırıldıqdan sonra postgresql və patroni tərəfinə keçəcəyik. Patroni, postgresql quraşdırıldıqdan sonra nəhayət HAProxy konfiqurasiyasını edəcəyik.

Patroni və postgresql quraşdırılması
Qeyd: Bu quraşdırmanı yalnız postgresql üçün müəyyən edilmiş nodlar üçün edin.

 Patroninin quraşdırılması üçün tələb olunan komandalara baxaq

apt install python3-pip python3-dev libpq-dev -y
pip3 install --upgrade pip
pip install patroni
pip install python-etcd
pip install psycopg2

Biz lazım olan bütün infrastrukturun quraşdırılmasını tamamladıq. Buradan biz klasterimizi yaradıb onun parametrlərini edəcəyik.

Patroniy konfiqurasiyası
Qeyd: Bu əməliyyatları Postgresql və Patroninin quraşdırıldığı bütün nodlarda yerinə yetirin.

Patroninin konfiqurasiya faylı klasterin bütün detallarını özündə əks etdirən  yml faylıdır. Patroni klasterini idarə edərkən sizə Postgresql userləri lazımdır. Əvvəlcə bu userləri hər iki Postgresql nodunda göstərməlisiniz. Defolt user olan postgres userinin parolunu təyin edəcəyik və replicator adlı yeni istifadəçi yaradıb onu patroni konfiqurasiyasında istifadə edəcəyik. Aşağıdakı komandaları bir-bir yerinə yetirin.

su - postgres
psql
ALTER USER postgres PASSWORD 'sifre123';
CREATE USER replicator WITH ENCRYPTED PASSWORD 'Salam321';

Patroninin  bəzi postgre sql fayllarına  giriş etməsi üçün bir link yaratmaq lazımdır.Aşağıdakı komandanı hər iki Postgre nod-una tətbiq edin

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

Nəhayət, biz Patroninin data üçün istifadə edəcəyi folderləri müəyyənləşdirməli və lazımi icazələri verməliyik.

mkdir -p /data/patroni
chown -R postgres:postgres /data/
chmod -R 700 /data/

 

Userləri və folderləri yaratdıqdan və lazımi icazələri verdikdən sonra patroni.yml faylımızı yazmağa başlaya bilərik.

PSQL01 Node-a qoşulub işlərimizə başlayaq.

vim /etc/patroni.yml

 

scope: prodcluster # Cluster adı
namespace: /db/
name: prodpsql01 # Node adı

restapi:
listen: 172.16.16.101:8008 # Node IP'si 
connect_address: 172.16.16.101:8008 # Node IP'si

etcd:
host: 172.16.16.103: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.16.16.101/0 md5 # psql01 IP'si
- host replication replicator 172.16.16.102/0 md5 # psql02 IP'si
- host all all 0.0.0.0/0 md5

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

postgresql:
listen: 10.90.214.183:5432
connect_address: 10.90.214.183:5432
data_dir: /data/patroni # Patroninin istifadə edəcəyi data folderi
pgpass: /tmp/pgpass
authentication:
replication:
username: replicator
password: sifre123
superuser:
username: postgres
password: sifre321
parameters:
unix_socket_directories: '.'

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

 

PSQL02 Node-a qoşulub işlərə başlayaq.

vim /etc/patroni.yml

 

scope: prodcluster # Cluster adı
namespace: /db/
name: prodpsql01 # Node adı 

restapi:
listen: 172.16.16.102:8008 # Node IP'si 
connect_address: 172.16.16.102:8008 # Node IP'si

etcd:
host: 172.16.16.103: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.16.16.102/0 md5 # psql01 IP'si
- host replication replicator 172.16.16.101/0 md5 # psql02 IP'si
- host all all 0.0.0.0/0 md5

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

postgresql:
listen: 10.90.214.183:5432
connect_address: 10.90.214.183:5432
data_dir: /data/patroni # Patroninin istifadə edəcəyi data folderi
pgpass: /tmp/pgpass
authentication:
replication:
username: replicator
password: sifre123
superuser:
username: postgres
password: sifre321
parameters:
unix_socket_directories: '.'

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

 

Patroni üçün lazım olan yml faylını yazdıqdan sonra Patronini Linux servisinı çevirmək üçün servis faylı yaratmalıyıq. Bunu hər iki postgresql nod-unda edin.

vim /etc/systemd/system/patroni.service
[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.target

 

Bütün ayarları etdik, indi klasteri işə sala bilərik.

systemctl daemon-reload
systemctl enable patroni # Patroni servisinin server başlayanda işə düşməsi üçünn.
systemctl enable postgresql
systemctl start patroni
systemctl start postgresql

Postgresql clasterimiz hazırdır. İndi biz HAProxy konfiqurasiyasını bitirəcəyik və Clasterimiz üçün verilənlər bazamızın son nöqtəsini alacağıq.

 

HAProxy-un konfiqurasiyası
HAProxy node-da lazımi konfiqurasiya faylını redaktə edəcəyik. Konfiqurasiyamda verilənlər bazası son nöqtəsi üçün 5000 portundan istifadə etdim, siz onu dəyişə bilərsiniz.

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 PSQL01 172.16.16.101:5432 maxconn 100 check port 8008
server PSQL02 172.16.16.102:5432 maxconn 100 check port 8008

Konfiqurasiyanı bu şəkildə  yadda saxlayın, çıxın və HAProxy servisini yenidən başladın.

systemctl restart haproxy

 

HAProxy konfiqurasiyası tamamlandıqdan sonra http://haproxy_ip:7000 URL-dən haproxy status səhifəsinə daxil olaq və clasterə baxaq.

Claster nodlarımız şəkildə göründüyü kimi siyahıya alınmışdır. Siyahıda görünən PSQL02 nodu Master/Slave strukturu ilə bağlıdır və xəta deyil.

Quraşdırmanı başa çatdırdıq və indi hər şey hazırdır və işləyir. İndi verilənlər bazası portu kimi haproxy_ip:5000 istifadə edə bilərsiniz. Patronictl istifadə edərək clasterimizi nəzərdən keçirək.

patronictl -c /etc/patroni.yml list

 

Related Articles

Bir cavab yazın

Sizin e-poçt ünvanınız dərc edilməyəcəkdir. Gərəkli sahələr * ilə işarələnmişdir

Back to top button