Vytvorenie clustera PostgreSQL vysokej dostupnosti pomocou Patroni, etcd, HAProxy

Stalo sa, že v čase, keď som mal úlohu, som nemal dostatočné skúsenosti na to, aby som tento projekt vyvinul a spustil sám. Tak som začal hľadať na internete.

Neviem, v čom je problém, ale už opakovane sa stretávam s tým, že aj keď robím všetko krok po kroku ako v návode a pripravím rovnaké prostredie ako autor, aj tak nič nefunguje. Nemám potuchy, v čom je tu problém, ale keď som sa s tým opäť stretol, rozhodol som sa – napíšem svoj návod, keď všetko bude fungovať. Ten, ktorý určite bude fungovať.

Návody na internete

Stalo sa, že internet netrpí nedostatkom rôznych návodov, priručiek, krok-za-krokom a podobných vecí. Stalo sa, že mi bola zadaná úloha vyvinúť riešenie pre pohodlnú organizáciu a vybudovanie vysoko dostupného PostgreSQL klasteru, s hlavnými požiadavkami na tokovú replikáciu z Master servera na všetky repliky a automatické spustenie rezervy pri zlyhaní Master servera.

V tomto kroku bol definovaný technologický stack:

  • PostgreSQL ako databázový systém
  • Patroni ako riešenie pre klasterizáciu
  • etcd ako distribuované úložisko pre Patroni
  • HAproxy na organizáciu jednotného vstupu pre aplikácie, ktoré používajú databázu

Inštalácia

Predstavujeme vám budovanie PostgreSQL klasteru vysokej dostupnosti s použitím Patroni, etcd, HAProxy.

Všetky operácie sa vykonávali na virtuálnych strojoch so systémom Debian 10.

etcd

Odporúčam nenainštalovať etcd na tie isté stroje, kde bude Patroni a PostgreSQL, pretože pre etcd je veľmi dôležitá záťaž na disky. Ale na účely vzdelávania to spravíme práve takto.
Nainštalujeme etcd.

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

Pridajte obsah do súboru /etc/default/etcd

[member]

ETCD_NAME=datanode1 # názov vašej mašiny
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

VŠETKY IP ADRESY MUSIA BYŤ PLATNÉ. LISTER PEER, CLIENT atď. MUSÍ BYŤ NASTAVENÝ NA IP ADRESU HOSTITEĽA

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380" # adresa vašej mašiny
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379" # adresa vašej mašiny

