Aufbau eines hochverfügbaren PostgreSQL-Clusters mit Patroni, etcd, HAProxy

Es stellte sich heraus, dass ich zum Zeitpunkt der Aufgabenstellung nicht über genügend Erfahrung verfügte, um diese Lösung alleine zu entwickeln und zu implementieren. Also begann ich zu googeln.

Ich weiß nicht, woran es liegt, aber immer wieder stoße ich darauf, dass selbst wenn ich alles Schritt für Schritt wie im Tutorial befolge und eine ähnliche Umgebung wie der Autor einrichte, nie funktioniert es. Ich habe keinen blassen Schimmer, was hier los ist, aber als ich erneut damit konfrontiert wurde, dachte ich mir – ich schreibe einen eigenen Tutorial, sobald ich es geschafft habe. Einen, der definitiv funktioniert.

Online-Guides

Es stellt sich heraus, dass das Internet nicht an einer Vielzahl von Guides, Tutorials, Schritt-für-Schritt-Anleitungen und ähnlichen Dingen leidet. Es stellte sich heraus, dass mir die Aufgabe gestellt wurde, eine Lösung für die bequeme Organisation und den Aufbau eines ausfallsicheren PostgreSQL-Clusters zu entwickeln, wobei die Hauptanforderungen die Streaming-Replikation vom Master-Server zu allen Replikaten und die automatische Umschaltung im Fall eines Ausfalls des Master-Servers waren.

In diesem Schritt wurde der Technologie-Stack festgelegt:

  • PostgreSQL als Datenbankmanagementsystem
  • Patroni als Lösung für die Clusterbildung
  • etcd als verteiltes Speichersystem für Patroni
  • HAproxy zur Schaffung eines einheitlichen Zugangspunkts für Anwendungen, die eine Datenbank verwenden

Installation von

Wir präsentieren: den Aufbau eines hochverfügbaren PostgreSQL-Clusters unter Verwendung von Patroni, etcd und HAProxy.

Alle Operationen wurden auf virtuellen Maschinen mit dem installierten Betriebssystem Debian 10 durchgeführt.

die Unterstützung für die Version etcd2 eingestellt.

Es wird nicht empfohlen, etcd auf denselben Maschinen zu installieren, auf denen sich Patroni und PostgreSQL befinden, da die Festplattenlast für etcd sehr wichtig ist. Für Lernzwecke werden wir es jedoch so handhaben.
Lassen Sie uns etcd installieren.

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

Fügen Sie den Inhalt in die Datei /etc/default/etcd ein

[member]

ETCD_NAME=datanode1 # Hostname Ihrer Maschine
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ALLE IP-ADRESSEN MÜSSEN GÜLTIG SEIN. LISTING PEER, CLIENT usw. SOLLTEN AUF DIE IP-ADRESSE DES HOSTS EINGESTELLT WERDEN

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380" # Adresse Ihrer Maschine
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379" # Adresse Ihrer Maschine

