Patroni Kurulum

Published 11-20-2021 00:00:00

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:
  1. En sağlam kaynağım DBA Kemal UNCU :)
  2. dev.to/aciklab
  3. www.veritabaniegitimleri.com