PostgreSQL Streaming-Replikation

PostgreSQLBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie die PostgreSQL Streaming Replication konfigurieren. Diese leistungsstarke Funktion ermöglicht es Ihnen, eine Live-, schreibgeschützte Kopie Ihrer primären Datenbank auf einem sekundären Server, bekannt als Replik, zu unterhalten. Die Replik empfängt und wendet kontinuierlich Datenänderungen vom Primärserver an, was sie für Hochverfügbarkeit, Lastverteilung von Leseabfragen und Backups nützlich macht.

Sie durchlaufen den gesamten Prozess, beginnend mit der Konfiguration des Primärservers, um Replikation zu ermöglichen. Anschließend erstellen Sie einen Replikserver, indem Sie ein Basis-Backup erstellen. Schließlich starten Sie die Replik, testen den Datenfluss zwischen den beiden Servern und sehen, wie die Replik mit dem Primärserver synchron bleibt.

Primärserver für Replikation konfigurieren

In diesem ersten Schritt konfigurieren Sie den primären PostgreSQL-Server, um ihn für die Replikation vorzubereiten. Dies beinhaltet die Änderung seiner Konfigurationsdateien, um Netzwerkverbindungen zuzulassen, das erforderliche Write-Ahead Log (WAL)-Level zu aktivieren und einen speziellen Benutzer für die Replikation zu erstellen.

1. Ändern der PostgreSQL-Konfigurationsdatei

Um sich auf die Replikation vorzubereiten, müssen Sie die Hauptkonfigurationsdatei, postgresql.conf, ändern. Das manuelle Bearbeiten dieser großen Datei mit einem Texteditor wie nano kann aufgrund der vielen Optionen schwierig und fehleranfällig sein. Eine effizientere und zuverlässigere Methode ist die Verwendung von Befehlszeilentools, um die spezifischen Einstellungen, die Sie ändern müssen, anzuzeigen und zu aktualisieren. Dies vermeidet das Durchscrollen von Hunderten von Zeilen und verhindert versehentliche Fehler.

Zuerst überprüfen wir die aktuellen Werte der Einstellungen, die wir ändern müssen: listen_addresses, wal_level und max_wal_senders.

CONF_FILE="/etc/postgresql/14/main/postgresql.conf"
echo "--- Aktuelle Einstellungen ---"
sudo grep -E "^#?\s*(listen_addresses|wal_level|max_wal_senders)" $CONF_FILE

Sie werden wahrscheinlich sehen, dass diese Zeilen mit einem # auskommentiert sind.

Nun aktualisieren wir diese Einstellungen automatisch. Die folgenden Befehle sichern die Konfigurationsdatei und aktualisieren dann jeden erforderlichen Parameter.

CONF_FILE="/etc/postgresql/14/main/postgresql.conf"
## Erstellen Sie ein Backup, bevor Sie Änderungen vornehmen
sudo cp $CONF_FILE ${CONF_FILE}.bak.$(date +%s)

## Setzen Sie listen_addresses auf '*' , um Verbindungen von jeder IP-Adresse zuzulassen
sudo sed -i -E "s/^[#\s]*listen_addresses\s*=.*/listen_addresses = '*'/" "$CONF_FILE"

## Setzen Sie wal_level auf 'replica', um Replikationsprotokolle zu aktivieren
sudo sed -i -E "s/^[#\s]*wal_level\s*=.*/wal_level = replica/" "$CONF_FILE"

## Setzen Sie die maximale Anzahl gleichzeitiger Replikationsverbindungen
sudo sed -i -E "s/^[#\s]*max_wal_senders\s*=.*/max_wal_senders = 10/" "$CONF_FILE"

Schließlich überprüfen wir, ob die Änderungen korrekt angewendet wurden. Der folgende Befehl zeigt die neuen Werte an und filtert auskommentierte Zeilen heraus.

echo "--- Überprüfte Einstellungen ---"
sudo grep -E "^(listen_addresses|wal_level|max_wal_senders)" $CONF_FILE

Die Ausgabe sollte die aktualisierte, aktive Konfiguration anzeigen:

listen_addresses = '*'
wal_level = replica
max_wal_senders = 10

Mit diesen bestätigten Einstellungen ist der Server für die nächsten Schritte richtig konfiguriert.

2. Erstellen eines dedizierten Replikationsbenutzers

Es ist eine bewährte Methode, einen dedizierten Benutzer für die Replikation anstelle eines Superusers zu verwenden. Lassen Sie uns eine Rolle namens replicator erstellen.

Verbinden Sie sich mit PostgreSQL über den psql-Befehlszeilenclient:

sudo -u postgres psql

Führen Sie nun den folgenden SQL-Befehl aus, um den Benutzer mit Replikationsprivilegien und einem Passwort zu erstellen:

CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'replicapass';

Sie sollten die Ausgabe CREATE ROLE sehen. Beenden Sie nun den psql-Client:

\q

3. Zulassen der Replikationsverbindung

Als Nächstes müssen Sie den Server so konfigurieren, dass der replicator-Benutzer eine Verbindung vom Replikserver herstellen kann. Dies geschieht durch Bearbeiten der Datei pg_hba.conf.

Öffnen Sie die Datei mit nano:

sudo nano /etc/postgresql/14/main/pg_hba.conf

Fügen Sie die folgende Zeile am Ende der Datei hinzu. Diese Regel gibt an, dass der Benutzer replicator von jeder IP-Adresse (0.0.0.0/0) eine Verbindung zur Pseudo-Datenbank replication herstellen darf. Für dieses Lab verwenden wir 127.0.0.1/32, da sich beide Server auf derselben Maschine befinden.

host    replication     replicator      127.0.0.1/32            md5

Drücken Sie Ctrl+X, Y und Enter, um zu speichern und zu beenden.

4. Neustart des Primärservers

Um all diese Konfigurationsänderungen zu übernehmen, müssen Sie den PostgreSQL-Dienst neu starten.

sudo service postgresql restart

Der Primärserver ist nun bereit, Replikationsverbindungen anzunehmen.

Replik aus Basis-Backup erstellen

Nachdem der Primärserver konfiguriert ist, besteht der nächste Schritt darin, die Replik zu erstellen. Der Standardweg hierfür ist die Erstellung eines "Basis-Backups" des Primärservers. Dies erstellt eine identische Kopie des Datenverzeichnisses des Primärservers, das als Ausgangspunkt für die Replik dient.

1. Erstellen eines Datenverzeichnisses für die Replik

Erstellen Sie zunächst ein neues Verzeichnis, in dem die Daten der Replik gespeichert werden. Es ist eine bewährte Methode, dies in einem Systemverzeichnis und nicht im Home-Verzeichnis eines Benutzers zu tun, um Berechtigungsprobleme zu vermeiden. Wir erstellen es als postgres-Benutzer im Standardverzeichnis von PostgreSQL.

sudo -u postgres mkdir -p /var/lib/postgresql/14/replica

2. Erstellen des Basis-Backups

Verwenden Sie nun das Dienstprogramm pg_basebackup, um die Daten vom Primärserver zu kopieren. Dieser Befehl verbindet sich mit dem Primärserver als replicator-Benutzer und streamt die Daten in das neue Replikverzeichnis. Da Sie das Verzeichnis als postgres-Benutzer erstellt haben, gibt es keine Berechtigungsprobleme zu lösen.

Führen Sie den folgenden Befehl aus. Sie werden nach dem Passwort für den replicator-Benutzer gefragt, das replicapass lautet.

sudo -u postgres pg_basebackup -h localhost -p 5432 -U replicator -D /var/lib/postgresql/14/replica -P -v -R

Lassen Sie uns diesen Befehl aufschlüsseln:

  • sudo -u postgres: Führt den Befehl als postgres-Systembenutzer aus, der die erforderlichen Berechtigungen hat.
  • pg_basebackup: Das Dienstprogramm zum Erstellen von Basis-Backups.
  • -h localhost -p 5432: Gibt den Host und Port des Primärservers an.
  • -U replicator: Der Benutzername, mit dem eine Verbindung hergestellt werden soll.
  • -D /var/lib/postgresql/14/replica: Das Zielverzeichnis für das Backup.
  • -P: Zeigt einen Fortschrittsbericht an.
  • -v: Aktiviert den ausführlichen Modus (verbose mode).
  • -R: Dies ist eine sehr hilfreiche Option. Sie erstellt eine Datei standby.signal und hängt die Verbindungseinstellungen an die Datei postgresql.auto.conf im Zielverzeichnis an, wodurch das neue Datenverzeichnis automatisch als Replik konfiguriert wird.

3. Kopieren von Konfigurationsdateien

Das Basis-Backup kopiert die Hauptdatendateien, aber auf vielen Debian-basierten Systemen (wie dieser Ubuntu-Umgebung) werden die Konfigurationsdateien (pg_hba.conf und pg_ident.conf) separat in /etc/postgresql/ gespeichert und sind nicht im Backup enthalten. Sie müssen sie manuell in das Datenverzeichnis der Replik kopieren. Nach dem Kopieren müssen Sie auch sicherstellen, dass sie dem postgres-Benutzer gehören, damit der Serverprozess sie lesen kann.

sudo cp /etc/postgresql/14/main/pg_hba.conf /var/lib/postgresql/14/replica/
sudo cp /etc/postgresql/14/main/pg_ident.conf /var/lib/postgresql/14/replica/
sudo chown postgres:postgres /var/lib/postgresql/14/replica/pg_hba.conf
sudo chown postgres:postgres /var/lib/postgresql/14/replica/pg_ident.conf

Mit den Daten- und Konfigurationsdateien an Ort und Stelle ist das Replikverzeichnis für die abschließenden Konfigurationsschritte bereit.

Replika-Server konfigurieren und starten

Das Basis-Backup hat das Datenverzeichnis der Replik vorbereitet. Da Sie jedoch sowohl den Primär- als auch den Replikserver auf derselben Maschine ausführen, können nicht beide denselben Netzwerkport verwenden (Standard ist 5432). In diesem Schritt konfigurieren Sie die Replik so, dass sie einen anderen Port verwendet, und starten sie dann.

1. Konfigurieren des Replik-Ports

Bearbeiten Sie die Datei postgresql.conf im Datenverzeichnis der Replik, um ihren Listening-Port zu ändern. Beachten Sie, dass Sie sudo benötigen, da diese Datei nun dem postgres-Benutzer gehört.

sudo nano /var/lib/postgresql/14/replica/postgresql.conf

Fügen Sie die folgende Zeile am Ende der Datei hinzu, um den Port auf 5433 zu setzen:

port = 5433

Drücken Sie Ctrl+X, Y und Enter, um zu speichern und zu beenden.

2. Festlegen der Berechtigungen für das Datenverzeichnis

Aus Sicherheitsgründen verlangt PostgreSQL, dass sein Datenverzeichnis nicht von anderen Benutzern zugänglich ist. Sie müssen seine Berechtigungen auf 700 setzen, was dem Eigentümer (postgres) Lese-, Schreib- und Ausführungsberechtigungen gewährt.

sudo chmod 0700 /var/lib/postgresql/14/replica

3. Starten des Replikservers

Nun können Sie den Replikserver starten. Sie verwenden pg_ctl, ein Standard-PostgreSQL-Dienstprogramm zur Steuerung eines Datenbankservers.

Führen Sie den folgenden Befehl aus, um die Replik zu starten. Sie müssen den vollständigen Pfad zu pg_ctl verwenden, da der sudo-Befehl ihn andernfalls möglicherweise nicht findet. Wir werden auch eine Protokolldatei in /tmp angeben, um den Status des Servers leicht überprüfen zu können.

sudo -u postgres /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/14/replica -l /tmp/replica.log start
  • pg_ctl: Das Dienstprogramm zur Serversteuerung.
  • -D /var/lib/postgresql/14/replica: Gibt das Datenverzeichnis für diese Serverinstanz an.
  • -l /tmp/replica.log: Gibt die Protokolldatei an.
  • start: Die auszuführende Aktion.

Sie sollten die Meldung sehen:

waiting for server to start.... done
server started

4. Überprüfen der Protokolldatei der Replik

Um zu bestätigen, dass die Replik korrekt gestartet wurde und eine Verbindung zum Primärserver hergestellt hat, zeigen Sie ihre Protokolldatei mit sudo an, da sie dem postgres-Benutzer gehört:

sudo cat /tmp/replica.log

Suchen Sie nach Zeilen, die darauf hinweisen, dass das Datenbanksystem bereit ist, schreibgeschützte Verbindungen zu akzeptieren, und dass es mit dem Streaming vom Primärserver begonnen hat. Sie sollten etwas Ähnliches wie dies sehen:

...
LOG:  database system is ready to accept read-only connections
LOG:  started streaming WAL from primary at 0/4000000 on timeline 1
...

Dies bestätigt, dass Ihr Replikserver gestartet ist, läuft und erfolgreich mit dem Primärserver verbunden ist.

Replikation testen

Nachdem beide Server laufen, ist es an der Zeit zu testen, ob die Replikation wie erwartet funktioniert. Sie erstellen eine Tabelle auf dem Primärserver und überprüfen, ob sie auf der Replik erscheint. Sie werden auch bestätigen, dass die Replik schreibgeschützt ist.

1. Überprüfen des Replikationsstatus auf dem Primärserver

Verbinden Sie sich zunächst mit dem Primärserver (auf Port 5432) und überprüfen Sie die Ansicht pg_stat_replication. Diese Ansicht liefert Überwachungsinformationen über verbundene Replikate.

sudo -u postgres psql -p 5432

Führen Sie diese Abfrage aus:

SELECT client_addr, state, sync_state FROM pg_stat_replication;

Die Ausgabe sollte Ihre verbundene Replik anzeigen, mit dem Status streaming und sync_state als async oder sync.

 client_addr |   state   | sync_state
-------------+-----------+------------
 127.0.0.1   | streaming | async
(1 row)

2. Erstellen von Daten auf dem Primärserver

Während Sie noch mit dem Primärserver verbunden sind, erstellen Sie eine neue Tabelle und fügen einige Daten ein:

CREATE TABLE replication_test (id INT, message TEXT);
INSERT INTO replication_test VALUES (1, 'Hello from primary!');

Abfragen Sie nun die Tabelle, um zu bestätigen, dass die Daten vorhanden sind:

SELECT * FROM replication_test;

Sie sollten die gerade eingefügte Zeile sehen. Beenden Sie die psql-Shell des Primärservers:

\q

3. Überprüfen der Daten auf der Replik

Öffnen Sie ein neues Terminal oder verwenden Sie Ihr bestehendes, um sich mit dem Replikserver auf Port 5433 zu verbinden. Sie müssen das Passwort für den postgres-Benutzer angeben, das labex lautet.

psql -h localhost -p 5433 -U postgres -d postgres

Fragen Sie nun die Tabelle replication_test auf der Replik ab:

SELECT * FROM replication_test;

Sie sollten genau dieselben Daten sehen, die Sie auf dem Primärserver erstellt haben. Dies bestätigt, dass die Streaming-Replikation funktioniert!

 id |      message
----+---------------------
  1 | Hello from primary!
(1 row)

4. Testen der schreibgeschützten Natur der Replik

Versuchen Sie, Daten in die Tabelle auf der Replik einzufügen:

INSERT INTO replication_test VALUES (2, 'Hello from replica?');

Der Befehl schlägt mit einem Fehler fehl, da ein Replikserver standardmäßig im schreibgeschützten Modus läuft.

ERROR:  cannot execute INSERT in a read-only transaction

Dies ist ein erwartetes Verhalten und ein Hauptmerkmal einer Streaming-Replik. Beenden Sie die psql-Shell der Replik:

\q

Umgebung bereinigen

In diesem letzten Schritt werden Sie die Server herunterfahren und die während des Labs erstellten Dateien und Verzeichnisse entfernen, um die Umgebung in ihren ursprünglichen Zustand zurückzuversetzen.

1. Stoppen des Replikservers

Stoppen Sie zuerst den Replikserver mit pg_ctl. Denken Sie daran, den vollständigen Pfad zur ausführbaren Datei zu verwenden.

sudo -u postgres /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/14/replica stop

Sie erhalten eine Bestätigungsmeldung, dass der Server gestoppt wurde.

waiting for server to shut down.... done
server stopped

2. Stoppen des Primärservers

Stoppen Sie als Nächstes den Primärserver mit dem Befehl service.

sudo service postgresql stop

3. Entfernen von Replik-Daten und Protokollen

Nachdem die Server gestoppt sind, können Sie das Datenverzeichnis der Replik und die von Ihnen erstellte Protokolldatei sicher entfernen. Beachten Sie, dass sudo erforderlich ist, da diese Dateien dem postgres-Benutzer gehören.

sudo rm -rf /var/lib/postgresql/14/replica /tmp/replica.log

Damit ist der Aufräumvorgang abgeschlossen. Sie haben erfolgreich eine PostgreSQL-Streaming-Replikationsumgebung eingerichtet, getestet und wieder abgebaut.

Zusammenfassung

In diesem Lab haben Sie erfolgreich PostgreSQL-Streaming-Replikation von Grund auf konfiguriert. Sie haben gelernt, wie Sie einen Primärserver vorbereiten, indem Sie postgresql.conf und pg_hba.conf modifizieren und einen dedizierten Replikationsbenutzer erstellen. Anschließend haben Sie pg_basebackup verwendet, um eine Replik zu erstellen und diese für den Betrieb auf einem separaten Port konfiguriert.

Durch das Testen der Einrichtung haben Sie verifiziert, dass Daten, die auf den Primärserver geschrieben werden, nahezu in Echtzeit automatisch auf den Sekundärserver repliziert werden. Sie haben auch bestätigt, dass ein Replikserver schreibgeschützt ist, was ein grundlegender Aspekt seines Designs ist. Diese Fähigkeiten sind unerlässlich für die Verwaltung robuster und skalierbarer PostgreSQL-Bereitstellungen.