Oracle Linux 8.8'de PostgreSQL 13 Yedekli Yapı Nasıl Kurulur? - Patroni, ETCD, HAProxy

Yagmur Ocal - Dec 7 '23 - - Dev Community

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
Enter fullscreen mode Exit fullscreen mode

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/
Enter fullscreen mode Exit fullscreen mode

/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
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Son olarak, ETCD servisi tekrar başlatılır ve servis durumu kontrol edilir.

systemctl restart etcd
systemctl status etcd
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

PostgreSQL veritabanına bağlanılır.

su - postgres
psql
Enter fullscreen mode Exit fullscreen mode

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';
Enter fullscreen mode Exit fullscreen mode

PostgreSQL'den çıkış yapılır.

\q
exit
Enter fullscreen mode Exit fullscreen mode

Patroni Kurulumu:

Patroni yüklenir.

sudo yum install patroni
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

PostgreSQL 13 için bir bağlantı linki oluşturulur.

sudo ln -s /usr/pgsql-13/bin/* /usr/sbin/
Enter fullscreen mode Exit fullscreen mode

/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/
Enter fullscreen mode Exit fullscreen mode

/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
Enter fullscreen mode Exit fullscreen mode

/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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

HAProxy Kurulumu:

HAProxy yüklenir.

sudo yum install haproxy
Enter fullscreen mode Exit fullscreen mode

/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
Enter fullscreen mode Exit fullscreen mode

HAProxy servisi tekrar başlatılır ve çalışma durumu kontrol edilir.

systemctl restart haproxy
systemctl status haproxy
Enter fullscreen mode Exit fullscreen mode

Yapının Kontrol Edilmesi:

Aşağıdaki komut ile sistemin çalışıp çalışmadığı kontrol edilir.

patronictl -c /etc/patroni.yml list
Enter fullscreen mode Exit fullscreen mode

Bu komutun çıktısı aşağıdaki gibi olmalıdır.

Image description

Ö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

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .