Patroni Cluster Kurulumu ve Yönetimi

Canlı ortamda lokalde en az 2 adet ve bir adet de FKM’de (Felaket Kurtarma Merkezi)
standby veritabanı olmalıdır. Diğer standby’ların da kurulumları pgdb2 ile aynı adımları
içerir.
Kurulumlara geçmeden önce işletim sistemi seviyesindeki ayarlar tüm sunucularda aynı
olmalı.
- Sunucular arasında şifresiz erişim aktif edilmeli, daha önce açıklandığı için tüm adımlar
tekrar buraya yazılmadı.ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub root@pgdb2 - iptables ,selinux vb. güvenlikler kapatılmalı (canlıya alınmadan önce tekrar açılır),
- sudo timedatectl set-timezone Europe/Istanbul
vim /etc/hosts 192.168.56.71 pgdb1 192.168.56.72 pgdb2 192.168.56.81 etcd1 192.168.56.82 etcd2 192.168.56.83 etcd3 192.168.56.60 pgbr
host dosyaları düzenlenir.
apt install language-pack-tr localectl status locale -a # Yüklenmesi yeterli oluyor. Gerektiği takdirde tr_TR set edilebilir. localectl set-locale LANG=tr_TR.utf8 Türkçe dil paketi kurulur.
ETCD Kurulumu
etcd1, etcd2 ve etcd3 sunucularına daha önce kurulum yapıldı ise eski sürüm etcd’ler
silinir.
sudo rm -rf /usr/local/etc /var/lib/etcd sudo rm /etc/systemd/system/etcd.service /etc/init.d/etcd sudo rm /run/systemd/generator.late/graphical.target.wants/etcd.service sudo rm /var/lib/dpkg/info/etcd-server.post sudo rm /var/lib/dpkg/info/etcd-server.list
En son sürümü kontrol edilir (işletim sistemi ile uyumluluğu kontrol edilmeli):
https://github.com/etcd-io/etcd/releases
ETCD kaynak koddan yüklenir:
ETCD_VER=v3.4.20
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GITHUB_URL}
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linuxamd64.
tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
cd /tmp
tar -xzvf etcd-v3.4.20-linux-amd64.tar.gz
cd etcd-v3.4.20-linux-amd64
sudo cp etcd* /usr/local/bin
sudo scp etcd* etcd2:/usr/local/bin
sudo scp etcd* etcd3:/usr/local/bin
# etcd2 ve etcd3’ te de test edilir.
etcdctl version
etcd1 sunucusunun kurulumu
sudo mkdir -p /var/lib/etcd/default.etcd sudo chmod -R 755 /var/lib/etcd
Data klasörü oluşturulup haklar verilir.
Service file’da her sunucu için ETCD konfig değişiklikleri yapılır.
sudo vim /etc/systemd/system/etcd.service [Unit] Description=etcd service Documentation=https://github.com/coreos/etcd [Service] Type=notify ExecStart=/usr/local/bin/etcd --name=etcd1 \ --data-dir=/var/lib/etcd/default.etcd \ --initial-advertise-peer-urls=http://192.168.56.81:2380 \ --listen-peer-urls=http://192.168.56.81:2380 \ --listen-client-urls=http://192.168.56.81:2379,ht tp://127.0.0.1:2379 \ --advertise-client-urls=http://192.168.56.81:2379 \ --initial-cluster-token=etcd-cluster-1 \ --initial-cluster=etcd1=http://192.168.56.81:2380,etcd2=http://19 2.168.56.82:2380,etcd3=http://192.168.56.83:2380 \ --initial-cluster-state=new Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
Servis ayarları güncellenir.
etcd2 sunucusunun kurulumu
sudo mkdir -p /var/lib/etcd/default.etcd sudo chmod -R 755 /var/lib/etcd
Service file’da her sunucu için ETCD konfig değişiklikleri yapılır.
sudo vim /etc/systemd/system/etcd.service [Unit] Description=etcd service Documentation=https://github.com/coreos/etcd [Service] Type=notify ExecStart=/usr/local/bin/etcd --name=etcd2 \ --data-dir=/var/lib/etcd/default.etcd \ --initial-advertise-peer-urls=http://192.168.56.82:2380 \ --listen-peer-urls=http://192.168.56.82:2380 \ --listen-client-urls=http://192.168.56.82:2379,ht tp://127.0.0.1:2379 \ --advertise-client-urls=http://192.168.56.82:2379 \ --initial-cluster-token=etcd-cluster-1 \ --initial-cluster=etcd1=http://192.168.56.81:2380,etcd2=http://19 2.168.56.82:2380,etcd3=http://192.168.56.83:2380 \ --initial-cluster-state=new Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
etcd3 sunucusunun kurulumu
sudo mkdir -p /var/lib/etcd/default.etcd sudo chmod -R 755 /var/lib/etcd
sudo vim /etc/systemd/system/etcd.service [Unit] Description=etcd service Documentation=https://github.com/coreos/etcd [Service] Type=notify ExecStart=/usr/local/bin/etcd --name=etcd3 \ --data-dir=/var/lib/etcd/default.etcd \ --initial-advertise-peer-urls=http://192.168.56.83:2380 \ --listen-peer-urls=http://192.168.56.83:2380 \ --listen-client-urls=http://192.168.56.83:2379,ht tp://127.0.0.1:2379 \ --advertise-client-urls=http://192.168.56.83:2379 \ --initial-cluster-token=etcd-cluster-1 \ --initial-cluster=etcd1=http://192.168.56.81:2380,etcd2=h ttp://192.168.56.82:2380,etcd3=http://192.168.56.83:2380 \ --initial-cluster-state=new Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
Adım 1
3 ETCD makinesinde de service aktif edilip başlatılır:
# Güncel servis ayarları etkinleştirilir. sudo systemctl daemon-reload sudo systemctl start etcd.service systemctl enable etcd.service
Adım 2
# Member list kontrol edilir. etcdctl member list etcdctl endpoint status --cluster -w table +---------------------------+------------------+---------+---------+ |ENDPOINT | ID | VERSION | DB SIZE |ISLEADER| IS LEARNER | +---------------------------+------------------+---------+------------------------+ | 192.168.56.83:2379 | b0c643e319591acf | 3.4.20 | 201 kB | false | false | | 192.168.56.81:2379 | e81e0c395b871eb2 | 3.4.20 | 201 kB | true | false | | 192.168.56.82:2379 | fc6a765539cc593d | 3.4.20 | 201 kB | false | false | +---------------------------+------------------+---------+---------+-----------+----+
Adım 1 ve 2, tüm etcd sunucusunda da çalıştırılmalıdır.
Monitoring
export ETCDCTL_API=3 etcd1=192.168.56.81 etcd2=192.168.56.82 etcd3=192.168.56.83 ENDPOINTS=$etcd1:2379,$etcd2:2379,$etcd3:2379 etcdctl --endpoints=$ENDPOINTS endpoint health etcdctl --endpoints=$ENDPOINTS --write-out table endpoint status etcdctl --endpoints=$ENDPOINTS --write-out table member list
Health : Tüm etcd sunucular “successfully comitted proposal” çıktısı alınmalı.
Status : Biri leader diğerleri false olmalı.
List : status kolonu started olmalı
# Değişkenler tanımlanır. export ETCDCTL_API=3 etcd1=192.168.56.81 etcd2=192.168.56.82 etcd3=192.168.56.83 ENDPOINTS=$etcd1:2379,$etcd2:2379,$etcd3:2379 # etcd1’de etcdctl --endpoints=$ENDPOINTS watch test #etcd2 ve etcd3’te, yukarıdaki değişkenler tanımlandıktan sonra etcdctl --endpoints=$ENDPOINTS put test 1 etcdctl --endpoints=$ENDPOINTS put test 10 # Silmek için etcdctl --endpoints=$ENDPOINTS del test --prefix
Detaylı bilgi için https://etcd.io sitesini ziyaret edilebilir.
Primary Sunucuda Patroni Kurulumu (pgdb1)
sudo -i -u postgres sudo 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 | sudo apt-key add – sudo apt update sudo apt -y install postgresql-13 postgresql-client-13 sudo pg_dropcluster --stop 13 main
Sunucuda postgresql kurulu değilse, postgresql.org/download/ linkinden işletim sistemi
seçilir ve adımlar takip edilerek postgresql kurulur ve kurulumla birlikte gelen default
veritababanı/cluster ($PGDATA) silinir (pg_dropcluster).
postgres@pgdb1:~$ sudo mkdir -p /pg/data/13/main postgres@pgdb1:~$ sudo chown -R postgres:postgres /pg postgres@pgdb1:~$ sudo chmod 0750 /pg/data/13/main
Yeni postgresql cluster için cluster dizini oluşturulur ve sahipliği postgres kullanıcısına verilir.
sudo apt install patroni -y cp /etc/patroni/config.yml.in /etc/patroni/config.yml # Veya yeni config.yml oluşturulabilir. sudo chown -R postgres:postgres /etc/patroni
Postgres repository’den patroni yüklenir.
Detay aşağıda verildiği üzere kurulumla birlikte gelen servis dosyasındaki
(/lib/systemd/system/patroni.service) isimlendirme formatı ile devam
edildiği için config.yml kullanıldı.
vim /etc/patroni/config.yml
scope: erp namespace: /db/ name: pgdb1 restapi: listen: 192.168.56.71:8008 connect_address: 192.168.56.71:8008 etcd3: host: 192.168.56.81:2379 host: 192.168.56.82:2379 host: 192.168.56.83: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: wal_level: ‘replica’ unix_socket_directories: ‘/var/run/postgresql/.’ initdb: - encoding: UTF8 - data-checksums pg_hba: - host replication replicator 127.0.0.1/32 md5 - host replication replicator 192.168.56.71/0 md5 - host replication replicator 192.168.56.72/0 md5 - host all all 0.0.0.0/0 md5 postgresql: listen: “*:5432” connect_address: 192.168.56.71:5432 data_dir: /pg/data/13/main config_dir: /pg/data/13/main bin_dir: /usr/lib/postgresql/13/bin authentication: replication: username: replicator password: replicator superuser: username: postgres password: postgres rewind: username: rewind_user password: rewind parameters: wal_level: ‘replica’ archive_mode: ‘on’ archive_command: ‘pgbackrest --stanza=erp archive-push %p’ unix_socket_directories: ‘/var/run/postgresql/.’ tags: nofailover: false noloadbalance: false clonefrom: false nosync: false
/lib/systemd/system/patroni.service dosyası kontrol edilmeli.
[Unit] Description=Runners to orchestrate a high-availability PostgreSQL After=network.target ConditionPathExists=/etc/patroni/config.yml [Service] Type=simple User=postgres Group=postgres EnvironmentFile=-/etc/patroni_env.conf ExecStart=/usr/bin/patroni /etc/patroni/config.yml StandardOutput=file:/var/log/patroni/patroni.log ExecReload=/bin/kill -s HUP $MAINPID KillMode=process TimeoutSec=30 Restart=no [Install] WantedBy=multi-user.target
Not: Zaten çalışan postgres cluster varsa, patroni yukarıdaki config.yml dosyasında
belirttilen data dizinine göre bu cluster’ı otomatik olarak bulacaktır. Sadece initdb
bölümü olmamalıdır.
sudo systemctl daemon-reload sudo systemctl start patroni
Aşağıdaki komut ile clusterın çalışıp çalışmadığı kontrol edilir.
postgres@pgdb1:~$ patronictl -c /etc/patroni/config.yml list + Cluster: erp (7138018889497448890) -------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +--------+---------------+--------+---------+----+-----------+ | pgdb1 | 192.168.56.71 | Leader | running | 1 | | +--------+---------------+--------+---------+----+-----------+
Standby Sunucuda Patroni Kurulumu (pgdb2):
Replikasyon kurmak için Ubuntu sunucusuna postgresql yüklenir.
sudo -i -u postgres sudo 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 | sudo apt-key add – sudo apt update sudo apt -y install postgresql-13 postgresql-client-13 sudo pg_dropcluster --stop 13 main
Not: Standby sunucusu için replikasyon kurulumu, kaç tane standby sunucusu olursa
olsun aynı olacaktır. Bu replikasyon adımlarının tüm standby sunucularda yapılması ve
buna göre IP adresinin eklenmesi gerekmektedir.
Postgres repository’den patroni yüklenir.
postgres@pgdb2:~$ sudo apt install patroni -y
Data dizini oluşturulur ve dizinin sahipliği değiştirilir.
sudo mkdir -p /pg/data/13/main sudo chown -R postgres:postgres /pg sudo chmod 0750 /pg/data/13/main
vim /etc/patroni/config.yml
scope: erp namespace: /db/ name: pgdb2 restapi: listen: 192.168.56.72:8008 connect_address: 192.168.56.72:8008 etcd3: host: 192.168.56.81:2379 host: 192.168.56.82:2379 host: 192.168.56.83: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: wal_level: ‘replica’ unix_socket_directories: ‘/var/run/postgresql/.’ initdb: - encoding: UTF8 - data-checksums pg_hba: - host replication replicator 127.0.0.1/32 md5 - host replication replicator 192.168.56.71/0 md5 - host replication replicator 192.168.56.72/0 md5 - host all all 0.0.0.0/0 md5 postgresql: listen: “*:5432” connect_address: 192.168.56.72:5432 data_dir: /pg/data/13/main config_dir: /pg/data/13/main bin_dir: /usr/lib/postgresql/13/bin authentication: replication: username: replicator password: replicator superuser: username: postgres password: postgres rewind: username: rewind_user password: rewind parameters: wal_level: ‘replica’ archive_mode: ‘on’ archive_command: ‘pgbackrest --stanza=erp archive-push %p’ unix_socket_directories: ‘/var/run/postgresql/.’ tags: nofailover: false noloadbalance: false clonefrom: false nosync: false
vim /lib/systemd/system/patroni.service dosyası kontrol edilmeli.
[Unit] Description=Runners to orchestrate a high-availability PostgreSQL After=network.target ConditionPathExists=/etc/patroni/config.yml [Service] Type=simple User=postgres Group=postgres EnvironmentFile=-/etc/patroni_env.conf ExecStart=/usr/bin/patroni /etc/patroni/config.yml StandardOutput=file:/var/log/patroni/patroni.log ExecReload=/bin/kill -s HUP $MAINPID KillMode=process TimeoutSec=30 Restart=no [Install] WantedBy=multi-user.target
Patroni pgdb2’de başlatılır.
sudo systemctl daemon-reload sudo systemctl start patroni
Aşağıdaki komut ile clusterdaki node memberlerin durumu control edilir.
postgres@pgdb2:~$ patronictl -c /etc/patroni/config.yml list + Cluster: erp (7138428822420387146) --------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +--------+---------------+---------+---------+----+-----------+ | pgdb1 | 192.168.56.71 | Leader | running | 1 | | | pgdb2 | 192.168.56.72 | Replica | running | 1 | 0 | +--------+---------------+---------+---------+----+-----------+
Tüm standby sunucularda replikasyon standby kurulum adımları tekrarlanır. (pgdb3,FKM’deki standby vs.)
