Oracle Linux 8.8'de Yedekli Yapıya Node Nasıl Eklenir?
Published: 2023-12-08 08:12:58

Bu yazıda, Oracle Linux'ta oluşturulan yedekli yapıya yeni node (node-2 ve node-3) nasıl eklenir göreceğiz. 

> Yedekli yapının nasıl oluşturulacağını aşağıdaki yazıda bulabilirsiniz: 
https://dev.to/aciklab/oracle-linux-88de-postgresql-13-yedekli-yapi-nasil-kurulur-patroni-etcd-haproxy-4711

### Node-2

- Yapıya eklenecek olan makineye `ssh` ile bağlanılır.
- İlk yazıdaki gibi PostgreSQL ve Patroni kurulumları yapılır.

> PostgreSQL'de oluşturulan kullanıcı ve şifrelerin **aynı** olmasına dikkat edilmelidir.

- İkinci makinedeki **/etc/patroni.yml** dosyasına `nano` ile girilir ve aşağıdaki gibi düzenlenir.
```
scope: development
namespace: /db/
name: node-2

restapi:
    listen: <node-2-ip-adresi>:8008
    connect_address: <node-2-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-2-ip-adresi>:/0 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-2-ip-adresi>:5432
    connect_address: <node-2-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
```
> İkinci makinedeki **/etc/systemd/system/patroni.service** dosyası birinci makinedeki gibi düzenlenmelidir.

Birinci makineye `ssh` ile bağlanılır ve aşağıdaki konfigürasyon dosyalarında ikinci düğümü eklemek için gereken düzenlemeler yapılır:
- **/etc/patroni.yml** dosyasına `nano` ile girilir ve aşağıdaki gibi düzenlenir.
```
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 replication replicator <node-2-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/etcd/etcd.conf** dosyasına `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="etcd-1=http://<node-1-ip-adresi>:2380,etcd-2=http://<node-2-ip-adresi>:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://<node-1-ip-adresi>:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
```
- **/etc/haproxy/haproxy.cfg** dosyasına `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
    server psql-node-2 <node-2-ip-adresi>:5432 maxconn 100 check port 8008
```
- Birinci makinedeki servisler tekrar başlatılır ve çalışma durumları kontrol edilir.
```
systemctl restart haproxy
systemctl status hasproxy
systemctl restart etcd
systemctl status etcd
systemctl restart patroni
systemctl status patroni
```
- İkinci makinedeki servis dosyaları yeniden yüklenir. PostgreSQL durdurulur. Patroni tekrar başlatılır ve çalışma durumu kontrol edilir.
```
systemctl daemon-reload
systemctl stop postgresql-13
systemctl restart patroni
systemctl status patroni
```
> Servislerin loglarında hata alınıyorsa güvenlik duvarından kaynaklı olabilir. `systemctl stop firewalld` komutuyla güvenlik duvarı durdurulabilir.

- Her iki makinedeki tüm servislerin başarılı olarak çalıştığı kontrol edildikten sonra yedekli yapı aşağıdaki komutla, her iki makineden de kontrol edilebilir.
```
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/86ssddvxz09mgwhjx3ht.png)

> Lider durumundaki patroni tekrar başlatıldığında eklenen ikinci makine lider durumuna geçmelidir. 
```
systemctl restart patroni
patronictl -c /etc/patroni.yml list
```

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

### Node-3

- Yapıya eklenecek olan makineye `ssh` ile bağlanılır.
- İlk yazıdaki ve ikinci makinede yapıldığı gibi PostgreSQL ve Patroni kurulumları yapılır.

> PostgreSQL'de oluşturulan kullanıcı ve şifrelerin **aynı** olmasına dikkat edilmelidir.

- Üçüncü makinedeki **/etc/patroni.yml** dosyasına `nano` ile girilir ve aşağıdaki gibi düzenlenir.
```
scope: development
namespace: /db/
name: node-3

restapi:
    listen: <node-3-ip-adresi>:8008
    connect_address: <node-3-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-3-ip-adresi>:/0 md5
    - host replication replicator <node-1-ip-adresi>:/0 md5
    - host replication replicator <node-2-ip-adresi>:/0 md5
    - host all all 0.0.0.0/0 md5

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

postgresql:
    listen: <node-3-ip-adresi>:5432
    connect_address: <node-3-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

```

> Üçüncü makinedeki **/etc/systemd/system/patroni.service** dosyası da birinci ve ikinci makinedekiler gibi düzenlenmelidir.

- İkinci makineye `ssh` ile bağlanılır ve **/etc/patroni.yml**  dosyasına `nano` ile girilir ve üçüncü düğüm, aşağıdaki gibi eklenir. 
```
scope: development
namespace: /db/
name: node-2

restapi:
    listen: <node-2-ip-adresi>:8008
    connect_address: <node-2-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-2-ip-adresi>:/0 md5
    - host replication replicator <node-1-ip-adresi>:/0 md5
    - host replication replicator <node-3-ip-adresi>:/0 md5
    - host all all 0.0.0.0/0 md5

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

postgresql:
    listen: <node-2-ip-adresi>:5432
    connect_address: <node-2-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
```

Birinci makineye `ssh` ile bağlanılır ve aşağıdaki konfigürasyon dosyalarında üçüncü düğümü eklemek için gereken düzenlemeler yapılır:
- **/etc/patroni.yml** dosyasına `nano` ile girilir ve aşağıdaki gibi düzenlenir.
```
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 replication replicator <node-2-ip-adresi>/0 md5
    - host replication replicator <node-3-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/etcd/etcd.conf** dosyasına `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="etcd-1=http://<node-1-ip-adresi>:2380,etcd-2=http://<node-2-ip-adresi>:2380,etcd-3=http://<node-3-ip-adresi>:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://<node-1-ip-adresi>:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
```

- **/etc/haproxy/haproxy.cfg** dosyasına `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
    server psql-node-2 <node-2-ip-adresi>:5432 maxconn 100 check port 8008
    server psql-node-3 <node-3-ip-adresi>:5432 maxconn 100 check port 8008
```

- Birinci makinedeki servisler tekrar başlatılır ve çalışma durumları kontrol edilir.
```
systemctl restart haproxy
systemctl status hasproxy
systemctl restart etcd
systemctl status etcd
systemctl restart patroni
systemctl status patroni
```
- İkinci makinedeki Patroni tekrar başlatılır ve çalışma durumu kontrol edilir.
```
systemctl restart patroni
systemctl status patroni
```
- Üçüncü makinedeki servis dosyaları yeniden yüklenir. PostgreSQL durdurulur. Patroni tekrar başlatılır ve çalışma durumu kontrol edilir.
```
systemctl daemon-reload
systemctl stop postgresql-13
systemctl restart patroni
systemctl status patroni
```
> Servislerin loglarında hata alınıyorsa güvenlik duvarından kaynaklı olabilir. `systemctl stop firewalld` komutuyla güvenlik duvarı durdurulabilir.

- Her üç makinedeki tüm servislerin başarılı olarak çalıştığı kontrol edildikten sonra yedekli yapı aşağıdaki komutla, her üç makineden de kontrol edilebilir.
```
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/s6024y0yv9y4w3g1xaa9.png)

> Lider durumundaki patroni tekrar başlatıldığında eklenen ikinci makine lider durumuna geçecektir. 
```
systemctl restart patroni
patronictl -c /etc/patroni.yml list
```

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

> İkinci makine lider durumundayken bu makinedeki patroni tekrar başlatılırsa da eklenen üçüncü makine lider duruma geçecektir.

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