Het opbouwen van een PostgreSQL-cluster met hoge beschikbaarheid met behulp van Patroni, etcd, HAProxy

Zo kwam het dat ik op het moment dat de taak werd gesteld, niet voldoende ervaring had om deze oplossing alleen te ontwikkelen en uit te voeren. Daarom begon ik te googelen.

Ik weet niet wat het probleem is, maar keer op keer stuit ik erop dat zelfs als ik stap voor stap te werk ga zoals in de tutorial, dezelfde omgeving voorbereid als de auteur, het toch nooit werkt. Ik heb geen idee wat hier aan de hand is, maar toen ik dit weer tegenkwam, besloot ik: ik schrijf mijn eigen tutorial, als het me lukt. EƩn waarvan ik zeker weet dat het zal werken.

Gidsen op het internet

Het blijkt dat het internet niet tekortschiet aan verschillende gidsen, tutorials, stapsgewijze instructies en dergelijke. Het blijkt dat ik de opdracht kreeg om een oplossing te ontwikkelen voor het handig organiseren en bouwen van een fouttolerante PostgreSQL-cluster, waarvan de belangrijkste vereisten streamingreplicatie van de Master-server naar alle replicas en automatische failover bij uitval van de Master-server waren.

In dit stadium werd de stack van gebruikte technologieƫn bepaald:

  • PostgreSQL als database management systeem
  • Patroni als oplossing voor clustering
  • etcd als gedistribueerde opslag voor Patroni
  • HAproxy voor het creĆ«ren van een enkel toegangspunt voor applicaties die de database gebruiken

Installatie

Hier is een hoge beschikbaarheidscluster van PostgreSQL met gebruik van Patroni, etcd, HAProxy.

Alle operaties werden uitgevoerd op virtuele machines met het geĆÆnstalleerde besturingssysteem Debian 10.

etcd

Ik raad aan om etcd niet op dezelfde machines te installeren waar Patroni en PostgreSQL zich zullen bevinden, omdat de belasting op de schijven erg belangrijk is voor etcd. Maar voor educatieve doeleinden, zullen we het zo doen.
Laten we etcd installeren.

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

Voeg de inhoud toe aan het bestand /etc/default/etcd

[lid]

ETCD_NAME=datanode1 # hostname van uw machine
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ALLE IP-ADRESSEN MOETEN VALIDEERD WORDEN. LUISTER PEER, CLIƋNT etc MOETEN WORDEN INGESTELD OP HET IP-ADRES VAN DE HOST

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380" # adres van uw machine
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379" # adres van uw machine

[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380" # adres van uw machine
ETCD_INITIAL_CLUSTER="datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380" # adressen van alle machines in het etcd-cluster
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379" # adres van uw machine

Voer het commando uit

systemctl restart etcd

PostgreSQL 9.6 + patroni

Het eerste wat je moet doen, is drie virtuele machines instellen om de benodigde software te installeren. Nadat je de machines hebt ingesteld, kun je, als je mijn tutorial volgt, dit eenvoudige script uitvoeren dat (bijna) alles voor je zal doen. Het wordt uitgevoerd vanuit root.

Let op dat het script versie 9.6 van PostgreSQL gebruikt; dit is vanwege de interne vereisten van ons bedrijf. De oplossing is niet getest op andere versies van 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

Vervolgens moet je de volgende inhoud plaatsen in het zojuist aangemaakte bestand /etc/patroni.yml, waarbij je natuurlijk de IP-adressen op alle plaatsen vervangt door die van jou.
Let op de comments in deze yaml. Verander de adressen naar die van jou, op elke machine in de cluster.

/etc/patroni.yml

scope: pgsql # moet overal op alle knooppunten hetzelfde zijn
namespace: /cluster/ # moet overal op alle knooppunten hetzelfde zijn
name: postgres1 # moet verschillend zijn op alle knooppunten

restapi:
    listen: 192.168.0.143:8008 # adres van het knooppunt waar dit bestand zich bevindt
    connect_address: 192.168.0.143:8008 # adres van het knooppunt waar dit bestand zich bevindt

etcd:
    hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # vermeld hier al uw knooppunten, als u etcd ook op deze knooppunten installeert

# dit gedeelte (bootstrap) wordt geschreven naar Etcd:///config na het initialiseren van een nieuwe cluster
# en alle andere clusterleden zullen dit gebruiken als een `globale configuratie`
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 moet de adressen VAN ALLE machines in de cluster bevatten
    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 # adres van het knooppunt waar dit bestand zich bevindt
    connect_address: 192.168.0.143:5432 # adres van het knooppunt waar dit bestand zich bevindt
    data_dir: /data/patroni # deze directory zal worden aangemaakt door het hierboven beschreven script en de juiste rechten ingesteld
    bin_dir:  /usr/lib/postgresql/9.6/bin # geef het pad op naar uw directory met 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

Het script moet op alle drie de machines van de cluster worden uitgevoerd, net zoals de gegeven configuratie in het bestand /etc/patroni.yml op alle machines moet worden geplaatst.

Wanneer u deze handelingen op alle machines van de cluster heeft uitgevoerd, voer dan de volgende opdracht op een van hen uit.

systemctl start patroni
systemctl start postgresql

Wacht ongeveer 30 seconden en voer vervolgens deze opdracht uit op de andere machines van de cluster.

HAproxy

We gebruiken het geweldige HAproxy om een enkel toegangspunt te bieden. De master-server is altijd toegankelijk op het adres van de machine waar HAproxy is uitgerold.

Om ervoor te zorgen dat de machine met HAproxy geen enkelvoudig falingspunt wordt, starten we deze in een Docker-container. Later kan deze ook in een K8’s-cluster worden uitgevoerd, wat onze weerbare cluster nog betrouwbaarder maakt.

Maak een directory aan waar u twee bestanden kunt opslaan — Dockerfile en haproxy.cfg. Navigeer daarna naar deze directory.

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

Wees voorzichtig, in de laatste drie regels van het haproxy.cfg-bestand moeten de adressen van uw machines worden vermeld. HAproxy zal verbinding maken met Patroni, in de HTTP-headers zal de master-server altijd 200 retourneren en de replica 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

Zorg ervoor dat u in de directory bent waar beide bestanden zijn opgeslagen, en voer vervolgens de opdrachten uit om de container te bouwen en deze te starten met de vereiste poorten doorgestuurd:

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

Nu, door het adres van uw machine met HAproxy in de browser te openen en poort 7000 op te geven, zult u de statistieken van uw cluster zien.

De server die UP is, is de master, terwijl de replica's in DOWN-status zijn. Dit is normaal; ze werken in feite, maar worden zo weergegeven omdat ze 503 retourneren op aanvragen van HAproxy. Dit stelt ons in staat om altijd precies te weten welke van de drie servers op dat moment de master is.

Conclusie

U bent geweldig! Binnen 30 minuten heeft u een uitstekende fouttolerante en krachtige databasecluster met streaming replicatie en automatisch failover opgezet. Als u van plan bent deze oplossing te gebruiken, raadpleeg dan de officiƫle documentatie van Patroni, vooral het gedeelte over de utility patronictl, die handige toegang biedt tot het beheer van uw cluster.

Gefeliciteerd!

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster