Einrichten der logischen Replikation mit PostgreSQL 10 unter Ubuntu 18.04

Einführung

Wenn Sie eine Anwendung für die Produktion einrichten, ist es oft nützlich, mehrere Kopien Ihrer Datenbank vorhanden zu haben. Der Prozess zum Synchronisieren von Datenbankkopien wird alsreplication bezeichnet. Die Replikation kann eine horizontale Hochverfügbarkeitsskalierung für hohe Volumina gleichzeitiger Lesevorgänge und reduzierte Leselatenzen bereitstellen. Es ermöglicht auch die Peer-to-Peer-Replikation zwischen geografisch verteilten Datenbankservern.

PostgreSQL ist ein objektrelationales Open-Source-Datenbanksystem, das in hohem Maße erweiterbar ist und mitACID (Atomizität, Konsistenz, Isolation, Haltbarkeit) und dem SQL-Standard kompatibel ist. In Version 10.0 von PostgreSQL wurde zusätzlich zuphysical replication die Unterstützung fürlogical replication eingeführt. In einem logischen Replikationsschema werden Schreibvorgänge auf hoher Ebene von einemmaster-Datenbankserver auf einen oder mehrerereplica-Datenbankserver gestreamt. In einem physischen Replikationsschema werden stattdessen binäre Schreibvorgänge vom Master zum Replikat gestreamt, wodurch eine byteweise exakte Kopie des ursprünglichen Inhalts erstellt wird. In Fällen, in denen Sie eine bestimmte Teilmenge von Daten als Ziel festlegen möchten, z. B. Off-Load-Berichte, Patches oder Upgrades, kann die logische Replikation Geschwindigkeit und Flexibilität bieten.

In diesem Tutorial konfigurieren Sie die logische Replikation mit PostgreSQL 10 auf zwei Ubuntu 18.04-Servern, wobei ein Server als Master und der andere als Replikat fungiert. Am Ende des Lernprogramms können Sie Daten vom Masterserver mithilfe der logischen Replikation auf das Replikat replizieren.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

  • Zwei Ubuntu 18.04-Server, die wirdb-master unddb-replica nennen, sind jeweils mit einem regulären Benutzerkonto und Sudo-Berechtigungen eingerichtet. Um diese einzurichten, folgen Siethis initial server setup tutorial.

  • Private networking enabled auf Ihren Servern. Das private Netzwerk ermöglicht die Kommunikation zwischen Ihren Servern ohne die Sicherheitsrisiken, die mit der Bereitstellung von Datenbanken für das öffentliche Internet verbunden sind.

  • PostgreSQL 10 wurde auf beiden Servern gemäß Schritt 1 vonHow To Install and Use PostgreSQL on Ubuntu 18.04 installiert.

