Gradnja visoko razpoložljive gruče PostgreSQL z uporabo Patronija itd., HAProxy

Zgodilo se je, da takrat, ko je bil problem zastavljen, nisem imel dovolj izkušenj, da bi sam razvil in lansiral to rešitev. In potem sem začel googlati.

Ne vem, v čem je caka, a že ko najstič se soočam z dejstvom, da tudi če naredim vse korak za korakom kot v vadnici, pripravim enako okolje kot avtor, potem nikoli nič ne deluje. Nimam pojma, kaj je narobe, a ko sem spet naletel na to, sem se odločil, da bom napisal svojo vadnico, ko bo vse delovalo. Takšen, ki bo zagotovo deloval.

Vodniki na internetu

Slučajno internet ne trpi zaradi pomanjkanja raznih vodnikov, tutorialov, korak za korakom in podobno. Zgodilo se je, da sem dobil nalogo razviti rešitev za priročno organizacijo in izgradnjo samodejne gruče PostgreSQL, katere glavne zahteve so bile pretočna replikacija z glavnega strežnika na vse replike in samodejno zagotavljanje rezerve v primeru glavnega strežnika. neuspeh.

Na tej stopnji je bil določen kup uporabljenih tehnologij:

  • PostgreSQL kot DBMS
  • Patroni kot rešitev za grozdenje
  • etcd kot porazdeljeno shranjevanje za Patroni
  • HAproxy za organiziranje enotne vstopne točke za aplikacije, ki uporabljajo bazo podatkov

Namestitev

Za vašo pozornost - izgradnja visoko razpoložljive gruče PostgreSQL z uporabo Patronija itd., HAProxy.

Vse operacije so bile izvedene na virtualnih strojih z nameščenim operacijskim sistemom Debian 10 OS.

itdd

Ne priporočam namestitve etcd na iste stroje, kjer bosta patroni in postgresql, saj je obremenitev diska zelo pomembna za etcd. Toda v izobraževalne namene bomo storili prav to.
Namestimo etcd.

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

Dodajte vsebino v datoteko /etc/default/etcd

[član]

ETCD_NAME=datanode1 # ime gostitelja vašega računalnika
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”

VSI NASLOVI IP MORAJO BITI VELJAVNI. LISTER PEER, CLIENT itd. MORA BITI NASTAVLJEN NA IP NASLOV GOSTITELJA

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # naslov vašega avtomobila
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # naslov vašega avtomobila

[gruča]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # naslov vašega avtomobila
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # naslovi vseh strojev v gruči etcd
ETCD_INITIAL_CLUSTER_STATE="novo"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-gruča-1″
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # naslov vašega avtomobila

Zaženite ukaz

systemctl restart etcd

PostgreSQL 9.6 + patroni

Prva stvar, ki jo morate narediti, je, da nastavite tri virtualne stroje, da na njih namestite potrebno programsko opremo. Po namestitvi strojev, če sledite moji vadnici, lahko zaženete ta preprost skript, ki bo (skoraj) naredil vse namesto vas. Zažene se kot root.

Upoštevajte, da skript uporablja različico PostgreSQL 9.6, kar je posledica notranjih zahtev našega podjetja. Rešitev ni bila testirana na drugih različicah 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

Nato morate v datoteko /etc/patroni.yml, ki ste jo pravkar ustvarili, postaviti naslednjo vsebino, seveda spremeniti naslove IP na vseh mestih na naslove, ki jih uporabljate.
Bodite pozorni na komentarje v tem yamlu. Spremenite naslove v svoje na vsakem računalniku v gruči.

/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 je treba zagnati na vseh treh napravah v gruči, zgornja konfiguracija pa mora biti nameščena tudi v datoteko /etc/patroni.yml na vseh napravah.

Ko zaključite te operacije na vseh računalnikih v gruči, zaženite naslednji ukaz na katerem koli od njih

systemctl start patroni
systemctl start postgresql

Počakajte približno 30 sekund, nato pa zaženite ta ukaz na preostalih računalnikih v gruči.

HAproxy

Za zagotavljanje ene same vstopne točke uporabljamo čudovit HAproxy. Glavni strežnik bo vedno na voljo na naslovu računalnika, na katerem je nameščen HAproxy.

Da stroj s HAproxyjem ne bo postal ena sama točka odpovedi, ga bomo zagnali v vsebniku Docker; v prihodnosti ga bo mogoče zagnati v gručo K8 in narediti našo gručo za odpoved še bolj zanesljivo.

Ustvarite imenik, kamor lahko shranite dve datoteki - Dockerfile in haproxy.cfg. Pojdi k temu.

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

Bodite previdni, zadnje tri vrstice datoteke haproxy.cfg bi morale vsebovati naslove vaših strojev. HAproxy bo stopil v stik s Patronijem, v glavah HTTP bo glavni strežnik vedno vrnil 200, replika pa bo vedno vrnila 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

V imeniku, v katerem "ležita" obe naši datoteki, zaporedno izvedemo ukaze za pakiranje vsebnika in ga zaženemo s posredovanjem potrebnih vrat:

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

Zdaj, ko odprete naslov vašega računalnika s HAproxy v brskalniku in določite vrata 7000, boste videli statistiko o vaši gruči.

Strežnik, ki je glavni, bo v stanju GOR, replike pa bodo v stanju DOL. To je normalno, pravzaprav delujejo, vendar so prikazani tako, ker vrnejo 503 za zahteve HAproxy. To nam omogoča, da vedno natančno vemo, kateri od treh strežnikov je trenutni glavni.

Zaključek

Ti si čudovit! V samo 30 minutah ste uvedli odlično odporno na napake in visoko zmogljivo gručo baze podatkov s pretočno replikacijo in samodejnim nadomestnim delovanjem. Če nameravate uporabiti to rešitev, preverite z uradno Patronijevo dokumentacijo, predvsem pa z delom, ki se nanaša na pripomoček patronictl, ki omogoča priročen dostop do upravljanja vaše gruče.

Čestitamo!

Vir: www.habr.com

Dodaj komentar