Kurulum Öncesi
*İnternette dolaşan kurulum belgelerinden farklı olarak çalışan(Daha önce kurulumunu yaptığımız PostgreSQL’e buradan erişebilirsiniz) PostgreSQL üzerine Patroni kurulumu gerçekleştireceğiz. Yani Patroni ile birlikte yeni bir PostgreSQL kurulumu yapılmayacak, halihazırda kurulu sisteme entegre edeceğiz.
3 adet sunucu üzerine kurulum yapılacaktır. Daha önce kurulu olan PostgreSQL sunucularına Patroni, ETCD paketlerinin kurulumu ve yeni bir ETCD sunucu kurulumu gerçekleştirilecek.
Hostname | Ip Adres | Görev |
---|---|---|
petcd | 10.10.10.30 | etcd |
master_pg | 10.10.10.31 | etcd,patroni,postgresql |
replica_pg | 10.10.10.32 | etcd,patroni,postgresql |
3 Sunucuda Yapılacak İşlemler
ETCD sunucusu kurulumunda diğer sunuculara erişim için ssh-key adımları tekrar yapılmalı, PostgreSQL sunucuları kendi aralarında ve etcd sunucusuyla ssh-key ile erişim sağlamalıdır.
ETCD Kurulumu
ETCD sunucusunda;
apt install etcd -y
systemctl stop etcd
nano /etc/default/etcd
Aşağıdaki içeriği dosya içine kopyalayın;
ETCD_NAME="etcd0"
ETCD_INITIAL_CLUSTER="etcd0=http://10.10.10.30:2380,etcd1=http://10.10.10.31:2380,etcd2=http://10.10.10.32:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster1"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.10.10.30:2380"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://10.10.10.30:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.10.10.30:2379,http://127.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.10.10.30:2379"
mkdir /var/lib/etcd/default.etcd && chown -R etcd. /var/lib/etcd/default.etcd && chmod -R 700 /var/lib/etcd/default.etcd
master_pg Sunucusunda ETCD Kurulumu;
apt install etcd -y
systemctl stop etcd
nano /etc/default/etcd
Aşağıdaki içeriği dosya içine kopyalayın;
ETCD_NAME="etcd1"
ETCD_INITIAL_CLUSTER="etcd0=http://10.10.10.30:2380,etcd1=http://10.10.10.31:2380,etcd2=http://10.10.10.32:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster1"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.10.10.31:2380"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://10.10.10.31:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.10.10.31:2379,http://127.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.10.10.31:2379"
default.etcd dizini ve yetkilerini ayarlayalım;
mkdir /var/lib/etcd/default.etcd && chown -R etcd. /var/lib/etcd/default.etcd && chmod -R 700 /var/lib/etcd/default.etcd
replica_pg Sunucusunda ETCD Kurulumu;
apt install etcd -y
systemctl stop etcd
nano /etc/default/etcd
Aşağıdaki içeriği dosya içine kopyalayın;
ETCD_NAME="etcd2"
ETCD_INITIAL_CLUSTER="etcd0=http://10.10.10.30:2380,etcd1=http://10.10.10.31:2380,etcd2=http://10.10.10.32:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster1"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.10.10.32:2380"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://10.10.10.32:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.10.10.32:2379,http://127.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.10.10.32:2379"
mkdir /var/lib/etcd/default.etcd && chown -R etcd. /var/lib/etcd/default.etcd && chmod -R 700 /var/lib/etcd/default.etcd
etcd kurulan tüm sunucularda;
systemctl restart etcd
systemctl status etcd
Daha sonra herhangi bir etcd sunucusunda;
etcdctl cluster-health
komutu ile etcd kurulu olan sunucuların durumunu ve memberları görebilirsiniz;
member 60aa8fb961c89cf0 is healthy: got healthy result from http://10.10.10.32:2379
member a32132943ae7f349 is healthy: got healthy result from http://10.10.10.31:2379
member d8961206e49044d0 is healthy: got healthy result from http://10.10.10.30:2379
cluster is healthy
master_pg Patroni Kurulumu
apt install patroni -y
ln -s /usr/lib/postgresql/12/bin/* /usr/sbin/
mkdir /var/log/patroni && touch /var/log/patroni/patroni.log && chmod -R 777 /var/log/patroni
Boş bir patroni.yml oluşturulur;
nano /etc/patroni/patroni.yml
aşağıdaki içeriği kendi ip adreslerinize göre değiştirip patroni.yml içine kaydediniz;
scope: foc
name: patroni1
restapi:
listen: 10.10.10.31:8008
connect_address: 10.10.10.31:8008
etcd:
hosts: 10.10.10.30:2379,10.10.10.31:2379,10.10.10.32:2379
log:
dir: /var/log/patroni
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 100
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
pg_hba:
- host replication replicauser 10.10.10.31/32 trust
- host all all 10.10.10.31/32 trust
- host replication replicauser 10.10.10.32/32 trust
- host all all 10.10.10.32/32 trust
users:
admin:
password: admin
options:
- createrole
- createdb
postgresql:
listen: 10.10.10.31:5432
connect_address: 10.10.10.31:5432
data_dir: /data/patroni
config_file: /etc/postgresql/12/main/postgresql.conf
bin_dir: /usr/lib/postgresql/12/bin
pgpass: /tmp/pgpass
authentication:
replication:
username: replicauser
password: 1234
superuser:
username: postgres
password: 1234
parameters:
unix_socket_directories: '/var/run/postgresql/'
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
Daha sonra patroni.service dosyası oluşturulur;
nano /etc/systemd/system/patroni.service
Aşağıdaki içeriği açılan dosya içine kopyalayın;
[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/patroni.yml
KillMode=process
TimeoutSec=30
Restart=no
[Install]
WantedBy=multi-user.target
Aşağıdaki servis işlemleri yapılır;
systemctl daemon-reload && systemctl stop postgresql@12-main
systemctl enable patroni && systemctl enable postgresql@12-main
Aşağıdaki dosya/dizin işlemleri yapılır;
modprobe softdog && chown postgres /dev/watchdog
cp /etc/postgresql/12/main/postgresql.conf /data/patroni/
cp /etc/postgresql/12/main/pg_hba.conf /data/patroni/
mkdir /data/patroni/conf.d
Önceki PostgreSQL için ayarlanan pg_hba.conf patroni için düzenlenerek aşağıdaki şekilde tanımlama yapılır;
nano /data/patroni/pg_hba.conf
host replication replicauser 10.10.10.31/32 trust
host all all 10.10.10.31/32 trust
host replication replicauser 10.10.10.32/32 trust
host all all 10.10.10.32/32 trust
Dosya kopyalama işlemleri sonrası küme dizinine yetki ataması yapılır;
chown -R postgres. /data/patroni/
Son olarak patroni servisi başlatılır;
systemctl start patroni
systemctl status patroni
replica_pg Patroni Kurulumu
apt install patroni -y
ln -s /usr/lib/postgresql/12/bin/* /usr/sbin/
mkdir /var/log/patroni && touch /var/log/patroni/patroni.log && chmod -R 777 /var/log/patroni
Boş bir patroni.yml oluşturulur;
nano /etc/patroni/patroni.yml
aşağıdaki içeriği kendi ip adreslerinize göre değiştirip patroni.yml içine kaydediniz;
scope: foc
name: patroni2
restapi:
listen: 10.10.10.32:8008
connect_address: 10.10.10.32:8008
etcd:
hosts: 10.10.10.30:2379,10.10.10.31:2379,10.10.10.32:2379
log:
dir: /var/log/patroni
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 10.10.10.31/0 trust
- host all all 10.10.10.31/0 trust
- host replication replicauser 10.10.10.32/0 trust
- host all all 10.10.10.32/0 trust
users:
admin:
password: admin
options:
- createrole
- createdb
postgresql:
listen: 10.10.10.32:5432
connect_address: 10.10.10.32:5432
data_dir: /data/patroni
config_file: /etc/postgresql/12/main/postgresql.conf
bin_dir: /usr/lib/postgresql/12/bin
pgpass: /tmp/pgpass
authentication:
replication:
username: replicauser
password: 1234
superuser:
username: postgres
password: 1234
parameters:
unix_socket_directories: '/var/run/postgresql/'
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
Daha sonra patroni.service dosyası oluşturulur;
nano /etc/systemd/system/patroni.service
Aşağıdaki içeriği açılan dosya içine kopyalayın;
[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/patroni.yml
KillMode=process
TimeoutSec=30
Restart=no
[Install]
WantedBy=multi-user.target
Aşağıdaki servis işlemleri yapılır;
systemctl daemon-reload
systemctl stop postgresql@12-main
systemctl enable patroni && systemctl enable postgresql@12-main
Aşağıdaki dosya/dizin işlemleri yapılır;
modprobe softdog && chown postgres /dev/watchdog
cp /etc/postgresql/12/main/postgresql.conf /data/patroni/ && cp /etc/postgresql/12/main/pg_hba.conf /data/patroni/ && mkdir /data/patroni/conf.d
chown -R postgres. /data/patroni/
Dosya kopyalama işlemleri sonrası küme dizinine yetki ataması yapılır;
chown -R postgres. /data/patroni/
Önceki PostgreSQL için ayarlanan pg_hba.conf patroni için düzenlenerek aşağıdaki şekilde tanımlama yapılır;
nano /data/patroni/pg_hba.conf
host replication replicauser 10.10.10.32/32 trust
host all all 10.10.10.32/32 trust
host replication replicauser 10.10.10.31/32 trust
host all all 10.10.10.31/32 trust
Son olarak patroni servisi başlatılır;
systemctl start patroni
systemctl status patroni
master_pg sunucusunda;
patronictl -d 10.10.10.31 list foc
+---------+----------+-------------+--------+---------+----+-----------+
| Cluster | Member | Host | Role | State | TL | Lag in MB |
+---------+----------+-------------+--------+---------+----+-----------+
| foc | patroni1 | 10.10.10.31 | Leader | running | 13 | |
| foc | patroni2 | 10.10.10.32 | | running | | unknown |
+---------+----------+-------------+--------+---------+----+-----------+
komutu ile, replica_pg sunucusunda;
patronictl -d 10.10.10.32 list foc
komutu ile Patroni’yi seyredebilirsiniz :)
root@master_pg:~# patronictl -d 10.10.10.32 list foc
+---------+----------+-------------+--------+---------+----+-----------+
| Cluster | Member | Host | Role | State | TL | Lag in MB |
+---------+----------+-------------+--------+---------+----+-----------+
| foc | patroni1 | 10.10.10.31 | Leader | running | 13 | |
| foc | patroni2 | 10.10.10.32 | | running | | unknown |
+---------+----------+-------------+--------+---------+----+-----------+
Herhani bir Patroni sunucusunda servisi yeniden başlattığınızda Role / Leader değerinin diğer sunucuya geçtiğini görebilirsiniz.
root@master_pg:~# systemctl restart patroni
root@master_pg:~# patronictl -d 10.10.10.31 list foc
+---------+----------+-------------+--------+---------+----+-----------+
| Cluster | Member | Host | Role | State | TL | Lag in MB |
+---------+----------+-------------+--------+---------+----+-----------+
| foc | patroni1 | 10.10.10.31 | | running | | unknown |
| foc | patroni2 | 10.10.10.32 | Leader | running | 14 | |
+---------+----------+-------------+--------+---------+----+-----------+
Kaynaklar:
- En sağlam kaynağım DBA Kemal UNCU :)
- dev.to/aciklab
- www.veritabaniegitimleri.com