PostgreSQL-Patroni Yapı Kurulumu (etcd-haproxy-patroni)

Caner AYSAN
8 min readNov 4, 2022

--

Yapının Tanıtılması

Streaming, replication işlemlerini sağlar aynı zamanda Cluster konfigurasyonunuda gerçekleştirir. Mimaride her postgresql instance için bir patroni instance bulunur ve postgresql instance kontrol eder. Patroni topladığı bütün verileri distrubuted bir key-value store’da tutuyor (etcd,zookeper,consul vs.), patroni buraya bakarak primarydeki sorunları görür ve hangi replicanın primary olacağına karar vermesi gibi işlemleri buradaki bilgiler ışında yapacaktır. HA Proxy ise sürekli master node ile iletişim halindedir, master bilgisi için patroni API portu olan 8008’e istek gönderir masterdan gelen cevap 200OK iken diğer nodlardan gelen cevap 503 server unavailable dır. HA proxy bir virtural IP kullanır ve IP üzerinden postgres servislerine bağlantı yapılabilir. Bir arıza durumunda HA Proxy balans sağlayarak hizmetin kesilmesini engellemiş olacaktır buna da keepalived denmektedir.Patroni için iki temel bileşen gerekir;

  • HAProxy : Yük dengelemek ve ölçeklendirilebilme kabiliyetleri için kullanılacak servis.
  • ETCD : Dağınık sistemler mimarisinde cluster yönetimi için kullanılacak servis.
Patroni yapı

192.168.56.102 etcd-01 etcd-01

192.168.56.103 etcd-02 etcd-02

192.168.56.104 etcd-03 etcd-03

192.168.56.107 prd-postgresql-n52 prd-postgresql-n52

192.168.56.108 prd-postgresql-n53 prd-postgresql-n53

192.168.56.109 prd-postgresql-n54 prd-postgresql-n54

192.168.56.105 haproxy-01 haproxy-01

192.168.56.106 haproxy-02 haproxy-02

Gerekli repoların kurulumu ve firewall,selinux’u disable etmek

Alınan klona repo ve etcd, haproxy, patroni ortamlarının kurulumu. Kurulumların bitişinden itibaren her bir etcd için 3 makina, her bir haproxy için 2 makina, her bir patroni için 3 makinanın klonlanması. En son işlem olarak firewall ve selinux disable edilmelidir.

yum install dnfyum install https://download-ib01.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpmdnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpmdnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpmdnf -qy module disable postgresqldnf install -y postgresql13-server postgresql13-devel postgresql13 postgresql13-contribdnf install -y postgresql13-libs postgresql13-docs postgresql13-llvmjit postgresql13-plperldnf -y groupinstall "Development Tools"wget http://repo.boun.edu.tr/centos/7.9.2009/extras/x86_64/Packages/etcd-3.2.28-1.el7_8.x86_64.rpmdnf install -y perl gcc kernel-devel kernel-headers make bzip2dnf install -y rsync mlocate gcc-c++ openssl-devel git glibc glibc-common wget unzip httpd php gd gd-devel perl postfix perl-devel unzipdnf install -y yum-utilsdnf install -y python3-develdnf install -y python3-pipdnf install -y python3-urllib3dnf install wgetwget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/p/python3-psycopg2-2.7.7-2.el7.x86_64.rpmdnf install python3-psycopg2-2.7.7-2.el7.x86_64.rpmyum install libpq5-develdnf -y install langpacks-en glibc-all-langpacks -ydnf -y install glibc-langpack-tr -yyum -y install python3-psycopg2pip3 install psycopg2-binarypip3 install patroni[aws,etcd,consul,zookeeper,kubernetes]python3 -m pip install pg_activity psycopg2-binarysystemctl stop firewalld.servicesystemctl disable firewalld.servicesystemctl status firewalld.servicevi /etc/selinux/config# SELINUX=disabled olmalıdır.

yüklemeler bittikten sonra sistem reboot edilir. Burdan sonra makineler klonlanarak herbirisi için ayrı ayarlar gerekmektedir.

ETCD makinaların kurulumu

1. Etcd için klonlanan her makina için ağ ayarı kontrol edilmelidir eğer ağ ayarı istenilen şekilde değil ise ağ ayarları yapılmalıdır.

2. (Virtualbox > dosya > ana makina ağ yöneticisi > oluştur > oluşturulan adapterin ipv4 ayarı )

