Schritt-für-Schritt-Anleitung zur Einrichtung der PostgreSQL-Streaming-Replikation
Konfigurieren Sie die PostgreSQL-Streaming-Replikation mit pg_basebackup, pg_hba.conf, standby.signal und Überprüfungsabfragen.
Schritt-für-Schritt-Anleitung zur Einrichtung der PostgreSQL-Streaming-Replikation
Streaming-Replikation ist der grundlegende Mechanismus zur Erreichung von Hochverfügbarkeit (HA) und Leseskalierbarkeit in PostgreSQL-Umgebungen. Durch die Konfiguration eines primären (Master-)Servers, der kontinuierlich Write-Ahead-Log (WAL)-Datensätze an einen oder mehrere Standby- (Replica-)Server streamt, stellen Sie die Datensynchronisation mit minimaler Verzögerung sicher.
Diese Anleitung führt durch die asynchrone Streaming-Replikation mit pg_basebackup, pg_hba.conf und Standby-Signaldateien. Sie enden mit einem funktionierenden Primär-Standby-Paar und den erforderlichen Überprüfungen, um zu beweisen, dass tatsächlich gestreamt wird.
Voraussetzungen und Umgebungseinrichtung
Bevor Sie beginnen, stellen Sie sicher, dass die folgenden Voraussetzungen erfüllt sind. Diese Anleitung geht von zwei Servern aus, Primär und Standby, die dieselbe Hauptversion von PostgreSQL (Version 12 oder neuer wird empfohlen) ausführen.
| Server | Rolle | IP-Adresse (Beispiel) |
|---|---|---|
| Primär | Quelle der Wahrheit | 192.168.1.10 |
| Standby | Replikat | 192.168.1.11 |
- Benutzer: Sie müssen administrativen Zugriff (z.B.
sudooder den Systembenutzerpostgres) auf beiden Servern haben. - Netzwerk: Der Standby-Server muss sich mit dem Primär-Server über den PostgreSQL-Port (Standard 5432) verbinden können.
Schritt 1: Konfigurieren des Primär-Servers
Der Primär-Server muss konfiguriert werden, um WAL-Dateien für die Replikation zu generieren und bereitzustellen.
1.1 postgresql.conf ändern
Bearbeiten Sie die Hauptkonfigurationsdatei. Bei Debian- und Ubuntu-Paketen befindet sie sich oft unter /etc/postgresql/<version>/main/postgresql.conf; bei vielen Quell- oder Containerinstallationen liegt sie im Datenverzeichnis. Setzen Sie diese Parameter:
# Verbindungen von anderen Hosts zulassen
listen_addresses = '*'
# WAL-Level auf 'replica' oder höher setzen
wal_level = replica
# Maximale Anzahl gleichzeitiger Verbindungen von Standby-Servern
max_wal_senders = 5
# Steuert die Anzahl der Standby-Verbindungen, die gleichzeitig aktiv sein können
max_replication_slots = 5
# Ermöglicht schreibgeschützte Abfragen auf dem Standby
hot_standby = on
1.2 Einen dedizierten Replikationsbenutzer erstellen
Aus Sicherheitsgründen erstellen Sie einen spezifischen Benutzer mit dem Attribut REPLICATION. Dieser Benutzer wird nur vom Standby-Server verwendet, um WAL-Datensätze abzurufen.
# Mit PostgreSQL verbinden
sudo -u postgres psql -c "CREATE ROLE replica_user WITH REPLICATION LOGIN PASSWORD 'use-a-real-secret-here';"
1.3 Client-Authentifizierung aktualisieren (pg_hba.conf)
Erlauben Sie dem Replikationsbenutzer von der IP-Adresse des Standby-Servers, sich mit der speziellen Replikations-Pseudo-Datenbank zu verbinden.
# TYPE DATABASE USER ADDRESS METHOD
host replication replica_user 192.168.1.11/32 md5
1.4 Primär-Server neu starten
Wenden Sie die Konfigurationsänderungen an. Ein Neustart ist die einfache Option nach Änderung von listen_addresses; wenn Sie nur pg_hba.conf geändert haben, reicht ein Neuladen.
sudo systemctl restart postgresql
Schritt 2: Standby-Server vorbereiten
Bevor Sie die Daten klonen, stellen Sie sicher, dass der PostgreSQL-Dienst des Standby gestoppt und das vorhandene Datenverzeichnis geleert ist.
2.1 Standby-PostgreSQL-Dienst stoppen
sudo systemctl stop postgresql
2.2 Datenverzeichnis leeren
Warnung: Dieser Schritt löscht dauerhaft alle Daten, die sich derzeit im Datenverzeichnis des Standby befinden. Bestätigen Sie den Pfad vor der Ausführung.
# Beispielpfad für PG 14
PG_DATA=/var/lib/postgresql/14/main
sudo rm -rf $PG_DATA/*
2.3 Daten mit pg_basebackup klonen
Verwenden Sie pg_basebackup, um eine exakte Kopie des Datenverzeichnisses des Primär zu erstellen. Das Flag -R ist entscheidend, da es automatisch die erforderlichen Konfigurationsdateien (standby.signal und primary_conninfo) für die Streaming-Replikation (PostgreSQL 12+) generiert.
Führen Sie diesen Befehl auf dem Standby-Server aus:
PG_DATA=/var/lib/postgresql/14/main
sudo -u postgres pg_basebackup -h 192.168.1.10 -D $PG_DATA -U replica_user -P -v -R
| Option | Beschreibung |
|---|---|
-h |
Hostname/IP-Adresse des Primär-Servers. |
-D |
Pfad zum lokalen Datenverzeichnis. |
-U |
Replikationsbenutzername (replica_user). |
-P |
Fortschritt anzeigen. |
-v |
Ausführliche Ausgabe. |
-R |
Automatisch eine Replikationskonfigurationsdatei erstellen. |
Schritt 3: Standby konfigurieren und starten
3.1 Standby-Konfiguration überprüfen
Wenn Sie das Flag -R in Schritt 2.3 verwendet haben, hat pg_basebackup eine Datei standby.signal erstellt und die Einstellung primary_conninfo ausgefüllt, normalerweise in einer generierten Konfigurationsdatei namens postgresql.auto.conf im Datenverzeichnis.
Überprüfen Sie den Inhalt des primary_conninfo-Strings. Er sollte ähnlich aussehen wie folgt (überprüfen Sie in $PG_DATA/postgresql.auto.conf):
primary_conninfo = 'host=192.168.1.10 user=replica_user password=SuperSecurePassword123 application_name=standby_node'
Tipp: Stellen Sie sicher, dass das Passwort in
primary_conninfoenthalten ist oder dass Sie eine zertifikatsbasierte Authentifizierung verwenden. Wenn Siepg_hba.confmittrustodercertverwenden, kann das Passwort weggelassen werden.
3.2 Standby-Dienst starten
Da die erforderliche Signalisierungsdatei (standby.signal) im Datenverzeichnis vorhanden ist, startet der Dienst im schreibgeschützten Standby-Modus und versucht sofort, eine Verbindung zum Primär herzustellen.
sudo systemctl start postgresql
Schritt 4: Streaming-Replikation überprüfen
Nach dem Start des Standby müssen Sie bestätigen, dass die Verbindung aktiv ist und die Datensynchronisation stattfindet.
4.1 Überprüfung auf dem Primär-Server
Verbinden Sie sich mit dem Primär-Server und fragen Sie die Ansicht pg_stat_replication ab. Sie sollten eine Zeile sehen, die die Verbindung vom Standby-Server darstellt.
psql -c "SELECT client_addr, state, sync_state, sent_lsn, write_lsn, flush_lsn FROM pg_stat_replication;"
Erwartete Ausgabe (Schlüsselfelder):
client_addr: Sollte der IP des Standby-Servers entsprechen (z.B.192.168.1.11).state: Solltestreamingsein. Wenn esstartupodercatching upanzeigt, warten Sie einen Moment. Wenn eswalsender starting upanzeigt, sind Sie nah dran.sync_state: Sollteasyncsein (für standardmäßige asynchrone Replikation).
4.2 Datensynchronisation testen
Um den Datenfluss zu bestätigen, führen Sie eine Änderung auf dem Primär durch und überprüfen Sie sofort deren Existenz auf dem Standby.
Auf dem Primär:
CREATE TABLE replication_test (id serial primary key, message text);
INSERT INTO replication_test (message) VALUES ('Data synchronized successfully');
Auf dem Standby (schreibgeschützt):
-- Dies muss ohne Fehler erfolgreich sein
psql -c "SELECT * FROM replication_test;"
Wenn die Daten auf dem Standby sichtbar sind, ist die Streaming-Replikation erfolgreich konfiguriert und aktiv.
Best Practices und Fehlerbehebung
Dauerhafte Verbindung: Replikationsslots
Obwohl optional, werden Replikationsslots dringend empfohlen. Ein Replikationsslot stellt sicher, dass der Primär-Server WAL-Segmente, die vom Standby benötigt werden, nicht vorzeitig verwirft, selbst wenn der Standby vorübergehend getrennt wird.
Auf dem Primär:
SELECT * FROM pg_create_physical_replication_slot('standby_slot_name');
Setzen Sie dann primary_slot_name auf dem Standby. Setzen Sie den Slot-Namen nicht in primary_conninfo.
primary_conninfo = 'host=192.168.1.10 user=replica_user password=use-a-real-secret-here application_name=standby_node'
primary_slot_name = 'standby_slot_name'
Warnung: Replikationsslots erfordern eine sorgfältige Überwachung. Wenn ein Standby über einen längeren Zeitraum ausfällt, können die durch den Slot geschützten angesammelten WAL-Dateien dazu führen, dass der Festplattenspeicher des Primär-Servers schnell voll wird.
Fehlerbehebung bei häufigen Problemen
| Problem | Mögliche Ursache | Lösung |
|---|---|---|
| Standby kann keine Verbindung herstellen | Netzwerk-Firewall, falsche listen_addresses oder falsche pg_hba.conf auf dem Primär. |
Überprüfen Sie, ob Port 5432 erreichbar ist; bestätigen Sie, dass pg_hba.conf mit der Standby-IP und dem Benutzer übereinstimmt. |
pg_basebackup schlägt mit Authentifizierungsfehler fehl |
Falsches Passwort oder fehlender Host-Eintrag in pg_hba.conf. |
Überprüfen Sie das Passwort für replica_user; stellen Sie sicher, dass die Primär-Datenbank nach Änderung von pg_hba.conf neu gestartet wurde. |
| Standby ist schreibgeschützt | Dies ist das erwartete Verhalten. | Das Vorhandensein von standby.signal zwingt den Server in den Wiederherstellungsmodus. |
Nächster Schritt
Die Einrichtung der Streaming-Replikation ist ein kritischer Schritt beim Aufbau einer widerstandsfähigen PostgreSQL-Architektur. Indem Sie diesen Schritten gefolgt sind, haben Sie erfolgreich ein Primär-Standby-Paar konfiguriert, das eine kontinuierliche Datensynchronisation gewährleistet und die Hochverfügbarkeitsfähigkeiten Ihres Systems erheblich verbessert. Der nächste logische Schritt ist die Integration einer Überwachungslösung und eines Failover-Mechanismus (wie Patroni oder Repmgr), um die HA-Einrichtung vollständig zu automatisieren.