vitabaks.postgresql_cluster
PostgreSQL Hochverfügbarkeits-Cluster :elephant: :sparkling_heart:
Produktionsbereiter PostgreSQL Hochverfügbarkeits-Cluster (basierend auf Patroni). Automatisierung mit Ansible.
postgresql_cluster
automatisiert die Bereitstellung und Verwaltung von hochverfügbaren PostgreSQL-Clustern in Produktionsumgebungen. Diese Lösung ist für die Nutzung auf dedizierten physischen Servern, virtuellen Maschinen sowie in On-Premises- und Cloud-Infrastrukturen optimiert.
Eine durchsuchbare und leichter zu navigierende Version dieser Dokumentation finden Sie unter postgresql-cluster.org.
:trophy: Nutzen Sie das Sponsoring Programm, um persönliche Unterstützung zu erhalten oder einfach zu diesem Projekt beizutragen.
Unterstützte Setups für das Postgres Cluster
Sie haben drei Bereitstellungsschemata zur Verfügung:
1. Nur PostgreSQL Hochverfügbarkeit
Dies ist ein einfaches Schema ohne Lastverteilung.
Komponenten der Hochverfügbarkeit:
Patroni ist eine Vorlage für die Erstellung einer eigenen, anpassbaren Hochverfügbarkeitslösung mit Python und - für maximale Zugänglichkeit - einem verteilten Konfigurationsspeicher wie ZooKeeper, etcd, Consul oder Kubernetes. Wird zur Automatisierung der Verwaltung von PostgreSQL-Instanzen und für einen automatischen Failover verwendet.
etcd ist ein verteilter, zuverlässiger Schlüssel-Wert-Speicher für die wichtigsten Daten eines verteilten Systems. etcd ist in Go geschrieben und verwendet den Raft Konsensalgorithmus zur Verwaltung eines hochverfügbaren, replizierten Protokolls. Es wird von Patroni verwendet, um Informationen über den Status des Clusters und die PostgreSQL-Konfigurationsparameter zu speichern. Was ist Verteilter Konsens?
vip-manager (optional, falls die Variable
cluster_vip
angegeben ist) ist ein Dienst, der auf allen Clusterknoten gestartet wird und sich mit dem DCS verbindet. Wenn der lokale Knoten den Leader-Schlüssel besitzt, startet vip-manager die konfigurierte VIP. Im Falle eines Failovers entfernt vip-manager die VIP vom alten Leader und der entsprechende Dienst auf dem neuen Leader startet sie dort. Wird verwendet, um einen einzigen Einstiegspunkt (VIP) für den Datenbankzugriff bereitzustellen.PgBouncer (optional, falls die Variable
pgbouncer_install
auftrue
gesetzt ist) ist ein Verbindungspooler für PostgreSQL.
2. PostgreSQL Hochverfügbarkeit mit Lastverteilung
Dieses Schema ermöglicht die Lastenverteilung für Leseoperationen und erlaubt auch das horizontale Skalieren des Clusters mit nur schreibgeschützten Replikas.
Beim Bereitstellen bei Cloud-Anbietern wie AWS, GCP, Azure, DigitalOcean und Hetzner Cloud wird standardmäßig ein Cloud-Load-Balancer automatisch erstellt, um einen einzigen Einstiegspunkt in die Datenbank bereitzustellen (gesteuert durch die Variable cloud_load_balancer
).
Für nicht-cloudbasierte Umgebungen, wie bei der Bereitstellung auf Ihren eigenen Maschinen, ist der HAProxy-Load-Balancer verfügbar. Um ihn zu aktivieren, setzen Sie with_haproxy_load_balancing: true
in der Datei vars/main.yml.
:heavy_exclamation_mark: Hinweis: Ihre Anwendung muss unterstützt werden, um Leseanfragen an einen benutzerdefinierten Port 5001 zu senden und Schreibanfragen an Port 5000.
- port 5000 (lesen / schreiben) master
- port 5001 (nur lesen) alle Replikate
wenn die Variable "synchronous_mode" auf 'true' gesetzt ist (vars/main.yml):
- port 5002 (nur lesen) nur synchrone Replikate
- port 5003 (nur lesen) nur asynchrone Replikate
Komponenten des HAProxy-Lastenausgleichs:
HAProxy ist eine kostenlose, sehr schnelle und zuverlässige Lösung, die Hochverfügbarkeit, Lastenausgleich und Proxying für TCP- und HTTP-basierte Anwendungen bietet.
confd verwaltet lokale Anwendungs-Konfigurationsdateien unter Verwendung von Vorlagen und Daten aus etcd oder consul. Wird zur Automatisierung der Verwaltung von HAProxy-Konfigurationsdateien verwendet.
Keepalived (optional, falls die Variable
cluster_vip
angegeben ist) stellt eine virtuelle hochverfügbare IP-Adresse (VIP) und einen einzigen Einstiegspunkt für den Datenbankzugriff bereit. Implementierung des VRRP (Virtual Router Redundancy Protocol) für Linux. In unserer Konfiguration überprüft keepalived den Status des HAProxy-Dienstes und delegiert im Falle eines Fehlers die VIP an einen anderen Server im Cluster.
3. PostgreSQL Hochverfügbarkeit mit Consul-Service-Discovery
Um dieses Schema zu verwenden, geben Sie dcs_type: consul
in der Variablen-Datei vars/main.yml an.
Dieses Schema eignet sich für den Masterzugriff und für Lastverteilung (unter Verwendung von DNS) für das Lesen über Replikate. Consul Service Discovery mit DNS- Auflösung wird als Zugangspunkt für die Datenbank verwendet.
Zugangspunkt für den Client (Beispiel):
master.postgres-cluster.service.consul
replica.postgres-cluster.service.consul
Außerdem kann es nützlich sein, einen verteilten Cluster über unterschiedliche Rechenzentren hinweg zu haben. Wir können zuvor angeben, in welchem Rechenzentrum sich der Datenbankserver befindet, und dann diese Informationen für Anwendungen verwenden, die im selben Rechenzentrum laufen.
Beispiel: replica.postgres-cluster.service.dc1.consul
, replica.postgres-cluster.service.dc2.consul
Es erfordert die Installation von Consul im Clientmodus auf jedem Anwendungsserver für die DNS-Auflösung des Dienstes (oder die Verwendung von Forward DNS zum Remote-Consul-Server anstelle der Installation eines lokalen Consul-Clients).
Kompatibilität
RedHat- und Debian-basierte Distributionen (x86_64)
Unterstützte Linux-Distributionen:
- Debian: 11, 12
- Ubuntu: 22.04, 24.04
- CentOS Stream: 9
- Oracle Linux: 8, 9
- Rocky Linux: 8, 9
- AlmaLinux: 8, 9
PostgreSQL-Versionen:
alle unterstützten PostgreSQL-Versionen
:white_check_mark: getestet, funktioniert gut: PostgreSQL 10, 11, 12, 13, 14, 15, 16
Tabelle der Ergebnisse von täglichen automatisierten Tests zur Bereitstellung des Clusters:
Distribution | Testergebnis |
---|---|
Debian 11 | |
Debian 12 | |
Ubuntu 22.04 | |
Ubuntu 24.04 | |
CentOS Stream 9 | |
Oracle Linux 8 | |
Oracle Linux 9 | |
Rocky Linux 8 | |
Rocky Linux 9 | |
AlmaLinux 8 | |
AlmaLinux 9 |
Ansible-Version
Minimale unterstützte Ansible-Version: 8.0.0 (ansible-core 2.15.0)
Anforderungen
Klicken Sie hier, um zu erweitern...
Dieses Playbook benötigt Root-Rechte oder sudo.
Ansible (Was ist Ansible?)
Wenn dcs_type: "consul", installieren Sie bitte die Anforderungen für die Consul-Rolle auf dem Steuerknoten:
ansible-galaxy install -r roles/consul/requirements.yml
Portanforderungen
Liste der erforderlichen TCP-Ports, die für den Datenbankcluster geöffnet sein müssen:
5432
(postgresql)6432
(pgbouncer)8008
(patroni rest api)2379
,2380
(etcd)
Für das Schema "[Typ A] PostgreSQL Hochverfügbarkeit mit Lastverteilung":
5000
(haproxy - (lesen/schreiben) master)5001
(haproxy - (nur lesen) alle Replikate)5002
(haproxy - (nur lesen) nur synchrone Replikate)5003
(haproxy - (nur lesen) nur asynchrone Replikate)7000
(optional, haproxy stats)
Für das Schema "[Typ C] PostgreSQL Hochverfügbarkeit mit Consul-Service-Discovery (DNS)":
8300
(Consul Server RPC)8301
(Consul Serf LAN)8302
(Consul Serf WAN)8500
(Consul HTTP API)8600
(Consul DNS-Server)
Empfehlungen
Klicken Sie hier, um zu erweitern...
- Linux (Betriebssystem):
Aktualisieren Sie Ihr Betriebssystem auf den Zielservern vor der Bereitstellung;
Stellen Sie sicher, dass die Zeit-Synchronisierung eingerichtet ist (NTP).
Geben Sie ntp_enabled:'true'
und ntp_servers
an, wenn Sie den NTP-Dienst installieren und konfigurieren möchten.
- DCS (Distributed Consensus Store):
Schnelle Laufwerke und ein zuverlässiges Netzwerk sind die wichtigsten Faktoren für die Leistung und Stabilität eines etcd (oder consul) Clusters.
Vermeiden Sie es, etcd (oder consul) Daten auf demselben Laufwerk zu speichern wie andere Prozesse (wie die Datenbank), die intensiv die Ressourcen des Festplattensubsystems nutzen!
Speichern Sie die etcd- und PostgreSQL-Daten auf verschiedenen Festplatten (siehe etcd_data_dir
, consul_data_path
Variablen), verwenden Sie nach Möglichkeit SSD-Laufwerke.
Siehe Hardware-Empfehlungen und Optimierungs anleitungen.
Es wird empfohlen, das DCS-Cluster auf dedizierten Servern bereitzustellen, die von den Datenbankservern getrennt sind.
- Platzierung der Clustermitglieder in verschiedenen Rechenzentren:
Wenn Sie eine Konfiguration über verschiedene Rechenzentren wünschen, wo die replizierten Datenbanken in unterschiedlichen Rechenzentren liegen, wird die Platzierung der etcd-Mitglieder kritisch.
Es gibt eine Menge zu beachten, wenn Sie ein wirklich robustes etcd-Cluster erstellen möchten, aber es gibt eine Regel: legen Sie nicht alle etcd-Mitglieder in Ihr primäres Rechenzentrum. Sehen Sie einige Beispiele.
- Wie man Datenverlust im Falle eines Autofailovers (synchronous_modes) verhindert:
Aus Leistungsgründen ist die synchrone Replikation standardmäßig deaktiviert.
Um das Risiko von Datenverlust bei einem Autofailover zu minimieren, können Sie die Einstellungen folgendermaßen konfigurieren:
- synchronous_mode: 'true'
- synchronous_mode_strict: 'true'
- synchronous_commit: 'on' (oder 'remote_apply')
Erste Schritte
Um das PostgreSQL Cluster Console auszuführen, führen Sie den folgenden Befehl aus:
docker run -d --name pg-console \
--publish 80:80 \
--publish 8080:8080 \
--env PG_CONSOLE_API_URL=http://localhost:8080/api/v1 \
--env PG_CONSOLE_AUTHORIZATION_TOKEN=secret_token \
--volume console_postgres:/var/lib/postgresql \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume /tmp/ansible:/tmp/ansible \
--restart=unless-stopped \
vitabaks/postgresql_cluster_console:2.0.0
Hinweis: Es wird empfohlen, die Konsole im selben Netzwerk wie Ihre Datenbankserver auszuführen, um das Monitoring des Cluster-Status zu ermöglichen. In diesem Fall ersetzen Sie localhost
durch die IP-Adresse Ihres Servers in der PG_CONSOLE_API_URL-Variable.
Öffnen Sie die Konsole UI
Gehen Sie zu http://localhost/ und verwenden Sie secret_token
zur Autorisierung.
Hinweis: Wenn Sie die Konsole auf einem anderen Server eingerichtet haben, ersetzen Sie 'localhost' durch die Adresse des Servers. Verwenden Sie den Wert Ihres Tokens, wenn Sie ihn in der PG_CONSOLE_AUTHORIZATION_TOKEN-Variable neu definiert haben.
Klicken Sie hier, um zu erweitern... wenn Sie die Befehlszeile bevorzugen.
Befehlszeile
- Installieren Sie Ansible auf einem Steuerknoten (dies könnte einfach ein Laptop sein)
sudo apt update && sudo apt install -y python3-pip sshpass git
pip3 install ansible
- Laden Sie dieses Repository herunter oder klonen Sie es
git clone https://github.com/vitabaks/postgresql_cluster.git
- Gehen Sie in das Playbook-Verzeichnis
cd postgresql_cluster/automation
- Bearbeiten Sie die Inventar-Datei
Geben Sie (nicht öffentliche) IP-Adressen und Verbindungseinstellungen (ansible_user
, ansible_ssh_pass
oder ansible_ssh_private_key_file
) für Ihre Umgebung an
nano inventory
- Bearbeiten Sie die Variablen-Datei vars/main.yml
nano vars/main.yml
Minimale Menge an Variablen:
proxy_env
# falls erforderlich (zum Herunterladen von Paketen)cluster_vip
# für den Clientzugang zu Datenbanken im Cluster (optional)patroni_cluster_name
postgresql_version
postgresql_data_dir
with_haproxy_load_balancing
'true'
(Typ A) oder'false'
/Standard (Typ B)dcs_type
# "etcd" (Standard) oder "consul" (Typ C)
Siehe die Dateien vars/main.yml, system.yml und (Debian.yml oder RedHat.yml) für weitere Details.
Wenn dcs_type: "consul", installieren Sie bitte die Anforderungen für die Consul-Rolle auf dem Steuerknoten:
ansible-galaxy install -r roles/consul/requirements.yml
- Versuchen Sie, eine Verbindung zu den Hosts herzustellen
ansible all -m ping
- Führen Sie das Playbook aus:
ansible-playbook deploy_pgcluster.yml
Cluster mit TimescaleDB bereitstellen
Um einen PostgreSQL Hochverfügbarkeits-Cluster mit der TimescaleDB-Erweiterung bereitzustellen, fügen Sie einfach die Variable enable_timescale
hinzu.
Beispiel:
ansible-playbook deploy_pgcluster.yml -e "enable_timescale=true"
So fangen Sie von vorne an
Wenn Sie von ganz vorne beginnen möchten, können Sie das Playbook remove_cluster.yml
verwenden.
Verfügbare Variablen:
remove_postgres
: stoppt den PostgreSQL-Dienst und entfernt die Daten.remove_etcd
: stoppt den ETCD-Dienst und entfernt die Daten.remove_consul
: stoppt den Consul-Dienst und entfernt die Daten.
Führen Sie den folgenden Befehl aus, um bestimmte Komponenten zu entfernen:
ansible-playbook remove_cluster.yml -e "remove_postgres=true remove_etcd=true"
Dieser Befehl löscht die angegebenen Komponenten, sodass Sie eine neue Installation von Grund auf neu starten können.
:warning: Vorsicht: Seien Sie vorsichtig, wenn Sie diesen Befehl in einer Produktionsumgebung ausführen.
Sterne uns geben
Wenn Sie unser Projekt nützlich finden, ziehen Sie in Betracht, ihm einen Stern auf GitHub zu geben! Ihre Unterstützung hilft uns zu wachsen und motiviert uns, weiter zu verbessern. Ein Stern auf dem Projekt ist eine einfache, aber effektive Möglichkeit, Ihre Wertschätzung zu zeigen und anderen zu helfen, es zu entdecken.
Unterstützen Sie dieses Projekt
Durch das Sponsoring unseres Projekts tragen Sie direkt zu dessen kontinuierlicher Verbesserung und Innovation bei. Als Sponsor erhalten Sie exklusive Vorteile, darunter persönliche Unterstützung, vorzeitigen Zugang zu neuen Funktionen und die Möglichkeit, die Richtung des Projekts zu beeinflussen. Ihr Sponsoring ist für uns von unschätzbarem Wert und hilft, die Nachhaltigkeit und den Fortschritt des Projekts zu gewährleisten.
Werden Sie heute Sponsor und helfen Sie uns, dieses Projekt auf die nächste Stufe zu bringen!
Unterstützen Sie unsere Arbeit über GitHub Sponsoren
Unterstützen Sie unsere Arbeit über Patreon
Unterstützen Sie unsere Arbeit über eine Krypto-Brieftasche:
USDT (TRC20): TSTSXZzqDCUDHDjZwCpuBkdukjuDZspwjj
Lizenz
Lizenziert unter der MIT-Lizenz. Siehe die LICENSE Datei für Details.
Autor
Vitaliy Kukharik (PostgreSQL DBA)
vitabaks@gmail.com
Feedback, Fehlerberichte, Anfragen, ...
Sind willkommen!
PostgreSQL High-Availability Cluster (based on Patroni)
ansible-galaxy install vitabaks.postgresql_cluster