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. sudo oder den Systembenutzer postgres) 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_conninfo enthalten ist oder dass Sie eine zertifikatsbasierte Authentifizierung verwenden. Wenn Sie pg_hba.conf mit trust oder cert verwenden, 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: Sollte streaming sein. Wenn es startup oder catching up anzeigt, warten Sie einen Moment. Wenn es walsender starting up anzeigt, sind Sie nah dran.
  • sync_state: Sollte async sein (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.