3. Ağ ayarı yapıldıktan sonra her bir makina için nmtui aracılığı ile enp0s8 ip ayarı ve hostname ayarı istenilenlere göre yapılmalıdır.

4. Bütün klon makinalar için vi /etc/hosts komutu yardımı ile gerekli hosts ayarı yapılmalıdır.

5. Hosts ayarından sonra root kökte ls komutu yapılır ve etcd-3.2.28–1.el7_8.x86_64.rpm paketi yum install etcd-3.2.28–1.el7_8.x86_64.rpm komutu yardımıyla yüklenir.

6. Kurulum yapıldıktan sonra tüm makinalar için /etc/etcd/etcd.conf dosyasına girerek gerekli conf ayarı yapılmalıdır.

7. Conf dosyası ayarlandıktan sonra etcd.service enable edilir.Başlatılır.

8. etdctl member list ve etcdctl cluster-health komutları yardımı ile etcdlere ait memberların durumu kontrol edilir.

9. NOT >> ilk kurulan etcd makinalarında etcd’yi enable ettikten sonra start etmek için tüm makinalarda eş zamanlı systemctl start etcd dememiz gerekir.

Gerekli olan komut listesi;

nmtui #herbirmakinanın hostname i değiştirilirvi /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.56.102 etcd-01 etcd-01

192.168.56.103 etcd-02 etcd-02

192.168.56.104 etcd-03 etcd-03

192.168.56.105 haproxy-01 haproxy-01

192.168.56.106 haproxy-02 haproxy-02

192.168.56.107 prd-postgresql-n52 prd-postgresql-n52

192.168.56.108 prd-postgresql-n53 prd-postgresql-n53

192.168.56.109 prd-postgresql-n54 prd-postgresql-n54

yum install etcd-3.2.28-1.el7_8.x86_64.rpmvi /etc/etcd/etcd.conf # diğer etcdler için gerekli ip ler değiştirilir.

ETCD_NAME=”etcd-01"

ETCD_DATA_DIR=”/var/lib/etcd”

ETCD_LISTEN_PEER_URLS=”http://0.0.0.0:2380"

ETCD_LISTEN_CLIENT_URLS=”http://0.0.0.0:2379"

ETCD_INITIAL_CLUSTER_TOKEN=”etcd-cluster”

ETCD_INITIAL_CLUSTER=”etcd-01=http://192.168.56.102:2380,etcd-02=http://192.168.56.103:2380,etcd-03=http://192.168.56.104:2380"

ETCD_INITIAL_ADVERTISE_PEER_URLS=”http://192.168.56.102:2380"

ETCD_ADVERTISE_CLIENT_URLS=”http://192.168.56.102:2379"

ETCD_INITIAL_CLUSTER_STATE=”new”

systemctl enable etcd.servicesystemctl start etcd.servicesystemctl status etcd.serviceetcdctl member listetcdctl cluster-health

HAPROXY Makinaların Kurulumu

1. Haproxy için klonlanan her makina için ağ ayarı kontrol edilmelidir eğer ağ ayarı istenilen şekilde değil ise ağ ayarları yapılmalıdır.

2. (Virtualbox > dosya > ana makina ağ yöneticisi > oluştur > oluşturulan adapterin ipv4 ayarı )

3. Ağ ayarı yapıldıktan sonra her bir makina için nmtui aracılığı ile enp0s8 ip ayarı ve hostname ayarı istenilenlere göre yapılmalıdır.

4. Bütün klon makinalar için vi /etc/hosts komutu yardımı ile gerekli hosts ayarı yapılmalıdır.

5. Hosts ayarlandıktan sonra yum install haproxy komutu ile haproxy makinalara kurulmalıdır.

6. Bütün klon makinalar için vi /etc/haproxy/haproxy.cfg komutu yardımı ile gerekli cfg ayarı yapılmalıdır.

7. Conf dosyası ayarlandıktan sonra yum install keepalived komutu ile keepalived makinalara kurulmalıdır.

8. Keepalived kurulduktan sonra vi /etc/keepalived/keepalived.conf komutu ile gerekli conf ayarı yapılmalıdır.

9. Conf dosyaları ayarlandıktan sonra haproxy.service ve keepalived.service enable edilir.Başlatılır.

10. Makinaların birinde haproxy servisi başlayıp diğerinde başlamıyor ve keepalived’a bağlı bir hata alıyorsak

11. Her iki makina için /etc/sysctl.conf dosyasına girip net.ipv4.ip_nonlocal_bind=1 ifadesini eklememiz gerekiyor ve makinaları yeniden başlatmamız lazım.Böylelikle her iki makinada bulunan haproxy servisi ayağa kalkmış oluyor.

12. Gerekli olan komut listesi;

Nmtui #herbirmakinanın hostname i değiştirilir
vi /etc/hosts #host dosyaları hepsinde aynıdır.
yum install haproxy
yum install keepalived
vi /etc/haproxy/haproxy.cfg
###########################
global
maxconn 5000
log 127.0.0.1 local2
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 production
bind 192.168.56.110:5000
option httpchk OPTIONS/master
http-check expect status 200
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server prd-postgresql-n52 192.168.56.107:5432 maxconn 500 check port 8008
server prd-postgresql-n53 192.168.56.108:5432 maxconn 500 check port 8008
server prd-postgresql-n54 192.168.56.109:5432 maxconn 500 check port 8008
listen standby bind 192.168.56.110:5001 option httpchk OPTIONS/replica http-check expect status 200 default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions server prd-postgresql-n52 192.168.56.107:5432 maxconn 500 check port 8008 server prd-postgresql-n53 192.168.56.108:5432 maxconn 500 check port 8008 server prd-postgresql-n54 192.168.56.109:5432 maxconn 500 check port 8008
#########################################################

vi /etc/keepalived/keepalived.conf

