Vytvorenie vysoko dostupného klastra PostgreSQL pomocou Patroni, etcd, HAProxy

Náhodou sa stalo, že v čase, keď sa problém objavil, som nemal dostatok skúseností na vývoj a spustenie tohto riešenia sám. A potom som začal googliť.

Neviem, v čom je háčik, ale už po niekoľkýkrát sa stretávam s tým, že aj keď robím všetko krok za krokom ako v návode, pripravím si rovnaké prostredie ako autor, tak nikdy nič nefunguje. Netuším, čo sa deje, ale keď som sa s tým znova stretol, rozhodol som sa, že keď všetko pôjde, napíšem svoj vlastný návod. Taký, ktorý bude určite fungovať.

Sprievodcovia na internete

Stáva sa, že internet netrpí nedostatkom rôznych návodov, tutoriálov, krok za krokom a podobne. Náhodou som dostal za úlohu vyvinúť riešenie na pohodlnú organizáciu a vybudovanie failover PostgreSQL klastra, ktorého hlavnými požiadavkami boli streamingová replikácia z Master servera na všetky repliky a automatické poskytovanie rezervy v prípade Master servera. zlyhanie.

V tejto fáze sa určilo množstvo použitých technológií:

  • PostgreSQL ako DBMS
  • Patroni ako klastrové riešenie
  • etcd ako distribuované úložisko pre Patroni
  • HAproxy na organizovanie jedného vstupného bodu pre aplikácie využívajúce databázu

Inštalácia

Pre vašu pozornosť - vytvorenie vysoko dostupného klastra PostgreSQL pomocou Patroni, etcd, HAProxy.

Všetky operácie boli vykonávané na virtuálnych strojoch s nainštalovaným OS Debian 10.

atď

Neodporúčam inštalovať etcd na tie isté počítače, kde budú umiestnené patroni a postgresql, pretože zaťaženie disku je pre etcd veľmi dôležité. Ale na vzdelávacie účely to urobíme.
Poďme nainštalovať etcd.

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

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

[člen]

ETCD_NAME=datanode1 # názov hostiteľa vášho počítača
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”

VŠETKY IP ADRESY BY MALI BYŤ PLATNÉ. LISTER PEER, KLIENT atď. BY MALI BYŤ NASTAVENÉ NA IP ADRESU HOSTITEĽA

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # adresa vášho auta
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # adresa vášho auta

[skupina]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # adresa vášho auta
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 počítačov v klastri etcd
ETCD_INITIAL_CLUSTER_STATE="nové"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-klaster-1″
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # adresa vášho auta

Spustite príkaz

systemctl restart etcd

PostgreSQL 9.6 + patróny

Prvá vec, ktorú musíte urobiť, je nastaviť tri virtuálne počítače, aby ste na ne nainštalovali potrebný softvér. Po inštalácii strojov, ak budete postupovať podľa môjho tutoriálu, môžete spustiť tento jednoduchý skript, ktorý (takmer) urobí všetko za vás. Beží ako root.

Upozorňujeme, že skript používa PostgreSQL verziu 9.6, je to kvôli interným požiadavkám 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, do súboru /etc/patroni.yml, ktorý ste práve vytvorili, musíte umiestniť nasledujúci obsah, samozrejme zmeniť adresy IP na všetkých miestach na adresy, ktoré používate.
Venujte pozornosť komentárom v tomto yaml. Zmeňte adresy na svoje vlastné na každom počítači v klastri.

/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

Skript musí byť spustený na všetkých troch počítačoch klastra a vyššie uvedená konfigurácia musí byť umiestnená aj v súbore /etc/patroni.yml na všetkých počítačoch.

Po dokončení týchto operácií na všetkých počítačoch v klastri spustite na ktoromkoľvek z nich nasledujúci príkaz

systemctl start patroni
systemctl start postgresql

Počkajte asi 30 sekúnd a potom spustite tento príkaz na zostávajúcich počítačoch v klastri.

HAproxy

Používame úžasné HAproxy, aby sme poskytli jediný vstupný bod. Hlavný server bude vždy dostupný na adrese stroja, na ktorom je nasadené HAproxy.

Aby sa stroj s HAproxy nestal jediným bodom zlyhania, spustíme ho v kontajneri Docker; v budúcnosti môže byť spustený do klastra K8 a náš klaster prepnutia pri zlyhaní bude ešte spoľahlivejší.

Vytvorte si adresár, do ktorého môžete uložiť dva súbory – Dockerfile a haproxy.cfg. Choďte do toho.

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í, posledné tri riadky súboru haproxy.cfg by mali uvádzať adresy vašich počítačov. HAproxy bude kontaktovať Patroni, v hlavičkách HTTP hlavný server vždy vráti 200 a replika vždy 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

Keďže sme v adresári, v ktorom „ležia oba naše súbory“, vykonáme postupne príkazy na balenie kontajnera, ako aj jeho spustenie s preposielaním potrebných portov:

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

Otvorením adresy vášho počítača pomocou HAproxy v prehliadači a zadaním portu 7000 sa vám zobrazia štatistiky o vašom klastri.

Server, ktorý je hlavným serverom, bude v stave UP a repliky budú v stave DOWN. To je normálne, v skutočnosti fungujú, ale objavujú sa takto, pretože vracajú 503 pre požiadavky od HAproxy. To nám umožňuje vždy presne vedieť, ktorý z troch serverov je aktuálny master.

Záver

Si úžasný! Len za 30 minút ste nasadili excelentný databázový klaster odolný voči chybám a vysokovýkonný databázový klaster so streamingovou replikáciou a automatickým núdzovým riešením. Ak plánujete použiť toto riešenie, pozrite sa s oficiálnou dokumentáciou Patroni, a najmä s jeho časťou týkajúcou sa utility patronictl, ktorá poskytuje pohodlný prístup k správe vášho klastra.

Gratulujem!

Zdroj: hab.com

Pridať komentár