Liman MYS - Cihaz Yönetimi Yedekli Miço Ortamı Hazırlanması

Yaren Sarı - Aug 26 - - Dev Community

Bu yazıda Cihaz Yönetimi (Mico-Server) yedekli ortam kurulumu ve konfigürasyonlarını ele alacağız.

Aynı zamanda yedekli Liman ortamınız da mevcutsa senkronizasyonu için bu yazıdan yararlanabilirsiniz:

Liman MYS ve Eklenti Senkronizasyonu: Yüksek Erişilebilirlik için Temel Adımlar

Bu yapıda;

  • HA Proxy
  • ETCD
  • Patroni
  • Liman MYS
  • Mico-server kullanılacaktır.

Yapacağımız örneğin mimarisi şu şekildedir:

Image description

Liman MYS ve Mico Server Kurulumu

Öncelikle Liman MYS kurulumu için aşağıdaki siteden gerekli adımları izleyebilirsiniz.

Liman MYS Kurulumu

Sonrasında her iki sunucuda da Miço serverların kurulumunu gerçekleştirelim:

sudo apt install ./mico-x64.deb
Enter fullscreen mode Exit fullscreen mode

Mico Database Backup Alınması

cd /tmp
sudo -u mico pg_dump mico > /tmp/mico_backup.sql
Enter fullscreen mode Exit fullscreen mode
  • Bu komut ile mico veritabanının yedeğini almış olduk.

Bu kurulumlar esnasında postgresql kurulumu otomatik olarak gerçekleşmektedir. Eğer ki Liman sunucusunda da bir Patroni bulundurup diğer Patroni'ler ile beraber çalışmasını isterseniz; postgresql sürümlerinin aynı olması gerekmektedir. Liman MYS postgresql 15, Mico server ise postgresql 14 kullanmaktadır. Biz örnek olması adına bu durum için yine de Mico sunucularımıza postgresql-15 kurulumu yaparak devam edeceğiz:

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-get install postgresql-15
Enter fullscreen mode Exit fullscreen mode

Patroni Kurulum ve Konfigürasyonları

Şimdi ise Mico sunucularımıza Patroni kurulumlarını gerçekleştirelim.

sudo apt update
sudo apt -y install patroni
Enter fullscreen mode Exit fullscreen mode

PostgreSQL dosyalarına kolay erişebilmek için aşağıdaki gibi linkleyelim.