[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380" # adresa vašej mašiny
ETCD_INITIAL_CLUSTER="datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380" # adresy všetkých strojov v clustri etcd
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379" # adresa vašej mašiny

Vykonajte príkaz

systemctl restart etcd

PostgreSQL 9.6 + Patroni

Prvým krokom je nainštalovať tri virtuálne stroje, na ktoré nainštalujete potrebný softvér. Po inštalácii strojov, ak sledujete môj návod, môžete spustiť tento jednoduchý skript, ktorý (takmer) všetko urobí za vás. Spúšťa sa pod účtom root.

Všimnite si, že skript používa verziu PostgreSQL 9.6, čo je dané vnútornými požiadavkami našej spoločnosti. Riešenie nebolo testované na iných verziách 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

Ďalej je potrebné umiestniť nasledujúci obsah do práve vytvoreného súboru /etc/patroni.yml, samozrejme s úpravou IP adries vo všetkých prípadoch na adresy, ktoré používate vy.
Všimnite si komentáre v tomto yaml. Zmeňte adresy na svoje, na každom stroji klastru.

/etc/patroni.yml

rozsah: pgsql # musí byť rovnaký na všetkých nodoch
meno: /cluster/ # musí byť rovnaký na všetkých nodoch
názov: postgres1 # musí byť odlišný na všetkých nodoch

restapi:
    počúvaj: 192.168.0.143:8008 # adresa tejto nody, na ktorej sa nachádza tento súbor
    adresa_pripojenia: 192.168.0.143:8008 # adresa tejto nody, na ktorej sa nachádza tento súbor

etcd:
    hostitelia: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # vymenujte tu všetky vaše nody, ak ich inštalujete aj na nich

# táto sekcia (bootstrap) bude zapísaná do Etcd:/<namespace>/<scope>/config po inicializácii nového klasteru
# všetci ostatní členovia klasteru ju budú používať ako `globálnu konfiguráciu`
bootstrap:
    dcs:
        ttl: 100
        slučka_čakania: 10
        časový_limit_opakovania: 10
        maximálny_oneskorenie_po_vyhodení: 1048576
        postgresql:
            použitie_pg_rewind: true
            použitie_slots: true
            parametre:
                    wal_level: replica
                    hot_standby: "on"
                    wal_keep_segments: 5120
                    max_wal_senders: 5
                    max_replication_slots: 5
                    checkpoint_timeout: 30

    initdb:
    - kódovanie: UTF8
    - kontrola_dát
    - lokalizácia: en_US.UTF8
    # init pg_hba.conf musí obsahovať adresy VŠETKÝCH strojov použitých v klasteri
    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

    používatelia:
        admin:
            heslo: admin
            možnosti:
                - createrole
                - createdb

postgresql:
    počúvaj: 192.168.0.143:5432 # adresa tejto nody, na ktorej sa nachádza tento súbor
    adresa_pripojenia: 192.168.0.143:5432 # adresa tejto nody, na ktorej sa nachádza tento súbor
    data_dir: /data/patroni # tento priečinok vytvorí skript, opísaný vyššie a nastaví potrebné práva
    bin_dir: /usr/lib/postgresql/9.6/bin # uveďte cestu k vášmu priečinku s postgresql
    pgpass: /tmp/pgpass
    autentifikácia:
        replikácia:
            užívateľské meno: postgres
            heslo: postgres
        superužívateľ:
            užívateľské meno: postgres
            heslo: postgres
    create_replica_methods:
        basebackup:
            checkpoint: 'fast'
    parametre:
        unix_socket_directories: '.'

tagy:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false

Skript treba spustiť na všetkých troch strojoch klasteru, presne tak isto je potrebné umiestniť danú konfiguráciu do súboru /etc/patroni.yml na všetkých strojoch.

Keď dokončíte tieto operácie na všetkých strojoch klasteru, vykonajte nasledujúci príkaz na ktoromkoľvek z nich

systemctl start patroni
systemctl start postgresql

Počkajte asi 30 sekúnd, potom vykonajte tento príkaz na ostatných strojoch klasteru.

HAproxy

Používame skvelý HAproxy na poskytovanie jedinečného vstupu. Master-server bude vždy dostupný na adrese stroja, na ktorom je rozložený HAproxy.

Aby ste sa vyhli tomu, aby sa stroj s HAproxy stal jediným bodom zlyhania, spustíme ho v kontejnery Docker, neskôr ho môžeme spustiť v klastri K8’s a urobiť náš odolný klaster ešte spoľahlivejším.

Vytvorte adresár, kde budete môcť uložiť dva súbory — Dockerfile a haproxy.cfg. Prejdite do neho.

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

Buďte opatrní, v posledných troch riadkoch súboru haproxy.cfg musia byť uvedené adresy vašich strojov. HAproxy bude komunikovať s Patroni, v HTTP hlavičkách master server vždy vráti 200, zatiaľ čo replica vráti 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

Nachádzajúc sa v adresári, kde sú uložené oba naše súbory, vykonáme postupne príkazy na zabalenie kontajnera a jeho spustenie s presmerovaním potrebných portov:

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

Teraz, keď otvoríte vo vašom prehliadači adresu vášho stroja s HAproxy a zadáte port 7000, uvidíte štatistiku vášho klastra.

V stave UP bude ten server, ktorý je master, zatiaľ čo repliky budú v stave DOWN. To je normálne, v skutočnosti fungujú, ale zobrazujú sa takto, pretože vracajú 503 na požiadavky od HAproxy. To nám umožňuje vždy presne vedieť, ktorý z troch serverov je aktuálne master.

Záver

Ste úžasní! Len za 30 minút ste nasadili vynikajúci odolný a výkonový klaster databáz s prúdením replikácie a automatickým preberaním záloh. Ak plánujete používať toto riešenie, oboznámte sa s oficiálnou dokumentáciou Patroni, najmä s jej časťou o nástroji patronictl, ktorý poskytuje pohodlný prístup k správe vášho klastra.

Gratulujem!

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster