Creació d'un clúster PostgreSQL d'alta disponibilitat mitjançant Patroni, etcd, HAProxy

Va succeir que en el moment d'establir la tasca, no tenia el grau d'experiència suficient per desenvolupar i executar aquesta solució sol. I després vaig començar a buscar a Google.

No sé quina és la trampa, però per enèsima vegada m'he trobat amb el fet que encara que ho feu tot pas a pas com al tutorial, prepareu el mateix entorn que el de l'autor, encara no funciona mai. No tinc ni idea de què passa, però quan em vaig tornar a trobar amb això, vaig decidir, i escriuré el meu tutorial quan tot funcioni. Un que sens dubte funcionarà.

Guies a Internet

Succeeix que Internet no pateix la manca de diverses guies, tutorials, passos a pas i similars. Va donar la casualitat que em van donar la tasca de desenvolupar una solució per organitzar i construir còmodament un clúster de migració per error PostgreSQL, els requisits principals per als quals eren la rèplica en temps real des del servidor mestre a totes les rèpliques i la reserva automàtica quan falla el servidor mestre.

En aquesta etapa, es va determinar la pila de tecnologies utilitzades:

  • PostgreSQL com a SGBD
  • Patroni com a solució de clúster
  • etcd com a emmagatzematge distribuït per a Patroni
  • HAproxy per organitzar un únic punt d'entrada per a aplicacions que utilitzen la base de dades

Instal · lació

La vostra atenció està construint un clúster PostgreSQL d'alta disponibilitat mitjançant Patroni, etcd, HAProxy.

Все операции выполнялись на виртуальных машинах с установленной ОС Debian 10.

etc.

No recomano instal·lar etcd a les mateixes màquines on es trobaran patroni i postgresql, ja que la càrrega del disc és molt important per a etcd. Però amb finalitats educatives, ho farem.
Instal·leu etcd.

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

Afegiu contingut al fitxer /etc/default/etcd

[membre]

ETCD_NAME=datanode1 # nom d'amfitrió de la vostra màquina
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

TOTES LES ADRECES IP HAN DE SER VÀLIDES. EL LISTADOR PEER, EL CLIENT, etc. S'HAN DE CONFIGURAR A L'ADREÇA IP DE L'AMFITRIÓ

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # adreça de la vostra màquina
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # adreça de la vostra màquina

[clúster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # adreça de la vostra màquina
ETCD_INITIAL_CLUSTER="datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # adreces de totes les màquines del clúster etcd
ETCD_INITIAL_CLUSTER_STATE="nou"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # adreça de la vostra màquina

Executeu l'ordre

systemctl restart etcd

PostgreSQL 9.6 + patroni

El primer que cal fer és configurar tres màquines virtuals per instal·lar-hi el programari necessari. Després d'instal·lar les màquines, si seguiu el meu tutorial, podeu executar aquest senzill script que (gairebé) ho farà tot per vosaltres. S'executa com a root.

Tingueu en compte que l'script utilitza la versió de PostgreSQL 9.6, això es deu als requisits interns de la nostra empresa. La solució no s'ha provat en altres versions 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

A continuació, al fitxer /etc/patroni.yml que acabeu de crear, heu de posar el següent contingut, per descomptat, canviant les adreces IP a tots els llocs per les adreces que feu servir.
Pareu atenció als comentaris d'aquest yaml. Canvieu les adreces per les vostres, a cada màquina del clúster.

/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

L'script s'ha d'executar a les tres màquines del clúster, de la mateixa manera que la configuració anterior s'ha de col·locar al fitxer /etc/patroni.yml de totes les màquines.

Quan hàgiu fet aquestes operacions a totes les màquines del clúster, executeu l'ordre següent en qualsevol d'elles

systemctl start patroni
systemctl start postgresql

Espereu uns 30 segons i, a continuació, executeu aquesta ordre a les màquines restants del clúster.

HAproxy

Utilitzem el meravellós HAproxy per proporcionar un únic punt d'entrada. El servidor mestre sempre estarà disponible a l'adreça de la màquina on s'ha desplegat HAproxy.

Per no fer que la màquina amb HAproxy sigui un únic punt de fallada, l'executarem en un contenidor Docker, en el futur serà possible executar-la en un clúster de K8 i fer que el nostre clúster de failover encara sigui més fiable.

Creeu un directori on pugueu emmagatzemar dos fitxers: Dockerfile i haproxy.cfg. Entra-hi.

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

Aneu amb compte, les tres últimes línies del fitxer haproxy.cfg haurien d'enumerar les adreces de les vostres màquines. HAproxy es posarà en contacte amb Patroni, a les capçaleres HTTP el servidor mestre sempre retornarà 200 i la rèplica sempre retornarà 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

En trobar-se al directori en què "es troben" els nostres dos fitxers, executarem seqüencialment les ordres per empaquetar el contenidor, així com el llançarem amb els ports necessaris reenviats:

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

Ara, quan obriu l'adreça de la vostra màquina amb HAproxy al navegador i especifiqueu el port 7000, veureu les estadístiques del vostre clúster.

El servidor que és el mestre estarà en estat UP i les rèpliques estaran en estat DOWN. Això és normal, de fet funcionen, però es mostren en aquest formulari pel fet que tornen 503 a les sol·licituds d'HAproxy. Això ens permet saber sempre exactament quin dels tres servidors és el mestre actual.

Conclusió

Ets preciosa! En només 30 minuts, heu desplegat un excel·lent clúster de bases de dades de rendiment i migració per error amb replicació en temps real i migració automàtica per error. Si teniu previst utilitzar aquesta solució, consulteu amb documentació oficial de Patroni, i especialment amb la seva part pel que fa a la utilitat patronictl, que proporciona un accés còmode per gestionar el vostre clúster.

Enhorabona!

Font: www.habr.com

Compreu allotjament fiable per a llocs amb protecció DDoS, servidors VPS VDS 🔥 Compra allotjament web fiable amb protecció DDoS, servidors VPS VDS | ProHoster