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:
Liman MYS ve Mico Server Kurulumu
Öncelikle Liman MYS kurulumu için aşağıdaki siteden gerekli adımları izleyebilirsiniz.
Sonrasında her iki sunucuda da Miço serverların kurulumunu gerçekleştirelim:
sudo apt install ./mico-x64.deb
Mico Database Backup Alınması
cd /tmp
sudo -u mico pg_dump mico > /tmp/mico_backup.sql
- 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
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
PostgreSQL dosyalarına kolay erişebilmek için aşağıdaki gibi linkleyelim.
ln -s /usr/lib/postgresql/15/bin/* /usr/sbin/
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/
İki node yapsı için de /etc/patroni.yml dosyasını oluşturup düzenleyelim:
sudo nano /etc/patroni.yml
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
İ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
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
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;
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
HAproxy Kurulum ve Konfigürasyonu
Liman sunucusunda HAproxy kurulumu gerçekleştirelim:
sudo apt install haproxy
sudo nano /etc/haproxy/haproxy.cfg
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
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
root@sysadmin:/home/sysadmin# haproxy -f /etc/haproxy/haproxy.cfg -c
Configuration file is valid
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
Etcd Kurulum ve Konfigürasyonu
sudo apt install etcd
- 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"
systemctl restart etcd
systemctl status etcd
systemctl enable etcd
Şu komut ile de cluster sağlıklarını gözlemleyebiliriz:
etcdctl cluster-health
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
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
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 |
+--------+----------------+---------+-----------+----+-----------+
- 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"