vrrp_script chk_haproxy {
script "killall -0 haproxy" # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
}
vrrp_instance VI_1 {
interface enp0s8 # interface to monitor
state MASTER # MASTER on haproxy1, BACKUP on haproxy2
virtual_router_id 51
priority 101 # 101 on haproxy1, 100 on haproxy2
virtual_ipaddress {
192.168.56.110/32 # virtual ip address
}
track_script {
chk_haproxy

vi /etc/sysctl.conf

# sysctl settings are defined through files in

# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.

#

# Vendors settings live in /usr/lib/sysctl.d/.

# To override a whole file, create a new file with the same in

# /etc/sysctl.d/ and put new settings there. To override

# only specific settings, add a file with a lexically later

# name in /etc/sysctl.d/ and put new settings there.

#

# For more information, see sysctl.conf(5) and sysctl.d(5).

net.ipv4.ip_nonlocal_bind=1

systemctl enable haproxy.servicesystemctl enable keepalived.servicesystemctl start haproxy.servicesystemctl start keepalived.servicesystemctl status haproxy.servicesystemctl status keepalived.service

PATRONI Makinaların oluşturulması

1. Patroni için klonlanan her makina için ağ ayarı kontrol edilmelidir eğer ağ ayarı istenilen şekilde değil ise ağ ayarları yapılmalıdır.

2. (Virtualbox > dosya > ana makina ağ yöneticisi > oluştur > oluşturulan adapterin ipv4 ayarı )

3. Ağ ayarı yapıldıktan sonra her bir makina için nmtui aracılığı ile enp0s8 ip ayarı ve hostname ayarı istenilenlere göre yapılmalıdır.

4. Bütün klon makinalar için vi /etc/hosts komutu yardımı ile gerekli hosts ayarı yapılmalıdır.

5. Host ayarı bittikten sonra dnf list patroni komutuyla patronin durumu kontrol edilir. /etc/patroni.yml dosyası oluşturulur, conf dosyası ayarlanarak kaydedilip çıkılır. Bu işlem her makina için (makinaların kendi iplerine uyarlamak kaydıyla)gerçekleştirilir.

6. patroni.yml dosyasının içinde bulunan var/log/patroni bölümü için yeni bir /var/log dizinin altına patroni adında bir dizin oluşturulup dizin kullanıcı yetki işlemleri ayarlanır.

7. Ardından yine .yml dosyasında bulunan data dir bölümü için yeni bir /home/postgres/pg13/data dizini oluşturulup kullanıcı yetki işlemleri ayarlanır.

8. Bu işlem bittikten sonra postgres kullanıcısına bağlanarak oluşturulmuş olan /home/postgres dizinin dosya/dizin izin işlemleri yapılır.

9. Ardından /etc/systemd/system/patroni.service yolu izlenerek bir patroni servis dosyası oluşturulup gerekli servis ayarları yapılır.

10. patroni servisi oluşturulduğunda default olarak ExecStart=/usr/local/bin/patroni olarak gelmektedir. Bizim ayarlarımızda bu durum ExecStart=/usr/bin/patroni bu şekildedir. O yüzden /usr/local/bin/ deki patroni ‘ yi /usr/bin/ dizinine taşımak gerekir.

11. Bu işlemler her üç patroni makinası için geçerlidir. İşlem bittikten sonra sistem daemond edilir, patroni servis enable edilir ve .yml ve patroni.service start denilerek yapı ayağa kaldırılır.

12. NOT >> İzin işlemlerine dikkat edilmelidir.

13. Gerekli olan komut listesi;

nmtuidnf list patronivi /etc/hosts #host dosyaları hepsinde aynı

vi /etc/patroni.yml

cope: prdpgha
namespace: /pg_cluster/
name: prd-postgresql-n52
log:
dir: /var/log/patroni
restapi:
listen: 192.168.56.107:8008
connect_address: 192.168.56.107:8008
etcd:
hosts: 192.168.56.102:2379,192.168.56.103:2379,192.168.56.104:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
listen_addresses: '*'
hot_standby: "on"
max_connections: 1050
superuser_reserved_connections: 50
shared_buffers: 512MB
work_mem: 16MB
maintenance_work_mem: 16MB
bgwriter_delay: 50ms
bgwriter_lru_maxpages: 1000
bgwriter_lru_multiplier: 10.0
effective_io_concurrency: 200
max_worker_processes: 24
wal_level: replica
random_page_cost: 2.0
default_statistics_target: 1000
log_truncate_on_rotation: on
log_rotation_age: 1h
log_checkpoints: on
log_connections: on
log_disconnections: on
log_lock_waits: on
track_activity_query_size: 4096
log_autovacuum_min_duration: 0
autovacuum: off
initdb:
- encoding: 'UTF8'
- data-checksums
- lc-collate: "tr_TR.UTF-8"
- lc-ctype: "tr_TR.UTF-8"
pg_hba:
- local all all trust
- host all all 127.0.0.1/32 trust
- host replication replicator 127.0.0.1/32 md5
- host replication replicator 192.168.56.107/32 md5
- host replication replicator 192.168.56.108/32 md5
- host replication replicator 192.168.56.109/32 md5
- host replication replicator 10.200.129.54/32 md5
- host replication replicator 10.200.146.40/32 md5
- host replication replicator 10.200.146.41/32 md5
- host replication replicator 10.100.146.40/32 md5
- host all all 192.168.56.0/24 md5
- host all all 10.200.146.0/24 md5
- host all all 10.100.146.0/24 md5
- host all all 10.200.138.130/32 md5
- host all all 10.200.138.131/32 md5
users:
admin:
password: admin
options:
- createrole
- createdb
postgresql:
listen: 192.168.56.107:5432
connect_address: 192.168.56.107:5432
data_dir: /home/postgres/pg13/data
bin_dir: /usr/pgsql-13/bin
pgpass: /home/postgres/.pgpass
authentication:
replication:
username: replicator
password: PgP@stgresDba2022!
superuser:
username: postgres
password: PgP@stgresDba2022!
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
#####################################################
mkdir -p /var/log/patronichown -R postgres:postgres /var/log/patronimkdir -p /home/postgreschown -R postgres:postgres /home/postgressu - postgreschmod -R 0700 /home/postgres#roota geçilirvi /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/bin/patroni /etc/patroni.yml

KillMode=process

TimeoutSec=30

Restart=no

[Install]

WantedBy=multi-user.target

mv /usr/local/bin/patroni /usr/binsystemctl daemon-reloadsystemctl enable patroni.servicesystemctl start patroni.servicesystemctl status patroni.servicesystemctl enable postgresql-13.servicesu - postgrespsql

Bazı conf dosyaları ve yaml dosyalarında ide editörlerini kullanmadan düzenlerseniz tab attığınızda hata alırsınız bu yüzden bu yazımızda >> işareti ile boşlukları belirtmiş olduk. Belirtilen yerledeki conf ve yaml dosyalarını Notepad++ alın ve değiştir kısmından “>”-“ ” olarak bir karakteri değiştirdiğinizde istenilen ayara gelmiş olacaktır.

--

--