Bu yazımızda yedekli PostgreSQL 15 yapılandırmasını Patroni, Etcd ve HA Proxy kullanarak oluşturacağız.
1 - PostgreSQL Kurulumu
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt install gnupg2 ca-certificates -y
wget -O- https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor > pgsql.gpg
sudo mv pgsql.gpg /etc/apt/trusted.gpg.d/pgsql.gpg
sudo apt update
sudo apt install postgresql-15
2 - Patroni Kurulumu
sudo apt -y install patroni
2.1 Alternatif Olarak pip ile Kurulumu
apt install python3-pip python3-dev libpq-dev -y
pip3 install --upgrade pip
pip install patroni
pip install python-etcd
pip install psycopg2
PostgreSQL dosyalarına kolay erişebilmek için aşağıdaki gibi linkleyebiliriz.
2.2 Patroni için Link Oluşturalım
ln -s /usr/lib/postgresql/15/bin/* /usr/sbin/
3 - Patroni Konfigürasyonları
Patroni için verilerin (data ve wall dosyalarının) tutulacağı dizinleri oluşturup yetkilendirme işlemlerini gerçekleştirelim.
sudo mkdir -p /data/patroni
sudo chown -R postgres:postgres /data/
sudo chmod -R 700 /data/
İki node yapsı için, /etc/patroni.yml dosyasını aşağıdaki gibi düzenleyebiliriz veya oluşturabiliriz.
scope: development
namespace: /db/
name: node-1
restapi:
listen: <node-1-ip-adresi>:8008
connect_address: <node-1-ip-adresi>:8008
etcd:
host: <node-1-ip-adresi>: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 replicator 127.0.0.1/32 md5
- host replication replicator <node-1-ip-adresi>/24 md5
- host replication replicator <node-2-ip-adresi>/24 md5
- host all all 0.0.0.0/0 md5
users:
admin:
password: admin
options:
- createrole
- createdb
postgresql:
listen: <node-1-ip-adresi>:5432
connect_address: <node-1-ip-adresi>:5432
data_dir: /data/patroni
pgpass: /tmp/pgpass
authentication:
replication:
username: replicator
password: "1"
superuser:
username: postgres
password: "1"
parameters:
unix_socket_directories: '.'
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
Patroni servisinin dosyasını (/etc/systemd/system/patroni.service) aşağıdaki gibi oluşturabilir veya düzenleyebiliriz.
[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.targ
Sonrasında servisi sistem açıldığında çalışacak şekide başlatmak için aşağıdaki komutları çalıştırabiliriz.
systemctl daemon-reload
systemctl stop postgresql
systemctl restart patroni
systemctl status patroni
systemctl enable patroni
NOT: Buraya kadar olan adımlar birinci ve ikinci patroni nodlarında yapılamlıdır. Bundan sonrası etcd ve HAProxy kurulacak makina üzerinde yapılması yeterlidir. Patroni 2. nodunda düzenleme yapılırken node1 yazan kısımlar kendisi olacak şekilde, node2 olacak kısımlar ise diğer makina olacak şekilde düşünülabilir.
4 - Etcd Kurulumu
sudo apt install etcd
Kurulum sonrası /etc/default/etcd dosyasını aiağıdaki gibi düzenlebiliriz.
ETCD_LISTEN_PEER_URLS="http://<etcd-ip-adresi>:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://<etcd-ip-adresi>:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://<etcd-ip-adresi>:2380"
ETCD_INITIAL_CLUSTER="default=http://<etcd-ip-adresi>:2380,"
ETCD_ADVERTISE_CLIENT_URLS="http://<etcd-ip-adresi>:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
systemctl restart etcd
systemctl status etcd
systemctl enable etcd
5 - HA Proxy Kurulumu
sudo apt install haproxy
HAProxy konfigürasyonlarının bulunduğu /etc/haproxy/haproxy.cfg dosyasını aşağıdaki gibi düzenliyoruz.
global
maxconn 1000
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 postgres
bind *:5000
option httpchk
http-check expect status 200
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server psql-node-1 <node-1-ip-adresi>:5432 maxconn 100 check port 8008
server psql-node-2 <node-2-ip-adresi>:5432 maxconn 100 check port 8008
systemctl restart haproxy
systemctl status haproxy
systemctl enable haproxy
6 - Yeni Bir Node Eklemek
Ubuntu 20.X kurulu sunucuda 1,2,3,4 adımları gerçekleştiriyoruz.
6.1 Dördüncü adımda Yeni Makine konfigürasyonu
/etc/patroni.yml dosyasının içerisini aşağıdaki gibi dolduruyoruz
scope: development
namespace: /db/
name: node-yeni
restapi:
listen: <node-yeni-ip-adresi>:8008
connect_address: <node-yeni-ip-adresi>:8008
etcd:
host: <etcd-ip-adresi>: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 replicator 127.0.0.1/32 md5
- host replication replicator <node-yeni-ip-adresi>/0 md5
- host replication replicator <node1-ip-adresi>/0 md5
- host replication replicator <node2-ip-adresi>/0 md5
- host all all 0.0.0.0/0 md5
users:
admin:
password: admin
options:
- createrole
- createdb
postgresql:
listen: <node-yeni-ip-adresi>:5432
connect_address: <node-yeni-ip-adresi>:5432
data_dir: /data/patroni
pgpass: /tmp/pgpass
authentication:
replication:
username: replicator
password: "1"
superuser:
username: postgres
password: "1"
parameters:
unix_socket_directories: '.'
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
6.2 Var olan Node Konfigürasyonları
scope: development
namespace: /db/
name: node-3
restapi:
listen: <node-1-ip-adresi>:8008
connect_address: <node-1-ip-adresi>:8008
etcd:
host: <etcd-ip-adresi>: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 replicator 127.0.0.1/32 md5
- host replication replicator <node1-ip-adresi>/0 md5
- host replication replicator <node2-ip-adresi>/0 md5
- host replication replicator <node3-ip-adresi>/0 md5
- host all all 0.0.0.0/0 md5
users:
admin:
password: admin
options:
- createrole
- createdb
postgresql:
listen: <node-1-ip-adresi>:5432
connect_address: <node-1-ip-adresi>:5432
data_dir: /data/patroni
pgpass: /tmp/pgpass
authentication:
replication:
username: replicator
password: 1
superuser:
username: postgres
password: 1
parameters:
unix_socket_directories: '.'
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
7.3 HA Proxy Konfigürasyonu
global
maxconn 1000
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 postgres
bind *:5000
option httpchk
http-check expect status 200
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server psql-node-1 <node-1-ip-adresi>:5432 maxconn 100 check port 8008
server psql-node-2 <node-2-ip-adresi>:5432 maxconn 100 check port 8008
server psql-node-3 <node-2-ip-adresi>:5432 maxconn 100 check port 8008
8 - Patronictl Komutu İle Kontrol Edilmesi
patronictl -c /etc/patroni.yml list
Bu komutun çıktısında
root@ubuntu-server:/home/ubuntu# patronictl -c /etc/patroni.yml list
+ Cluster: postgreskume (7298293200548063780) -+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+-----------+--------------+---------+---------+----+-----------+
| node-1 | <node-1-ip-adresi> | Leader | running | 1 | |
| node-2 | <node-2-ip-adresi> | Replica | running | 1 | 0 |
|
| node-3 | <node-3-ip-adresi> | Replica | running | 1 | 0 |
+-----------+--------------+---------+---------+----+-----------+
Not: Yeni node eklerken Dördüncü adımdaki Patroni servis dosyasını oluşturmayı unutmayalım.
Top comments (0)