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)