[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380" # Adresse Ihrer Maschine
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 aller Maschinen im etcd-Cluster
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379" # Adresse Ihrer Maschine

Führen Sie den Befehl aus

systemctl restart etcd

PostgreSQL 9.6 + Patroni

Zuerst müssen Sie drei virtuelle Maschinen einrichten, um die erforderliche Software darauf zu installieren. Nach der Einrichtung der Maschinen können Sie, wenn Sie meinem Tutorial folgen, dieses einfache Skript ausführen, das (fast) alles für Sie erledigt. Es wird als Root ausgeführt.

Bitte beachten Sie, dass das Skript die Version PostgreSQL 9.6 verwendet, dies liegt an den internen Anforderungen unseres Unternehmens. Die Lösung wurde nicht auf anderen Versionen von PostgreSQL getestet.

#!/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

Als Nächstes müssen Sie den gerade erstellten Datei /etc/patroni.yml den folgenden Inhalt hinzufügen, wobei Sie natürlich die IP-Adressen anpassen müssen, um die von Ihnen verwendeten Adressen zu reflektieren.
Beachten Sie die Kommentare in dieser YAML-Datei. Ändern Sie die Adressen auf Ihre eigenen für jede Maschine im Cluster.

/etc/patroni.yml

scope: pgsql # muss auf allen Knoten gleich sein
namespace: /cluster/ # muss auf allen Knoten gleich sein
name: postgres1 # muss auf allen Knoten unterschiedlich sein

restapi:
    listen: 192.168.0.143:8008 # Adresse des Knotens, auf dem sich diese Datei befindet
    connect_address: 192.168.0.143:8008 # Adresse des Knotens, auf dem sich diese Datei befindet

etcd:
    hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # Listen Sie hier alle Ihre Knoten auf, falls Sie etcd auf diesen installieren

# Dieser Abschnitt (bootstrap) wird in Etcd:///config geschrieben, nachdem der neue Cluster initialisiert wurde
# und alle anderen Cluster-Mitglieder verwenden dies als `globale Konfiguration`
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: de_DE.UTF8
    # init pg_hba.conf muss die Adressen ALLER Maschinen enthalten, die im Cluster verwendet werden
    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 # Adresse des Knotens, auf dem sich diese Datei befindet
    connect_address: 192.168.0.143:5432 # Adresse des Knotens, auf dem sich diese Datei befindet
    data_dir: /data/patroni # Dieses Verzeichnis wird durch das oben beschriebene Skript erstellt und die erforderlichen Berechtigungen gesetzt
    bin_dir:  /usr/lib/postgresql/9.6/bin # Geben Sie den Pfad zu Ihrem Verzeichnis mit postgresql an
    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

Das Skript muss auf allen drei Maschinen des Clusters ausgeführt werden, ebenso muss die angegebene Konfiguration in die Datei /etc/patroni.yml auf allen Maschinen eingefügt werden.

Nachdem Sie diese Schritte auf allen Maschinen des Clusters durchgeführt haben, führen Sie den folgenden Befehl auf einer von ihnen aus.

systemctl start patroni
systemctl start postgresql

Warten Sie etwa 30 Sekunden und führen Sie dann diesen Befehl auf den anderen Maschinen des Clusters aus.

HAproxy

Wir verwenden das hervorragende HAproxy, um einen einheitlichen Zugangspunkt bereitzustellen. Der Master-Server ist immer unter der Adresse der Maschine verfügbar, auf der HAproxy bereitgestellt wurde.

Um zu verhindern, dass die Maschine mit HAproxy zu einem Single Point of Failure wird, werden wir es in einem Docker-Container ausführen. In Zukunft kann es im K8s-Cluster gestartet werden, um unser hochverfügbares Cluster noch zuverlässiger zu machen.

Erstellen Sie ein Verzeichnis, in dem Sie zwei Dateien – Dockerfile und haproxy.cfg – speichern können. Wechseln Sie in dieses Verzeichnis.

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

Bitte beachten Sie, dass in den letzten drei Zeilen der Datei haproxy.cfg die Adressen Ihrer Maschinen aufgelistet sein müssen. HAproxy wird mit Patroni kommunizieren, im HTTP-Header wird der Master-Server immer 200 zurückgeben, während der Replica 503 zurückgibt.

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

Wir befinden uns im Verzeichnis, in dem sich beide Dateien befinden. Lassen Sie uns nacheinander die Container-Pack-Befehle ausführen und ihn mit der Weiterleitung der erforderlichen Ports starten:

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

Jetzt, wenn Sie die Adresse Ihrer Maschine mit HAproxy in Ihrem Browser öffnen und den Port 7000 angeben, sehen Sie die Statistiken Ihres Clusters.

Der Server, der gerade aktiv ist, wird als Master angezeigt, während die Replikate den Status DOWN haben. Das ist normal; tatsächlich arbeiten sie, aber sie zeigen diesen Status aufgrund der 503-Antworten auf Anfragen von HAproxy an. So wissen wir immer genau, welcher der drei Server momentan der Master ist.

Fazit

Sie sind großartig! In nur 30 Minuten haben Sie einen ausgezeichneten, ausfallsicheren und leistungsstarken Datenbankcluster mit Streaming-Replikation und automatischem Failover eingerichtet. Wenn Sie dieses Setup nutzen möchten, schauen Sie sich die offizielle Dokumentation von Patroni, insbesondere den Abschnitt über das Tool patronictl, an, das einen benutzerfreundlichen Zugang zur Verwaltung Ihres Clusters bietet.

Herzlichen Glückwunsch!

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster