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.)

Kategori seçin...