Oracle Linux 8.8'de PostgreSQL 13 Yedekli Yapı Nasıl Kurulur? - Patroni, ETCD, HAProxy
Published: 2023-12-07 13:35:41

Bu yazıda, Oracle Linux 8.8 makinede yedekli veritabanı yapısı (PostgreSQL 13.13 , Patroni 3.2.1 , ETCD 3.5.10 ve HAProxy 1.8.27) kurulumu nasıl yapılır göreceğiz. 

- Sanal makineye `ssh` ile bağlanılır.

### ETCD Kurulumu:

İlk olarak, `curl`, `wget` ve `vim` paketleri kurulur. Sonrasında, ETCD'nin son sürümü GitHub'dan indirilir. İndirilen sürüm açılır ve /usr/local/bin klasörüne taşınır. ETCD'nin kurulum durumunu kontrol etmek için sürüm bilgisi görüntülenir.

```
sudo dnf -y install curl wget vim
ETCD_RELEASE=$(curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest|grep tag_name | cut -d '"' -f 4)
echo $ETCD_RELEASE
wget https://github.com/etcd-io/etcd/releases/download/${ETCD_RELEASE}/etcd-${ETCD_RELEASE}-linux-amd64.tar.gz
tar xvf etcd-${ETCD_RELEASE}-linux-amd64.tar.gz
cd etcd-${ETCD_RELEASE}-linux-amd64
sudo mv etcd* /usr/local/bin 
ls /usr/local/bin 
/usr/local/bin/etcd --version
```
Kurulumun devamında, ETCD'nin depolama sisteminin kullanımı için gerekli olan düzenlemeler yapılır. ETCD'nin veritabanını saklamak için /var/lib/etcd/ dizini oluşturulur. ETCD'nin konfigüraasyon dosyalarını saklamak için /etc/etcd dizini oluşturulur. ETCD için sistem kullanıcı grubu oluşturulur. ETCD için sistem kullanıcısını oluşturur. /var/lib/etcd/ dizini ve içeriği, ETCD için oluşturulan kullanıcı ve gruba ait olarak düzenlenir. /var/lib/etcd/ dizini kullanıcısı ve grup üyelerine yazma ve okuma yetkisi verilir.

```
sudo mkdir -p /var/lib/etcd/
sudo mkdir /etc/etcd
sudo groupadd --system etcd
sudo useradd -s /sbin/nologin --system -g etcd etcd
sudo chown -R etcd:etcd /var/lib/etcd/
sudo chmod 0775 /var/lib/etcd/
```
**/etc/systemd/system/etcd.service** dosyasının içine `nano` ile girilir ve aşağıdaki düzenlemeler yapılır.

```
[Unit]
Description=etcd key-value store
Documentation=https://github.com/etcd-io/etcd
After=network.target

[Service]
User=etcd
Type=notify
EnvironmentFile=/etc/etcd/etcd.conf
Environment=ETCD_DATA_DIR=/var/lib/etcd
Environment=ETCD_NAME=%m
ExecStart=/usr/local/bin/etcd --enable-v2=true
Restart=always
RestartSec=10s
LimitNOFILE=40000

[Install]
WantedBy=multi-user.target
```
> Konfigürasyon dosyalarında, boşluklardan kaynaklı çalışmama durumu olabiliyor. Tekrar yazmayı deneyebilirsiniz. :)

**/etc/etcd/etcd.conf** dosyasının içine `nano` ile girilir ve aşağıdaki düzenlemeler yapılır.

```
ETCD_LISTEN_PEER_URLS="http://<node-1-ip-adresi>:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://<node-1-ip-adresi>:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://<node-1-ip-adresi>:2380"
ETCD_INITIAL_CLUSTER="default=http://<node-1-ip-adresi>:2380,"
ETCD_ADVERTISE_CLIENT_URLS="http://<node-1-ip-adresi>:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
```
Servis dosyalarında yapılan değişiklikler olduğundan bu dosyalar yeniden yüklenir ve ETCD servisinin, sistem başlangıcında otomatik başlatılması sağlanır.

```
sudo systemctl daemon-reload
sudo systemctl enable etcd.service
```
SELinux'un kullanıldığı sistemde ETCD'nin düzgün bir şekilde çalışabilmesi için gerekli ayarlar yapılır.

```
sudo ausearch -c '(etcd)' --raw | audit2allow -M my-etcd
sudo semodule -X 300 -i my-etcd.pp
sudo restorecon -Rv /usr/local/bin/etcd
```
Son olarak, ETCD servisi tekrar başlatılır ve servis durumu kontrol edilir.

```
systemctl restart etcd
systemctl status etcd
```

### PostgreSQL Kurulumu:

