Vytvoření vysoce dostupného clusteru PostgreSQL pomocí Patroni, etcd, HAProxy

Stalo se, že v době zadávání úkolu jsem neměl dostatečnou míru zkušeností na vývoj a provoz tohoto řešení sám. A pak jsem začal googlovat.

Nevím, v čem je háček, ale už po mnoho let se setkávám s tím, že i když vše děláte krok za krokem jako v tutoriálu, připravujete stejné prostředí jako má autor, stejně to nikdy nefunguje. Nemám ponětí, co se děje, ale když jsem na to znovu narazil, rozhodl jsem se – a až vše půjde, napíšu svůj návod. Takový, který bude určitě fungovat.

Průvodci na internetu

Stává se, že internet netrpí nedostatkem různých návodů, tutoriálů, krok za krokem a podobně. Náhodou jsem dostal za úkol vyvinout řešení pro pohodlnou organizaci a vybudování clusteru pro překonání selhání PostgreSQL, jehož hlavními požadavky bylo streamování replikace z hlavního serveru na všechny repliky a automatický návrat při selhání hlavního serveru.

V této fázi byl určen zásobník použitých technologií:

  • PostgreSQL jako DBMS
  • Patroni jako shlukovací řešení
  • etcd jako distribuované úložiště pro Patroni
  • HAproxy pro organizaci jediného vstupního bodu pro aplikace využívající databázi

Instalace

Vaše pozornost je věnována budování vysoce dostupného clusteru PostgreSQL pomocí Patroni, etcd, HAProxy.

Všechny operace byly prováděny na virtuálních strojích s nainstalovaným OS Debian 10.

atd

Nedoporučuji instalovat etcd na stejné počítače, kde budou umístěny patroni a postgresql, protože zatížení disku je pro etcd velmi důležité. Ale pro vzdělávací účely to uděláme.
Nainstalujte atd.

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

Přidejte obsah do souboru /etc/default/etcd

[člen]

ETCD_NAME=datanode1 # název hostitele vašeho počítače
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

VŠECHNY IP ADRESY BY MĚLY BÝT PLATNÉ. LISTER PEER, KLIENT atd. BY MĚLI BÝT NASTAVENI NA IP ADRESU HOSTATELE

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # adresa vašeho stroje
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # adresa vašeho stroje

[shluk]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # adresa vašeho stroje
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šech strojů v clusteru etcd
ETCD_INITIAL_CLUSTER_STATE="nové"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # adresa vašeho stroje

Proveďte příkaz

systemctl restart etcd

PostgreSQL 9.6 + patroni

První věc, kterou musíte udělat, je nastavit tři virtuální počítače, abyste na ně nainstalovali potřebný software. Po instalaci strojů, pokud budete postupovat podle mého návodu, můžete spustit tento jednoduchý skript, který (téměř) udělá vše za vás. Běží jako root.

Upozorňujeme, že skript používá verzi PostgreSQL 9.6, je to z důvodu interních požadavků naší společnosti. Řešení nebylo testováno na jiných verzí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

Dále do souboru /etc/patroni.yml, který jste právě vytvořili, musíte vložit následující obsah, samozřejmě změnit ip adresy na všech místech na adresy, které používáte.
Věnujte pozornost komentářům v tomto yaml. Změňte adresy na své vlastní na každém počítači v clusteru.

/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í být spuštěn na všech třech počítačích v clusteru, stejně jako výše uvedená konfigurace musí být umístěna do souboru /etc/patroni.yml na všech počítačích.

Po provedení těchto operací na všech klastrových počítačích spusťte na kterémkoli z nich následující příkaz

systemctl start patroni
systemctl start postgresql

Počkejte asi 30 sekund a poté spusťte tento příkaz na zbývajících počítačích v clusteru.

HAproxy

Používáme úžasné HAproxy k poskytování jediného vstupního bodu. Hlavní server bude vždy dostupný na adrese počítače, kde je nasazeno HAproxy.

Aby stroj s HAproxy nebyl jediným bodem selhání, spustíme jej v kontejneru Docker, v budoucnu jej bude možné provozovat v clusteru K8 a náš failover cluster bude ještě spolehlivější.

Vytvořte adresář, kam můžete uložit dva soubory – Dockerfile a haproxy.cfg. Jdě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í, na posledních třech řádcích souboru haproxy.cfg by měly být uvedeny adresy vašich počítačů. HAproxy bude kontaktovat Patroni, v HTTP hlavičkách hlavní server vždy vrátí 200 a replika vždy vrátí 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

Tím, že jsme v adresáři, ve kterém „leží oba naše soubory“, budeme postupně provádět příkazy pro zabalení kontejneru a také jej spustíme s předáním potřebných portů:

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

Nyní, když v prohlížeči otevřete adresu vašeho počítače s HAproxy a zadáte port 7000, uvidíte statistiky pro váš cluster.

Server, který je hlavním serverem, bude ve stavu NAHORU a repliky budou ve stavu DOLŮ. To je normální, ve skutečnosti fungují, ale zobrazují se v této podobě kvůli tomu, že na požadavky z HAproxy vracejí 503. To nám umožňuje vždy přesně vědět, který ze tří serverů je aktuální master.

Závěr

Jste skvělí! Za pouhých 30 minut jste nasadili skvělý databázový cluster s podporou převzetí služeb při selhání a výkonem se streamovanou replikací a automatickým převzetím služeb při selhání. Pokud plánujete použít toto řešení, viz s oficiální dokumentací Patroni, a zejména s jeho částí týkající se utility patronictl, která poskytuje pohodlný přístup ke správě vašeho clusteru.

Gratulujeme!

Zdroj: www.habr.com

Přidat komentář