[[Schritt 1 - Konfigurieren von Postgresql für die logische Replikation] == Schritt 1 - Konfigurieren von PostgreSQL für die logische Replikation

Es gibt verschiedene Konfigurationseinstellungen, die Sie ändern müssen, um die logische Replikation zwischen Ihren Servern zu ermöglichen. Zunächst konfigurieren Sie Postgres so, dass es die private anstatt die öffentliche Netzwerkschnittstelle überwacht, da das Offenlegen von Daten über das öffentliche Netzwerk ein Sicherheitsrisiko darstellt. Anschließend konfigurieren Sie die entsprechenden Einstellungen, um die Replikation aufdb-replica zu ermöglichen.

Öffnen Sie aufdb-master/etc/postgresql/10/main/postgresql.conf, die Konfigurationsdatei des Hauptservers:

sudo nano /etc/postgresql/10/main/postgresql.conf

Suchen Sie die folgende Zeile:

/etc/postgresql/10/main/postgresql.conf

...
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
...

Kommentieren Sie es aus, indem Sie#entfernen unddb_master_private_ip_addresshinzufügen, um Verbindungen im privaten Netzwerk zu ermöglichen:

[.note] #Note: Stellen Sie in diesem und den folgenden Schritten sicher, dass Sie die IP-Adressen vonprivateIhrer Server und nicht deren öffentliche IPs verwenden. Das Aussetzen eines Datenbankservers gegenüber dem öffentlichen Internet ist ein erhebliches Sicherheitsrisiko.
#

/etc/postgresql/10/main/postgresql.conf

...
listen_addresses = 'localhost, db_master_private_ip_address'
...

Dadurch wartetdb-masterzusätzlich zur Loopback-Schnittstelle auf eingehende Verbindungen im privaten Netzwerk.

Suchen Sie als Nächstes die folgende Zeile:

/etc/postgresql/10/main/postgresql.conf

...
#wal_level = replica                    # minimal, replica, or logical
...

Kommentieren Sie es aus und ändern Sie es, um die PostgreSQL-EbeneWrite Ahead Log (WAL) auflogical zu setzen. Dies erhöht das Volumen der Einträge im Protokoll und fügt die erforderlichen Informationen zum Extrahieren von Abweichungen oder Änderungen an bestimmten Datensätzen hinzu:

/etc/postgresql/10/main/postgresql.conf

...
wal_level = logical
...

Die Einträge in diesem Protokoll werden vom Replikationsserver verarbeitet, sodass die Schreibvorgänge auf hoher Ebene vom Master repliziert werden können.

Speichern Sie die Datei und schließen Sie sie.

Als Nächstes bearbeiten wir/etc/postgresql/10/main/pg_hba.conf, die Datei, die die zulässigen Hosts, die Authentifizierung und den Zugriff auf Datenbanken steuert:

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

Fügen Sie nach der letzten Zeile eine Zeile hinzu, um eingehende Netzwerkverbindungen vondb-replica zuzulassen. Wir verwenden die private IP-Adresse vondb-replicaund geben an, dass Verbindungen von allen Benutzern und Datenbanken zulässig sind:

/etc/postgresql/10/main/pg_hba.conf

...
# TYPE      DATABASE        USER            ADDRESS                               METHOD
...
host         all            all             db_replica_private_ip_address/32      md5

Eingehende Netzwerkverbindungen werden jetzt vondb-replica zugelassen, authentifiziert durch einen Kennwort-Hash(md5).

Speichern Sie die Datei und schließen Sie sie.

Als Nächstes legen wir unsere Firewall-Regeln fest, um Datenverkehr vondb-replica zu Port5432 aufdb-master zuzulassen:

sudo ufw allow from db_replica_private_ip_address to any port 5432

Starten Sie abschließend den PostgreSQL-Server neu, damit die Änderungen wirksam werden:

sudo systemctl restart postgresql

Wenn Ihre Konfiguration die logische Replikation zulässt, können Sie nun eine Datenbank, eine Benutzerrolle und eine Tabelle erstellen.

[[Schritt 2 - Einrichten einer Datenbank-Benutzerrolle und -Tabelle]] == Schritt 2 - Einrichten einer Datenbank, einer Benutzerrolle und einer Tabelle

Um die Funktionalität Ihrer Replikationseinstellungen zu testen, erstellen wir eine Datenbank, eine Tabelle und eine Benutzerrolle. Sie erstellen eineexample-Datenbank mit einer Beispieltabelle, mit der Sie dann die logische Replikation zwischen Ihren Servern testen können. Sie erstellen auch einen dedizierten Benutzer und weisen ihm Berechtigungen sowohl für die Datenbank als auch für die Tabelle zu.

Öffnen Sie zunächst diepsql prompt alspostgres-Benutzer mit dem folgenden Befehl sowohl fürdb-master als auch fürdb-replica:

sudo -u postgres psql
sudo -u postgres psql

Erstellen Sie auf beiden Hosts eine neue Datenbank mit dem Namenexample:

CREATE DATABASE example;
CREATE DATABASE example;

[.note] #Note: Die letzten; in diesen Befehlen sind erforderlich. In interaktiven Sitzungen führt PostgreSQL SQL-Befehle erst aus, wenn Sie sie mit einem Semikolon beenden. Meta-Befehle (solche, die mit einem Backslash beginnen, wie\q und\c) steuern direkt den psql-Client selbst und sind daher von dieser Regel ausgenommen. Weitere Informationen zu Meta-Befehlen und zum psql-Client finden Sie unterPostgreSQL documentation.
#

Stellen Sie mit dem Meta-Befehl\connect eine Verbindung zu den Datenbanken her, die Sie gerade auf jedem Host erstellt haben:

\c example
\c example

Erstellen Sie eine neue Tabelle mit dem Namenwidgets mit beliebigen Feldern auf beiden Hosts:

CREATE TABLE widgets
(
    id SERIAL,
    name TEXT,
    price DECIMAL,
    CONSTRAINT widgets_pkey PRIMARY KEY (id)
);
CREATE TABLE widgets
(
    id SERIAL,
    name TEXT,
    price DECIMAL,
    CONSTRAINT widgets_pkey PRIMARY KEY (id)
);

Die Tabelle zudb-replica muss nicht mit dem Gegenstück zudb-masteridentisch sein. Es muss jedoch jede einzelne in der Tabelle vorhandene Spalte beidb-master enthalten. Zusätzliche Spalten dürfen keineNOT NULL oder andere Einschränkungen enthalten. In diesem Fall schlägt die Replikation fehl.

Erstellen Sie unterdb-master eine neue Benutzerrolle mit der OptionREPLICATION und einem Anmeldekennwort. Das AttributREPLICATION muss jeder für die Replikation verwendeten Rolle zugewiesen werden. Wir werden unseren Benutzersammy anrufen, aber Sie können dies durch Ihren eigenen Benutzernamen ersetzen. Stellen Sie sicher, dass Siemy_password auch durch Ihr eigenes sicheres Passwort ersetzen:

CREATE ROLE sammy WITH REPLICATION LOGIN PASSWORD 'my_password';

Notieren Sie sich Ihr Kennwort, da Sie es später indb-replica zum Einrichten der Replikation verwenden werden.

Gewähren Sie der Benutzerrolle, die Sie gerade erstellt haben, weiterhin die Berechtigung für die Datenbankexample, wenn Sie nochdb-master verwenden:

GRANT ALL PRIVILEGES ON DATABASE example TO sammy;

Als Nächstes erteilen Sie Ihrem Benutzer Berechtigungen für alle in der Datenbank enthaltenen Tabellen:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO sammy;

public schema ist ein Standardschema in jeder Datenbank, in die Tabellen automatisch eingefügt werden.

Mit diesen Berechtigungen können Sie nun die Tabellen in derexample-Datenbank für die Replikation verfügbar machen.

[[Schritt 3 - Einrichten einer Veröffentlichung]] == Schritt 3 - Einrichten einer Veröffentlichung

Publications sind der Mechanismus, mit dem PostgreSQL Tabellen für die Replikation verfügbar macht. Der Datenbankserver verfolgt intern den Verbindungs- und Replikationsstatus aller Replikationsserver, die einer bestimmten Publikation zugeordnet sind. Aufdb-master erstellen Sie eine Publikation,my_publication, die als Masterkopie der Daten fungiert, die an Ihresubscribers gesendet werden - in unserem Falldb-replica .

Erstellen Sie aufdb-master eine Publikation mit dem Namenmy_publication:

CREATE PUBLICATION my_publication;

Fügen Sie die zuvor erstelltewidgets-Tabelle hinzu:

ALTER PUBLICATION my_publication ADD TABLE widgets;

Wenn Ihre Publikation vorhanden ist, können Sie jetzt einen Abonnenten hinzufügen, der Daten daraus abruft.

[[Schritt-4 - Erstellen eines Abonnements]] == Schritt 4 - Erstellen eines Abonnements

Subscriptions werden von PostgreSQL verwendet, um eine Verbindung zu vorhandenen Veröffentlichungen herzustellen. Eine Publikation kann viele Abonnements auf verschiedenen Replikatservern haben, und Replikatserver können auch eigene Publikationen mit Abonnenten haben. Um auf die Daten aus der Tabelle zuzugreifen, die Sie fürdb-master erstellt haben, müssen Sie ein Abonnement für die Publikation erstellen, die Sie im vorherigen Schrittmy_publication erstellt haben.

Erstellen Sie unterdb-replica ein Abonnement mit dem Namenmy_subscription. Der BefehlCREATE SUBSCRIPTION benennt das Abonnement, während der ParameterCONNECTION die Verbindungszeichenfolge zum Herausgeber definiert. Diese Zeichenfolge enthält die Verbindungsdetails und Anmeldeinformationen des Master-Servers, einschließlich des zuvor definierten Benutzernamens und Kennworts sowie den Namen derexample-Datenbank. Denken Sie erneut daran, die private IP-Adresse vondb-masterzu verwenden undmy_passworddurch Ihr eigenes Passwort zu ersetzen:

CREATE SUBSCRIPTION my_subscription CONNECTION 'host=db_master_private_ip_address port=5432 password=my_password user=sammy dbname=example' PUBLICATION my_publication;

Sie werden die folgende Ausgabe sehen, die das Abonnement bestätigt:

OutputNOTICE:  created replication slot "my_subscription" on publisher
CREATE SUBSCRIPTION

Beim Erstellen eines Abonnements synchronisiert PostgreSQL automatisch alle vorhandenen Daten vom Master mit dem Replikat. In unserem Fall müssen keine Daten synchronisiert werden, da die Tabellewidgetsleer ist. Dies ist jedoch eine nützliche Funktion, wenn Sie einer vorhandenen Datenbank neue Abonnements hinzufügen.

Testen Sie das Setup mit einem Abonnement, indem Sie derwidgets-Tabelle einige Demo-Daten hinzufügen.

[[Schritt 5 - Testen und Fehlerbehebung]] == Schritt 5 - Testen und Fehlerbehebung

Um die Replikation zwischen unserem Master und dem Replikat zu testen, fügen wir einige Daten zur Tabellewidgetshinzu und überprüfen, ob sie korrekt repliziert wird.

Fügen Sie beidb-master die folgenden Daten in die Tabellewidgetsein:

INSERT INTO widgets (name, price) VALUES ('Hammer', 4.50), ('Coffee Mug', 6.20), ('Cupholder', 3.80);

Führen Sie unterdb-replica die folgende Abfrage aus, um alle Einträge in dieser Tabelle abzurufen:

SELECT * FROM widgets;

Sie sollten jetzt sehen:

Output id |    name    | price
----+------------+-------
  1 | Hammer     |  4.50
  2 | Coffee Mug |  6.20
  3 | Cupholder  |  3.80
(3 rows)

Erfolg! Die Einträge wurden erfolgreich vondb-master nachdb-replica repliziert. Von nun an werden alle Abfragen vonINSERT,UPDATE undDELETE unidirektional über Server repliziert.

Bei Schreibabfragen auf Replikatservern ist zu beachten, dass sie nicht zurück auf den Masterserver repliziert werden. PostgreSQL bietet derzeit nur eingeschränkte Unterstützung für die Lösung von Konflikten, wenn die Daten zwischen den Servern abweichen. Bei einem Konflikt wird die Replikation gestoppt und PostgreSQL wartet, bis das Problem vom Datenbankadministrator manuell behoben wurde. Aus diesem Grund leiten die meisten Anwendungen alle Schreibvorgänge an den Masterserver und verteilen die Lesevorgänge auf die verfügbaren Replikatserver.

Sie können jetzt die Eingabeaufforderungpsql auf beiden Servern beenden:

\q
\q

Nachdem Sie Ihr Setup getestet haben, können Sie Daten selbst hinzufügen und replizieren.

Fehlerbehebung

Wenn die Replikation nicht zu funktionieren scheint, besteht ein guter erster Schritt darin, das PostgreSQL-Protokoll indb-replica auf mögliche Fehler zu überprüfen:

tail /var/log/postgresql/postgresql-10-main.log

Im Folgenden sind einige häufige Probleme aufgeführt, die verhindern können, dass die Replikation funktioniert:

  • Das private Netzwerk ist nicht auf beiden Servern aktiviert, oder die Server befinden sich in verschiedenen Netzwerken.

  • db-master ist nicht so konfiguriert, dass auf Verbindungen mit der richtigen privaten Netzwerk-IP gewartet wird.

  • Die Write Ahead Log-Ebene fürdb-master ist falsch konfiguriert (sie muss auflogical eingestellt sein).

  • db-master ist nicht so konfiguriert, dass eingehende Verbindungen von der korrekten privaten IP-Adresse vondb-replicaakzeptiert werden.

  • Eine Firewall wie UFW blockiert eingehende PostgreSQL-Verbindungen an Port5432.

  • Es gibt nicht übereinstimmende Tabellennamen oder Felder zwischendb-master unddb-replica.

  • Der Datenbankrollesammyfehlen die erforderlichen Berechtigungen für den Zugriff auf die Datenbankexampleaufdb-master.

  • In der Datenbankrollesammyfehlt die OptionREPLICATION fürdb-master.

  • Der Datenbankrollesammyfehlen die erforderlichen Berechtigungen für den Zugriff auf die Tabellewidgets aufdb-master.

  • Die Tabelle wurde der Veröffentlichung zudb-master nicht hinzugefügt.

Nach dem Lösen der vorhandenen Probleme sollte die Replikation automatisch erfolgen. Wenn dies nicht der Fall ist, verwenden Sie den folgenden Befehl, um das vorhandene Abonnement zu entfernen, bevor Sie es neu erstellen:

DROP SUBSCRIPTION my_subscription;

Fazit

In diesem Tutorial haben Sie PostgreSQL 10 erfolgreich auf zwei Ubuntu 18.04-Servern installiert und die logische Replikation zwischen diesen Servern konfiguriert.

Sie verfügen nun über die erforderlichen Kenntnisse, um mit horizontaler Leseskalierung, hoher Verfügbarkeit und der geografischen Verteilung Ihrer PostgreSQL-Datenbank zu experimentieren, indem Sie zusätzliche Replikatserver hinzufügen.

Um mehr über die logische Replikation in PostgreSQL 10 zu erfahren, können Sie diechapter on the topic in der offiziellen PostgreSQL-Dokumentation sowie die manuellen Einträge in den BefehlenCREATE PUBLICATION undCREATE SUBSCRIPTION lesen.