İlk olarak, PostgreSQL'in yum deposunun RPM paketi indirilir. yum deposunun yapılandırma dosyasının içeriği görüntülenir. PostgreSQL deposunun başarıyla eklenip eklenmediğini kontrol etmek için yum deposu listesi görüntülenir. PostgreSQL modülü devre dışı bırakılır. Mevcut depolarda PostgreSQL 13 ile ilgili paketler aranır. PostgreSQL 13 sunucu paketleri yüklenir. PostgreSQL başlatılır ve başlangıç veritabanı oluşturulur. 
```
sudo dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
cat /etc/yum.repos.d/pgdg-redhat-all.repo
sudo dnf repolist
sudo dnf -qy module disable postgresql
sudo dnf search postgresql13
sudo dnf install postgresql13 postgresql13-server
sudo /usr/pgsql-13/bin/postgresql-13-setup initdb
```
PostgreSQL servisinin sistem başlangıcında otomatik başlatılması sağlanır ve servis durumu kontrol edilir.
```
sudo systemctl enable --now postgresql-13
systemctl status postgresql-13
```
PostgreSQL veritabanına bağlanılır.
```
su - postgres
psql
```
Yedekli yapıda kullanılacak veritabanı kullanıcıları ve şifreleri oluşturulur.
```
ALTER ROLE postgres WITH PASSWORD 'postgres-parola';
CREATE ROLE replicator WITH ENCRYPTED PASSWORD 'postgres-parola';
```
PostgreSQL'den çıkış yapılır.
```
\q
exit
```
### Patroni Kurulumu:

Patroni yüklenir.
```
sudo yum install patroni
```
Python 3 için pip paket yöneticisi, Python 3 geliştirme dosyaları ve PostgreSQL geliştirme dosyaları yüklenir. Pip güncellenir. Python 3 ve PostgreSQL geliştirme dosyaları kurulur ve bazı Python paketleri yüklenir.
```
sudo yum install python3-pip python3-devel postgresql-devel -y
pip3 install --upgrade pip
pip install patroni python-etcd psycopg2
```
PostgreSQL 13 için bir bağlantı linki oluşturulur.
```
sudo ln -s /usr/pgsql-13/bin/* /usr/sbin/
```
/data/patroni dizini oluşturulur ve dizinin altındaki dosylar ve dizinler 'postgres' kullanıcısına ve 'postgres' grubuna atanır. Okuma, yazma ve çalıştırma izinleri 'postgres' kullanıcısına verilir.
```
sudo mkdir -p /data/patroni
sudo chown -R postgres:postgres /data/
sudo chmod -R 700 /data/
```
**/etc/patroni.yml** dosyasının içine `nano` ile girilir ve aşağıdaki düzenlemeler yapılır.
```
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>:/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: postgres-parola
        superuser:
            username: postgres
            password: postgres-parola
    parameters:
        unix_socket_directories: '.'

tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false
```
**/etc/systemd/system/patroni.service** dosyasının içine `nano` ile girilir ve aşağıdaki düzenlemeler yapılır.
```
[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.target
```
Servis dosyaları yeniden yüklenir. PostgreSQL durdurulur. Patroni servisi tekrar başlatılır ve çalışma durumu kontrol edilir.
```
systemctl daemon-reload
systemctl stop postgresql-13
systemctl restart patroni
systemctl status patroni
```
### HAProxy Kurulumu:

HAProxy yüklenir.
```
sudo yum install haproxy
```
**/etc/haproxy/haproxy.cfg** dosyasının içine `nano` ile girilir ve aşağıdaki düzenlemeler yapılır.
```
global
    maxconn 1000

defaults
    log global
    mode tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s

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
```
HAProxy servisi tekrar başlatılır ve çalışma durumu kontrol edilir.
```
systemctl restart haproxy
systemctl status haproxy
```
### Yapının Kontrol Edilmesi:

Aşağıdaki komut ile sistemin çalışıp çalışmadığı kontrol edilir.
```
patronictl -c /etc/patroni.yml list
```
Bu komutun çıktısı aşağıdaki gibi olmalıdır.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ezcwkmd2e4j6slg38t0x.png)

### Önemli Notlar:
- Herhangi bir aşamada portlarla ilgili bağlantı hatası alınıyorsa `ss -tlnp` komutu ile dinlenen portlar kontrol edilebilir.
- Servisler güvenlik duvarı açık olduğu için çalışmıyor olabilir. Aşağıdaki komut ile güvenlik duvarı durdurulabilir. `systemctl stop firewalld`

> Nasıl yeni düğüm ekleneceğini aşağıdaki yazıda bulabilirsiniz: https://dev.to/aciklab/oracle-linux-88de-yedekli-yapiya-node-nasil-eklenir-34a