Construirea unui cluster PostgreSQL de mare disponibilitate folosind Patroni, etcd, HAProxy

Se întâmplă că, la momentul stabilirii sarcinii, nu aveam suficientă experiență pentru a dezvolta și lansa această soluție singur. Așa că am început să caut pe Google.

Nu știu care este problema, dar de deja atâtea ori mă confrunt cu faptul că, chiar dacă urmez pașii așa cum sunt în tutorial, și pregătesc un mediu similar cu cel al autorului, nu funcționează niciodată. Nu am idee de ce se întâmplă asta, dar, când m-am confruntat din nou cu această situație, am decis să scriu un tutorial al meu, care să funcționeze cu siguranță.

Ghiduri pe Internet

Se întâmplă că internetul nu duce lipsă de diferite ghiduri, tutoriale, step-by-step și lucruri similare. Așa că mi s-a dat sarcina de a dezvolta o soluție pentru organizarea și construirea unui cluster PostgreSQL rezistent la erori, cu cerințele principale fiind replicarea în flux de pe serverul Master către toate replicile și introducerea automată a unui rezervă în caz de defectare a serverului Master.

În acest stadiu, a fost definit stiva de tehnologii utilizate:

  • PostgreSQL ca SGBD
  • Patroni ca soluție pentru clusterizare
  • etcd ca stocare distribuită pentru Patroni
  • HAproxy pentru organizarea unui punct unic de acces pentru aplicațiile care utilizează baza de date

Instalare

Vă prezentăm - construirea unui cluster PostgreSQL de mare disponibilitate folosind Patroni, etcd, HAProxy.

Toate operațiunile au fost efectuate pe mașini virtuale cu sistemul de operare Debian 10.

etcd

Nu recomand instalarea etcd pe aceleași mașini unde se află patroni și postgresql, deoarece pentru etcd este foarte importantă sarcina pe discuri. Dar, în scopuri educaționale, așa vom proceda.
Vom instala etcd.

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

Adăugați conținutul în fișierul /etc/default/etcd

[member]

ETCD_NAME=datanode1 # numele gazdei mașinii dumneavoastră
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

TOATE ADRESELE IP TREBUIE SĂ FIE VALIDE. LISTER PEER, CLIENT etc TREBUIE SĂ FIE SETATE PE ADRESA IP A GAZDEI

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380" # adresa mașinii dumneavoastră
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379" # adresa mașinii dumneavoastră

[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380" # adresa mașinii dumneavoastră
ETCD_INITIAL_CLUSTER="datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380" # adresele tuturor mașinilor din cluster etcd
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379" # adresa mașinii dumneavoastră

Executați comanda

systemctl restart etcd

PostgreSQL 9.6 + patroni

Primul lucru pe care trebuie să-l faci este să instalezi trei mașini virtuale pentru a instala software-ul necesar. După ce mașinile sunt instalate, dacă urmezi tutorialul meu, poți rula acest simplu script care va face (aproape) totul pentru tine. Se rulează din root.

Rețineți că scriptul folosește versiunea PostgreSQL 9.6, aceasta fiind datorată cerințelor interne ale companiei noastre. Soluția nu a fost testată pe alte versiuni de 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

Apoi, în fișierul tocmai creat /etc/patroni.yml trebuie să pui următorul conținut, desigur schimbând adresele IP în toate locurile, cu cele pe care le folosești tu.
Atenție la comentariile din acest yaml. Schimbă adresele cu ale tale, pe fiecare mașină din cluster.

/etc/patroni.yml

scope: pgsql # trebuie să fie același pe toate nodurile
namespace: \/cluster\/ # trebuie să fie același pe toate nodurile
name: postgres1 # trebuie să fie diferit pe toate nodurile

restapi:
    listen: 192.168.0.143:8008 # adresa nodului pe care se află acest fișier
    connect_address: 192.168.0.143:8008 # adresa nodului pe care se află acest fișier

etcd:
    hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # listați aici toate nodurile dvs., în cazul în care instalați etcd pe acestea

# această secțiune (bootstrap) va fi scrisă în Etcd:\/\/\/config după inițializarea noului cluster
# și toți ceilalți membri ai cluster-ului o vor folosi ca o `configurație globală`
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 trebuie să conțină adresele TUTUROR mașinilor utilizate în cluster
    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 # adresa nodului pe care se află acest fișier
    connect_address: 192.168.0.143:5432 # adresa nodului pe care se află acest fișier
    data_dir: \/data\/patroni # acest director va fi creat de scriptul descris mai sus și se vor stabili permisiunile necesare
    bin_dir:  \/usr\/lib\/postgresql\/9.6\/bin # specificați calea către directorul dvs. cu 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

Scriptul trebuie să fie executat pe toate cele trei mașini ale cluster-ului, la fel este necesar să plasați configurația dată în fișierul \/etc\/patroni.yml pe toate mașinile.

Când ați efectuat aceste operații pe toate mașinile cluster-ului, executați următoarea comandă pe oricare dintre ele

systemctl start patroni
systemctl start postgresql

Așteptați aproximativ 30 de secunde, apoi executați această comandă pe celelalte mașini ale cluster-ului.

HAproxy

Folosim minunatul HAproxy pentru a oferi un punct unic de acces. Serverul Master va fi întotdeauna disponibil la adresa mașinii pe care este implementat HAproxy.

Pentru a evita ca mașina cu HAproxy să devină un punct unic de eșec, o vom rula într-un container Docker, iar mai târziu, o putem porni într-un cluster K8’s pentru a face clusterul nostru rezistent la defecte și mai fiabil.

Creează un director în care vei putea stoca cele două fișiere — Dockerfile și haproxy.cfg. Accesează-l.

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

Fii atent, în ultimele trei linii ale fișierului haproxy.cfg trebuie să fie enumerate adresele mașinilor tale. HAproxy se va conecta la Patroni, iar în antetele HTTP serverul master va returna întotdeauna 200, iar replica — 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

Aflându-te în directorul în care se află ambele fișiere, vom executa secvențial comenzi pentru a împacheta containerul, precum și pentru a-l lansa cu redirecționarea porturilor necesare:

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

Acum, deschizând în browser adresa mașinii tale cu HAproxy și specificând portul 7000, vei vedea statistica pentru clusterul tău.

Serverul care se află în stare UP va fi cel care este master, iar replicile în stare DOWN. Este normal, de fapt ele funcționează, dar sunt afișate în acest mod deoarece returnează 503 la cererile de la HAproxy. Acest lucru ne permite să știm întotdeauna cu precizie care dintre cele trei servere este master în acel moment.

Concluzie

Ești fantastic! În doar 30 de minute ai implementat un cluster de baze de date excelent, rezistent la defecte și performant, cu replicare în flux și comutare automată. Dacă intenționezi să folosești această soluție, consultă-te cu documentația oficială Patroni, în special cu partea referitoare la utilitarul patronictl, care oferă un acces convenabil pentru gestionarea clusterului tău.

Felicitări!

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster