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