Ubuntu 20.x PostgreSQL 15 Yedekli Yapı - Patroni, ETCD, HA - Patroni Yeni Node Ekleme
Tags: database, tutorial, beginners, postgres
Published: 2023-11-06 12:10:33

Bu yazımızda yedekli PostgreSQL 15 yapılandırmasını Patroni, Etcd ve HA Proxy kullanarak oluşturacağız.

# 1 - PostgreSQL Kurulumu

``` bash
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

``` bash
sudo apt -y install patroni
```

## 2.1 Alternatif Olarak pip ile Kurulumu

``` bash
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

``` bash
ln -s /usr/lib/postgresql/15/bin/* /usr/sbin/
```

# 3 - PostgreSQL Konfigürasyonları

``` bash
su - postgres
psql
```

PostgreSQL üzerinde yetkili ve yetkisiz kullanıcıların parola bilgilerini ayarlıyoruz.

``` sql
ALTER USER postgres PASSWORD '1';
CREATE USER replicator WITH ENCRYPTED PASSWORD '1';
```

# 4 - Patroni Konfigürasyonları

Patroni için verilerin (data ve wall dosyalarının) tutulacağı dizinleri oluşturup yetkilendirme işlemlerini gerçekleştirelim.

``` bash
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.

``` bash
scope: development
namespace: /db/
name: node-1

restapi:
    listen: <node1-ip-adresi>:8008
    connect_address: <node1-ip-adresi>:8008

etcd:
    host: <node1-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 all all 0.0.0.0/0 md5

    users:
        admin:
            password: admin
            options:
                - createrole
                - createdb

postgresql:
    listen: <node1-ip-adresi>:5432
    connect_address: <node1-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.

``` bash
[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.

``` bash
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._


# 5 - Etcd Kurulumu

``` bash
sudo apt install etcd
```

Kurulum sonrası /etc/default/etcd dosyasını aiağıdaki gibi düzenlebiliriz.

``` bash
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"
```

``` bash
systemctl restart etcd
systemctl status etcd
systemctl enable etcd
```

# 6 - HA Proxy Kurulumu

``` bash
sudo apt install haproxy
```

HAProxy konfigürasyonlarının bulunduğu **/etc/haproxy/haproxy.cfg** dosyasını aşağıdaki gibi düzenliyoruz. 

``` bash
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
```

``` bash
systemctl restart haproxy
systemctl status haproxy
systemctl enable haproxy
```


# 7 - Yeni Bir Node Eklemek

Ubuntu 20.X kurulu sunucuda 1,2,3,4 adımları gerçekleştiriyoruz.

## 7.1 Dördüncü adımda Yeni Makine konfigürasyonu

``` bash
scope: development
namespace: /db/
name: node-3

restapi:
    listen: <node3-ip-adresi>:8008
    connect_address: <node3-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 <node3-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: <node3-ip-adresi>:5432
    connect_address: <node3-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.2 Var olan Node Konfigürasyonları

``` bash
scope: development
namespace: /db/
name: node-3

restapi:
    listen: <node1-ip-adresi>:8008
    connect_address: <node1-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: <node1-ip-adresi>:5432
    connect_address: <node1-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

``` bash
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

``` bash
patronictl -c /etc/patroni.yml list
```

Bu komutun çıktısında
``` bash
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.**_