Bu makalede debian 11 üzerinde pgsql 14 sürümünü HA yapı ile kurulum ve konfigürasyonunu yapacağız.
Bu yapıda pgsql, patroni, etcd ve ha proxy servislerini kullanacağız.
Genel olarak kullanacağımız servisler ve sunucular ;
1.server- pgsql için 1.nodemuz
2.server- pgsql için 2.nodemuz
3.server- etcd ve ha proxy için kullacağımız makinamız
Etcd ve ha proxy için ayrı makinalarda kurabilirsiniz, ben test için kurduğum için bu şekilde yaptım.
Öncelikle kafa karışıklığı olmaması adına makinalarıma hostname vereceğim ve hosts dosyalarını güncelleyeceğim. Benim yapım ;
yk-psql-node1 ipadresim1
yk-psql-node2 ipadresim2
yk-etcd-HA ipadresim3
Bu şekilde /etc/hosts
dosyalarımızı güncelliyoruz.
PGSQL SUNUCULARIMIZ İÇİN KURULUM ADIMLARI ;
PostgreSQL Kurulumu;
apt-get update -y && apt-get install -y gnupg2 -y
sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt-get update -y
apt-get install postgresql-14 postgresql-server-dev-14 -y
Pgsql kurulumunu yaptıktan sonra bu servisleri patroni devir alacağı için pgsql servislerini disable ediyorum ;
systemctl stop postgresql
systemctl disable postgresql
Patroni kurulumuna geçelim ;
Patroniyi kurduğumuzda, yukarıdaki kurduğumu pgsqlin toollarını kullanması gerekir. Bahsettiğimiz toolar default olarak ” /usr/lib/postgresql/versin/bin ” bu dizin altındadır.
Bunun içinde bir symlik oluşturalım ;
ln -s /usr/lib/postgresql/14/bin/* /usr/sbin/
Farklı bir version vs. kurduysanız path sizde farklı olabilir dikkat etmeniz gerekiyor.
Bu arada patroni dediğimiz şey, pgsql için bir cluster yönetim aracıdır. Dil olarak python kullanır. SQL sunucularınızı master ve replike olarak kullanmanıza olanak sağlar.
Kuralım ;
apt -y install python3 python3-pip
pip install --upgrade setuptools
pip install psycopg2
pip install patroni
pip install python-etcd
Şimdi 2 adet pgsql sunucumuz içinde bu işlemleri yaptık, pgsql ve patroni kurduk. Şimdi patroni için iki sunucu içinde ayrı ayrı bir config yapacağız.
Conf dosyamızı açıyoruz/oluşturuyouz;
nano /etc/patroni.yml
1.node server için ;
yk-psql-node1:
scope: postgres
namespace: /db/
name: yk-psql-node1
restapi:
listen: node1-ipadresim:8008
connect_address: node1-ipadresim:8008
etcd:
host: etcd-ve-HA-serverIP: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 replicauser 127.0.0.1/32 md5
- host replication replicauser node1-ipadresim/32 md5
- host replication replicauser node2-ipadresim/32 md5
- host all all 0.0.0.0/0 md5
users:
admin:
password: admin
options:
- createrole
- createdb
postgresql:
listen: node1-ipadresim:5432
connect_address: node1-ipadresim:5432
data_dir: /psql/data
pgpass: /tmp/pgpass
authentication:
replication:
username: replicauser
password: q1w2e3r4!!
superuser:
username: postgres
password: r4e3w2q1**
parameters:
unix_socket_directories: '.'
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
Değişken olan kısımları zaten farklı renk ile belli ettim. Ben 2 nodelu bir yapı kuracağım. Yukarıdaki örnek conf 1.node um içindi. Aynısını alıp 2. sunucum içerisinde yapacağız. Sunucu ip adresi ve name kısımlarını değiştireceğiz.
Ek değiştirilebilir kısımlar olarak;
Ben datalarımı /psql/data/
dizininde tutmak istediğim için o şekilde belirledim, siz değiştirebilirsiniz. Replica ve postgres user pass kısmını değiştirebilirsiniz. Pg_hba kısımlarında da nodelarınızın ip adresinin olmasa dikkat etmeniz gerekiyor. User o ip adresinden bağlanabilmesi için bu izni vermeniz gerekiyor.
Yukarıda bahsettiğim verileri tutacağım dizini oluşturuyorum ;
mkdir -p /psql/data
ve sahipliğiniz postgres e veriyorum ;
chown postgres:postgres /psql/data
Şimdi patroni için sunucuda bir servis oluşturalım ;
nano /etc/systemd/system/patroni.service
Aşağıdaki parametreleri ekleyelim.
[Unit]
Description=High availability PostgreSQL Cluster
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
systemctl daemon-reload
systemctl enable patroni
Etcd kurulumuna geçelim ;
Etcd patroni tarafında büyük önem taşır. Etcd servisine bir şey olması demek, HA yapınızında aslında hizmet verememesi anlamına gelir. Etcd bir key-value depolama yazılımıdır. Patroni içerisindeki nodelardan sorumludur ve bir problem olması durumunda hangi node’un ayakta olup hizmet verebilmesine karar verir.
apt install etcd -y
Editör ile açalım ;
nano /etc/default/etcd
Açtığınızda zaten içeride geçerli bir conf olmacaktır, aşağıdaki parametreleri, ip adreslerini kendi sunucu ip adresinize göre düzenleyip ekleyin.
ETCD_LISTEN_PEER_URLS="http://etcd-HA-ServerIPAdresiniz:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://etcd-HA-ServerIPAdresiniz:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://etcd-HA-ServerIPAdresiniz:2380"
ETCD_INITIAL_CLUSTER="default=http://etcd-HA-ServerIPAdresiniz:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://etcd-HA-ServerIPAdresiniz:2379"
ETCD_INITIAL_CLUSTER_TOKEN="yk-etcd-ha"
ETCD_INITIAL_CLUSTER_STATE="new"
systemctl restart etcd
Sona yaklaşıyoruz,
Pgsql sunucularında patroniyi startlayalım ;
systemctl start patroni
Durumunu kontrol edelim ;
systemctl status patroni
Bir problem yok ise ha proxy kurulumuna geçelim hemen.
HA Proxy Kurulumu ;
Ha proxy nedir ; aslında birden fazla amaç için kullanılır. HA , load balancer , proxy vb. amaçlar için kullanılır.
apt-get install haproxy -y
Kuralım ve editör ile açalım ;
nano /etc/haproxy/haproxy.cfg
Aşağıdaki config full içerik değildir. Sizin confunuz ile ilgili kısımlardaki parametleri karşılaştırıp, olmayanları ekleyip, eğer mevcutta var ise düzenlemelisiniz.
global
maxconn 100
defaults
log global
mode tcp
retries 2
timeout connect 4s
timeout client 30m
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 yk-psql-node1 node1ipadresimiz:5432 maxconn 100 check port 8008
server yk-psql-node2 node2ipadresimiz:5332 maxconn 100 check port 8008
/usr/sbin/haproxy -c -V -f /etc/haproxy/haproxy.cfg
komutu ile conf dosyamızı doğruluyoruz.
Ek olarak yukarıdaki configde mode kısmın tcp yaptığımız için config dosyanızın içerisinde ” option httplog ” parametresi var ise onu #’leyebilirsiniz.
Her şey tamam ise restartlayalım > systemctl restart haproxy
Hadi PGSQL HA yapımıza bakalım ;
http://etcd_ha_serveripadresiniz:7000
ile tarayıcı ile bağlanın.
İşlem tamadır, test için node1 sunucumuzda ” systemctl stop patroni
” stop ederek, sayfamızı refresh edip test edebilirsiniz. Node2 kendini master olarak çalıştırmaya başlayacaktır.
Tabi postgresql’e bağlanmak içinde ” haserveripadresiniz:5000
” portunu kullanmanız gerekiyor. Yapı her taraftan daha da geliştirilebilir tabi bu en basit seviyesi diyebiliriz.
Postgre sunucunuz içinde tuning yapmanızı öneririm, referans olarak ;
https://pgtune.leopard.in.ua/ burayı kullanabilirsiniz, kendi değerlerinizi girerek config alabilirsiniz. Çok yardımı olacaktır.
Saygılar, sevgiler.