ln -s /usr/lib/postgresql/15/bin/* /usr/sbin/
Enter fullscreen mode Exit fullscreen mode

Patroni için verilerin tutulacağı dizinleri oluşturup yetkilendirme işlemlerini gerçekleştirelim.

sudo mkdir -p /data/patroni
sudo chown -R postgres:postgres /data/
sudo chmod -R 700 /data/
Enter fullscreen mode Exit fullscreen mode

İki node yapsı için de /etc/patroni.yml dosyasını oluşturup düzenleyelim:

sudo nano /etc/patroni.yml
Enter fullscreen mode Exit fullscreen mode
scope: development
namespace: /db/
name: node-1

restapi:
    listen: 192.168.122.81:8008
    connect_address: 192.168.122.81:8008

etcd:
    host: 192.168.122.140: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 192.168.122.81/0 md5
    - host replication replicator 192.168.122.77/0 md5
    - host all all 0.0.0.0/0 md5

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

postgresql:
    listen: 192.168.122.81:5432
    connect_address: 192.168.122.81:5432
    data_dir: /data/patroni
    pgpass: /tmp/pgpass
    bin_dir: /usr/lib/postgresql/15/bin
    authentication:
        replication:
            username: replicator
            password: '1'
        superuser:
            username: postgres
            password: '1'
    parameters:
        unix_socket_directories: '.'

tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false
Enter fullscreen mode Exit fullscreen mode

İki node için de aslında aynı konfigürasyonu yapacağız, node-1 yerine node-2 ve IP bilgilerini değiştirmemiz yeterlidir.

Yine iki node için de Patroni servisinin dosyasını (/etc/systemd/system/patroni.service) aşağıdaki gibi oluşturabilir veya düzenleyelim.

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

Sonrasında servisi sistem açıldığında çalışacak şekide başlatmak için aşağıdaki komutları çalıştıralım:

systemctl daemon-reload
systemctl stop postgresql
systemctl restart patroni
systemctl status patroni
systemctl enable patroni
Enter fullscreen mode Exit fullscreen mode

NOT: Bu etapta patroniniz çalışmayacaktır, etcd gibi diğer kurulumları gerçekleştirdikten sonra düzelmesi beklenir.

Postgresql servisini durdurup Patroni'yi başlatmış olduk.

Mico servisimiz şuanda Patroni ortamına bağlı çalıştığına göre; Patroni'de mico db'si oluşturalım:

// psql -U postgres -h 192.168.122.81 -p 5432
CREATE DATABASE mico;
CREATE USER mico WITH PASSWORD '1';
GRANT ALL PRIVILEGES ON DATABASE mico TO mico;
ALTER DATABASE mico OWNER TO mico;
Enter fullscreen mode Exit fullscreen mode

Aldığımız yedeği de yine Patroni'ye restore edebiliriz:

psql -U mico -h 192.168.122.81 -p 5432 -d mico -f /tmp/mico_backup.sql
Enter fullscreen mode Exit fullscreen mode

HAproxy Kurulum ve Konfigürasyonu

Liman sunucusunda HAproxy kurulumu gerçekleştirelim:

sudo apt install haproxy
Enter fullscreen mode Exit fullscreen mode
sudo nano /etc/haproxy/haproxy.cfg
Enter fullscreen mode Exit fullscreen mode
global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

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
    mode tcp
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server node-2 192.168.122.81:5432 maxconn 100 check port 8008
    server node-3 192.168.122.77:5432 maxconn 100 check port 8008

frontend http_frontend
    mode http
    bind *:7779 ssl crt  /etc/ssl/private/mico.pem alpn h2,http/1.1  ssl-min-ver TLSv1.2
    option http-server-close

    # set HTTP Strict Transport Security (HTST) header
    http-response add-header Strict-Transport-Security max-age=15768000

    default_backend http_servers

backend http_servers
    mode http
    balance roundrobin
    option ssl-hello-chk
    server backendserver1 192.168.122.81:7779 ssl verify none check
    server backendserver2 192.168.122.77:7779 ssl verify none check
Enter fullscreen mode Exit fullscreen mode

Bu kısımda görmüş olduğunuz frontend http_frontend ve backend http_servers yapılandırmaları mico sunucularımız için haproxy ayarlarıdır.

  • Frontend ayarında gördüğümüz /etc/ssl/private/mico.pem sertifikasını Haproxy sunucusunda üretmemiz gerekmektedir:
openssl req -x509 -newkey rsa:4096 -subj "/CN=$(hostname -I | cut -d" " -f1 | xargs)" -addext "subjectAltName=IP:$(hostname -I | cut -d" " -f1 | xargs),IP:127.0.0.1,DNS:$(hostname)" -keyout /etc/ssl/private/mico.pem -nodes -out /etc/ssl/private/mico.pem -sha256 -days 358000
Enter fullscreen mode Exit fullscreen mode
root@sysadmin:/home/sysadmin# haproxy -f /etc/haproxy/haproxy.cfg -c
Configuration file is valid
Enter fullscreen mode Exit fullscreen mode

Komutu ile de yapılandırmamızda sorun olup olmadığının kontrolünü sağlayabiliriz.

Şimdi ise haproxy'imizi restart edip durumunu kontrol edebiliriz:

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

Etcd Kurulum ve Konfigürasyonu

sudo apt install etcd
Enter fullscreen mode Exit fullscreen mode
  • Komutu ile etcd kurulumu gerçekleştirebiliriz.

Sonrasında /etc/default/etcd dosyasını şu şekilde düzenleyelim:

ETCD_LISTEN_PEER_URLS="http://192.168.122.140:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.122.140:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.122.140:2380"
ETCD_INITIAL_CLUSTER="default=http://192.168.122.140:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.122.140:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
Enter fullscreen mode Exit fullscreen mode
systemctl restart etcd
systemctl status etcd
systemctl enable etcd
Enter fullscreen mode Exit fullscreen mode

Şu komut ile de cluster sağlıklarını gözlemleyebiliriz:

etcdctl cluster-health
Enter fullscreen mode Exit fullscreen mode

Mico Sunucularının .env Ayarları

Mico sunucularında Database bilgilerini /opt/mico/.env içerisine girerek değiştirelim:

DB_HOST=192.168.122.140
DB_PORT=5000
DB_DATABASE=mico
DB_USERNAME=mico
DB_PASSWORD=1
Enter fullscreen mode Exit fullscreen mode

DB_HOST bilgisi HAproxy'imizin adresidir.
DB_PORT bilgisi de HAproxy'de belirttiğimiz port bilgisidir. (bind *:5000)
Diğer database bilgileri ise bizim Patroni'de oluşturduğumuz Mico DB bilgileridir.

Son durumda kurulum ve konfigürasyonlarımızı bitirdik, Patroni ve Mico hizmetlerini yeniden başlatarak durumlarını kontrol edebiliriz:

systemctl restart mico@*
systemctl restart patroni
systemctl status mico@*
systemctl status patroni
Enter fullscreen mode Exit fullscreen mode
root@sysadmin:/home/sysadmin# patronictl -c /etc/patroni.yml list
+ Cluster: development (7407394821390110066) ---+----+-----------+
| Member | Host           | Role    | State     | TL | Lag in MB |
+--------+----------------+---------+-----------+----+-----------+
| node-1 | 192.168.122.81 | Leader  | running   |  2 |           |
| node-2 | 192.168.122.77 | Replica | streaming |  2 |         0 |
+--------+----------------+---------+-----------+----+-----------+
Enter fullscreen mode Exit fullscreen mode
  • Komutu ile de node'larımızı ve durumlarını görüntüleyebiliriz.

Test Aşaması

Normalde mico serverlarımız için ajan kurulumu yaparken server IP bilgisi kullanılır. Bizim case'imize bakıldığında HAproxy üzerinden iki Mico servisine de eriştiğimiz için; Ajan kurulumunu yaparken HAproxy adresini kullanmalıyız:

#!/bin/bash
  wget "https://192.168.122.140:7779/client?os=linux&arch=amd64" -O "/tmp/mico-client.deb" --no-check-certificate
  echo mico mico/server_url string "https://192.168.122.140:7779" | sudo debconf-set-selections
  export DEBIAN_FRONTEND=noninteractive
  sudo apt install /tmp/mico-client.deb -y

  rm -rf "/tmp/mico-client.deb"
Enter fullscreen mode Exit fullscreen mode
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .