Custruì un cluster PostgreSQL d'alta dispunibilità utilizendu Patroni, etcd, HAProxy

Hè accadutu cusì chì à u mumentu chì u prublema hè stata pusata, ùn aghju micca abbastanza sperienza per sviluppà è lancià sta suluzione solu. E poi aghju cuminciatu à Google.

Ùn sò micca sapè quale hè a cattura, ma per l'ennesima volta aghju scontru u fattu chì ancu s'è vo fate tuttu u passu à passu cum'è in u tutoriale, preparate u stessu ambiente cum'è l'autore, sempre ùn funziona mai. Ùn aghju micca idea di ciò chì hè a materia, ma quandu aghju scontru in questu novu, aghju decisu - è scriveraghju u mo tutorialu quandu tuttu funziona. Unu chì certamenti travaglià.

Guide in Internet

Hè cusì chì l'Internet ùn soffre micca di una mancanza di diverse guide, tutorials, step-by-steps è simili. Hè accadutu chì mi hè statu datu u compitu di sviluppà una soluzione per urganizà è custruisce un cluster di failover PostgreSQL, i requisiti principali per i quali eranu streaming replicazione da u servitore Master à tutte e rèpliche è fallback automaticu quandu u servitore Master falla.

In questu stadiu, a pila di tecnulugia utilizata hè stata determinata:

  • PostgreSQL cum'è DBMS
  • Patroni cum'è una soluzione di clustering
  • etcd cum'è magazzinu distribuitu per Patroni
  • HAproxy per urganizà un puntu di entrata unicu per l'applicazioni chì utilizanu a basa di dati

rimarchevuli

A vostra attenzione hè di custruisce un cluster PostgreSQL d'alta dispunibilità utilizendu Patroni, etcd, HAProxy.

Tutte l'operazioni sò state realizate nantu à e macchine virtuali cù Debian 10 OS installatu.

eccd

Ùn ricumandemu micca di installà etcd nantu à e stesse macchine induve patroni è postgresql seranu situati, postu chì a carica di discu hè assai impurtante per etcd. Ma per scopi educativi, faremu cusì.
Installa etcd.

#!/bin/bash
apt-get update
apt-get install etcd

Aghjunghjite u cuntenutu à u schedariu /etc/default/etcd

[membru]

ETCD_NAME=datanode1 # hostname di a vostra macchina
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

TUTTI L'INDIRIZZI IP DEVERU ESSERE VALIDI. LISTER PEER, CLIENT, etc. DEVU ESSERE SETTU À L'INDIRIZZI IP DI L'Ospitu

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # indirizzu di a vostra macchina
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # indirizzu di a vostra macchina

[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # indirizzu di a vostra macchina
ETCD_INITIAL_CLUSTER="datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # indirizzi di tutte e macchine in u cluster etcd
ETCD_INITIAL_CLUSTER_STATE = "novu"
ETCD_INITIAL_CLUSTER_TOKEN = "etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # indirizzu di a vostra macchina

Eseguite u cumandamentu

systemctl restart etcd

PostgreSQL 9.6 + patroni

A prima cosa da fà hè di stallà trè macchine virtuali per installà u software necessariu nantu à elli. Dopu a stallazione di e macchine, se seguite u mo tutoriale, pudete eseguisce stu script simplice chì farà (quasi) tuttu per voi. Funziona cum'è root.

Per piacè nutate chì u script usa a versione PostgreSQL 9.6, questu hè dovutu à i bisogni interni di a nostra cumpagnia. A suluzione ùn hè micca stata pruvata in altre versioni di PostgreSQL.

#!/bin/bash
apt-get install gnupg -y
echo "deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main" >> /etc/apt/sources.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt-get update
apt-get install postgresql-9.6 python3-pip python3-dev libpq-dev -y
systemctl stop postgresql
pip3 install --upgrade pip
pip install psycopg2
pip install patroni[etcd]
echo "
[Unit]
Description=Runners to orchestrate a high-availability PostgreSQL
After=syslog.target network.target

[Service]
Type=simple

User=postgres
Group=postgres

ExecStart=/usr/local/bin/patroni /etc/patroni.yml

KillMode=process

TimeoutSec=30

Restart=no

[Install]
WantedBy=multi-user.targ
" > /etc/systemd/system/patroni.service
mkdir -p /data/patroni
chown postgres:postgres /data/patroni
chmod 700 /data/patroniпо
touch /etc/patroni.yml

In seguitu, in u schedariu /etc/patroni.yml chì avete appena creatu, avete bisognu di mette u cuntenutu seguente, di sicuru cambiendu l'indirizzi ip in tutti i posti à l'indirizzi chì utilizate.
Prestate attenzione à i cumenti in questu yaml. Cambia l'indirizzi à u vostru propiu, in ogni macchina in u cluster.

/etc/patroni.yml

scope: pgsql # должно быть одинаковым на всех нодах
namespace: /cluster/ # должно быть одинаковым на всех нодах
name: postgres1 # должно быть разным на всех нодах

restapi:
    listen: 192.168.0.143:8008 # адрес той ноды, в которой находится этот файл
    connect_address: 192.168.0.143:8008 # адрес той ноды, в которой находится этот файл

etcd:
    hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # перечислите здесь все ваши ноды, в случае если вы устанавливаете etcd на них же

# this section (bootstrap) will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster
# and all other cluster members will use it as a `global configuration`
bootstrap:
    dcs:
        ttl: 100
        loop_wait: 10
        retry_timeout: 10
        maximum_lag_on_failover: 1048576
        postgresql:
            use_pg_rewind: true
            use_slots: true
            parameters:
                    wal_level: replica
                    hot_standby: "on"
                    wal_keep_segments: 5120
                    max_wal_senders: 5
                    max_replication_slots: 5
                    checkpoint_timeout: 30

    initdb:
    - encoding: UTF8
    - data-checksums
    - locale: en_US.UTF8
    # init pg_hba.conf должен содержать адреса ВСЕХ машин, используемых в кластере
    pg_hba:
    - host replication postgres ::1/128 md5
    - host replication postgres 127.0.0.1/8 md5
    - host replication postgres 192.168.0.143/24 md5
    - host replication postgres 192.168.0.144/24 md5
    - host replication postgres 192.168.0.145/24 md5
    - host all all 0.0.0.0/0 md5

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

postgresql:
    listen: 192.168.0.143:5432 # адрес той ноды, в которой находится этот файл
    connect_address: 192.168.0.143:5432 # адрес той ноды, в которой находится этот файл
    data_dir: /data/patroni # эту директорию создаст скрипт, описанный выше и установит нужные права
    bin_dir:  /usr/lib/postgresql/9.6/bin # укажите путь до вашей директории с postgresql
    pgpass: /tmp/pgpass
    authentication:
        replication:
            username: postgres
            password: postgres
        superuser:
            username: postgres
            password: postgres
    create_replica_methods:
        basebackup:
            checkpoint: 'fast'
    parameters:
        unix_socket_directories: '.'

tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false

U script deve esse eseguitu nantu à e trè machini in u cluster, cum'è a cunfigurazione sopra deve esse posta in u schedariu /etc/patroni.yml in tutte e macchine.

Quandu avete fattu queste operazioni in tutte e macchine di cluster, eseguite u cumandimu seguitu nantu à qualsiasi di elli

systemctl start patroni
systemctl start postgresql

Aspettate circa 30 seconde, poi eseguite stu cumandamentu nantu à u restu di e macchine in u cluster.

HAproxy

Utilizemu u maravigliu HAproxy per furnisce un unicu puntu d'entrata. U servitore maestru serà sempre dispunibule à l'indirizzu di a macchina induve HAproxy hè implementatu.

Per ùn fà micca a macchina cù HAproxy un unicu puntu di fallimentu, l'avemu eseguitu in un containeru Docker, in u futuru serà pussibule di eseguisce in un cluster di K8 è rende u nostru cluster failover ancu più affidabile.

Crea un repertoriu induve pudete almacenà dui schedari - Dockerfile è haproxy.cfg. Andate in lu.

dockerfile

FROM ubuntu:latest

RUN apt-get update 
    && apt-get install -y haproxy rsyslog 
    && rm -rf /var/lib/apt/lists/*

RUN mkdir /run/haproxy

COPY haproxy.cfg /etc/haproxy/haproxy.cfg

CMD haproxy -f /etc/haproxy/haproxy.cfg && tail -F /var/log/haproxy.log

Attenti, l'ultime trè linee di u schedariu haproxy.cfg deve liste l'indirizzi di e vostre macchine. HAproxy hà da cuntattà Patroni, in l'intestazione HTTP u servitore maestru torna sempre 200, è a replica sempre torna 503.

haproxy.cfg

global
    maxconn 100

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
    option httpchk
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server postgresql1 192.168.0.143:5432 maxconn 100 check port 8008
    server postgresql2 192.168.0.144:5432 maxconn 100 check port 8008
    server postgresql3 192.168.0.145:5432 maxconn 100 check port 8008

Essendu in u cartulare in quale i nostri dui fugliali "si trovanu", eseguiremu sequenzialmente i cumandamenti per imballà u containeru, è ancu di lancià cù i porti necessarii trasmessi:

docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy 

Avà, quandu avete apertu l'indirizzu di a vostra macchina cù HAproxy in u navigatore è specificate u portu 7000, vi vede e statistiche per u vostru cluster.

U servitore chì hè u maestru serà in u statu UP, è e repliche seranu in u statu DOWN. Questu hè normale, in fattu funzionanu, ma sò affissati in questa forma per u fattu chì tornanu 503 nantu à e dumande da HAproxy. Questu ci permette di sapè sempre esattamente quale di i trè servitori hè u maestru attuale.

cunchiusioni

Sii splendida! In solu 30 minuti, avete implementatu un grande failover è un cluster di basa di dati di rendiment cù replicazione in streaming è failover automaticu. Se pensa à aduprà sta suluzione, vede cù a documentazione ufficiale di Patroni, è soprattuttu cù a so parte in quantu à l'utilità patronictl, chì furnisce un accessu convenientu à gestisce u vostru cluster.

Congratulazioni!

Source: www.habr.com

Add a comment