vitabaks.postgresql_cluster

PostgreSQL Hochverfügbarkeits-Cluster :elephant: :sparkling_heart:

GitHub Lizenz GitHub Sterne

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

postgresql_cluster postgresql_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 auf true 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 GitHub Workflow Status
Debian 12 GitHub Workflow Status
Ubuntu 22.04 GitHub Workflow Status
Ubuntu 24.04 GitHub Workflow Status
CentOS Stream 9 GitHub Workflow Status
Oracle Linux 8 GitHub Workflow Status
Oracle Linux 9 GitHub Workflow Status
Rocky Linux 8 GitHub Workflow Status
Rocky Linux 9 GitHub Workflow Status
AlmaLinux 8 GitHub Workflow Status
AlmaLinux 9 GitHub Workflow Status
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

  1. 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
  1. Laden Sie dieses Repository herunter oder klonen Sie es
git clone https://github.com/vitabaks/postgresql_cluster.git
  1. Gehen Sie in das Playbook-Verzeichnis
cd postgresql_cluster/automation
  1. 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
  1. 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
  1. Versuchen Sie, eine Verbindung zu den Hosts herzustellen
ansible all -m ping
  1. 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"

asciicast

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.

Sternhistorien-Diagramm

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

GitHub Sponsoren

Unterstützen Sie unsere Arbeit über Patreon

Unterstützen Sie mich auf 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!

Über das Projekt

PostgreSQL High-Availability Cluster (based on Patroni)

Installieren
ansible-galaxy install vitabaks.postgresql_cluster
Lizenz
mit
Downloads
735
Besitzer