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
- 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 etcdFü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="" # Adresse Ihrer Maschine
ETCD_LISTEN_CLIENT_URLS="" # Adresse Ihrer Maschine
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="" # Adresse Ihrer Maschine
ETCD_INITIAL_CLUSTER="datanode1=" # Adressen aller Maschinen im etcd-Cluster
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="" # Adresse Ihrer Maschine
Führen Sie den Befehl aus
systemctl restart etcdPostgreSQL 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.ymlAls 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: falseDas 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 postgresqlWarten 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.logBitte 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 , insbesondere den Abschnitt über das Tool patronictl, an, das einen benutzerfreundlichen Zugang zur Verwaltung Ihres Clusters bietet.
Herzlichen Glückwunsch!
Quelle: habr.com
