Einrichten der Multi-Master PostgreSQL Replikation unter Ubuntu 22.04
PostgreSQL ist ein Open-Source-Datenbankmanagementsystem, das sich auf Erweiterbarkeit und SQL-Konformität konzentriert. PostgreSQL ist ein fortschrittliches RDBMS (Relational Database Management System) der Unternehmensklasse, das sowohl SQL (relationale) als auch JSON (nicht-relationale) Abfragen unterstützt.
Es ist ein äußerst stabiles und unternehmenstaugliches Datenbankmanagementsystem, das verschiedene Lösungen bietet, mit denen du Hochverfügbarkeit und Failover einrichten kannst. PostgreSQL wird als primäre Datenbank für Web-, mobile und analytische Anwendungen eingesetzt. Es ist bekannt für seine Zuverlässigkeit, Flexibilität, Robustheit und Leistung.
In diesem Tutorium wird der PostgreSQL-Datenbankserver auf Ubuntu 22.04-Servern installiert und die Multi-Master-Replikation mit mehreren Servern über Bucardo – ein asynchrones PostgreSQL-Replikationssystem – eingerichtet. Du installierst PostgreSQL über das offizielle PostgreSQL-Repository, kompilierst und installierst bucardo und richtest dann die Multi-Master-Replikation zwischen PostgreSQL-Servern ein.
Bucardo ist eine Perl-Anwendung, die das asynchrone PostgreSQL-Replikationssystem ermöglicht und dir erlaubt, Multi-Master- und Multi-Source-Operationen einzurichten. Bucardo ist frei und quelloffen und unter der BSD-Lizenz lizenziert.
Voraussetzungen
Du brauchst zwei oder mehr Ubuntu 22.04 Server, um dieses Tutorial durchzuführen. Außerdem brauchst du einen Nicht-Root-Benutzer mit sudo/root-Administrator-Rechten auf deinen Systemen.
In diesem Beispiel werden zwei Ubuntu 22.04 Server mit den folgenden Details verwendet:
Hostname IP Address --------------------------- postgres01 192.168.5.121 postgres02 192.168.5.122
Wenn alle Voraussetzungen erfüllt sind, kannst du mit der Installation des PostgreSQL-Servers beginnen.
Einrichten von /etc/hosts und UFW
In diesem ersten Abschnitt richtest du die „/etc/hosts“ und die UFW-Firewall ein, um den Standard-PostgreSQL-Port 5432 zu öffnen und einem bestimmten Netzwerk-Subnetz den Zugriff darauf zu ermöglichen. Du musst die Datei /etc/hosts und UFW auf beiden Servern einrichten.
Öffne die Datei /etc/hosts mit dem folgenden Editor-Befehl nano.
sudo nano /etc/hosts
Füge die folgenden Zeilen in die Datei ein und achte darauf, dass du die Details IP-Adresse und Hostname mit deiner aktuellen Arbeitsumgebung abgleichst.
192.168.5.121 postgres01 192.168.5.122 postgres02
Speichere und schließe die Datei, sobald du fertig bist.
Als nächstes gibst du den folgenden „ufw“-Befehl ein, um den OpenSSH-Port und den PostgreSQL-Server-Port 5432 zu öffnen. Damit öffnest du den Standard-OpenSSH-Port 22, dann öffnest du auch den PostgreSQL-Server-Port 5432 und legst fest, dass nur aus vertrauenswürdigen Netzwerken„192.168.5.0/24“ zugegriffen werden darf.
sudo ufw allow OpenSSH sudo ufw allow from 192.168.5.0/24 to any port 5432
Gib nun den folgenden Befehl ein, um UFW zu starten und zu aktivieren. Wenn du dazu aufgefordert wirst, gib y zur Bestätigung ein und drücke ENTER, um fortzufahren.
sudo ufw enable
Die Ausgabe„Firewall ist aktiv und wird beim Systemstart aktiviert“ bestätigt, dass die UFW jetzt läuft und beim Systemstart automatisch gestartet wird.
Überprüfe abschließend den Status der UFW-Firewall mit dem folgenden Befehl.
sudo ufw status
Du solltest eine Ausgabe wie diese erhalten – Der OpenSSH-Dienst wurde hinzugefügt und ist in der UFW-Regel-Liste verfügbar. Außerdem ist der PostgreSQL-Server-Port 5432 nur von‚192.168.5.0/24‚ aus erreichbar.
Installation des PostgreSQL-Servers
Gib zunächst den Befehl „apt install“ ein, um einige grundlegende Abhängigkeiten zu installieren. Gib y ein, wenn du dazu aufgefordert wirst, und drücke ENTER, um fortzufahren.
sudo apt install wget gnupg2 lsb-release curl apt-transport-https ca-certificates
Als Nächstes gibst du den Befehl „curl“ ein, um den GPG-Schlüssel des PostgreSQL-Repositorys herunterzuladen, konvertierst die .asc-Datei mit dem Befehl „gpg –dearmor“ in .gpg und fügst dann das PostgreSQL-Repository hinzu.
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/pgdg.gpg > /dev/null 2>&1 sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
Aktualisiere nun dein Ubuntu-Paket, um das neu hinzugefügte PostgreSQL-Repository zu übernehmen.
sudo apt update
Jetzt kannst du den PostgreSQL-Server mit dem Befehl „apt install“ installieren. Damit installierst du die neueste Version des PostgreSQL-Servers, nämlich PostgreSQL 15.
sudo apt install postgresql
Wenn du dazu aufgefordert wirst, gib zur Bestätigung y ein und drücke ENTER, um fortzufahren.
Sobald der PostgreSQL-Server installiert ist, gibst du bitte den folgenden systemctl-Befehl ein, um den PostgreSQL-Dienst zu überprüfen und sicherzustellen, dass er läuft und aktiviert ist.
sudo systemctl is-enabled postgresql sudo systemctl status postgresql
Die Ausgabe„active (running)“ bestätigt, dass der PostgreSQL-Server läuft. Und die Ausgabe„enabled“ bestätigt, dass PostgreSQL beim Systemstart automatisch ausgeführt wird.
Schließlich musst du noch die PostgreSQL-Erweiterung„plperl“ installieren, die von der Bucardo-Software benötigt wird. Gib den folgenden „apt install“-Befehl ein, um die „plperl“-Erweiterung zu installieren.
sudo apt install postgresql-plperl-15
Die Installation sollte automatisch beginnen.
Damit hast du PostgreSQL 15 auf beiden Ubuntu 22.04-Servern installiert und auch die PostgreSQL-Erweiterung „plperl“, die von Bucardo verwendet wird, installiert. Im nächsten Schritt richtest du den PostgreSQL-Benutzer und die PostgreSQL-Datenbank ein, die von Bucardo verwendet werden, sowie den Datenbanktest, der für die Replikationstests verwendet wird.
Datenbank und Benutzer einrichten
In diesem Abschnitt erstellst du eine neue Datenbank und einen neuen Benutzer, die für die Bucardo-Installation verwendet werden. Außerdem erstellst du eine neue Datenbank mit dem Schema für den Test der PostgreSQL-Replikation. Achte darauf, dass du die folgenden Befehle und Abfragen auf beiden PostgreSQL-Servern ausführst.
Bevor du beginnst, verschiebe das Arbeitsverzeichnis nach‚/var/lib/postgresql‚.
cd /var/lib/postgresql
Melde dich nun mit dem folgenden Befehl in der PostgreSQL-Shell an.
sudo -u postgres psql
Sobald du in der PostgreSQL-Shell eingeloggt bist, gibst du die folgenden Abfragen ein, um einen neuen Benutzer und eine neue Datenbank namens „bucardo“ zu erstellen. Diese Datenbank wird für die Speicherung der Bucardo-Daten verwendet und der Benutzer„bucardo“ sollte das SUPERUSER-Recht haben.
CREATE USER bucardo WITH SUPERUSER; CREATE DATABASE bucardo OWNER bucardo;
Gib nun die folgenden Abfragen ein, um die Liste der Datenbanken und Benutzer auf PostgreSQL zu überprüfen. Wenn die Abfrage erfolgreich war, solltest du die Datenbank und den Benutzer „bucardo“ in der Ausgabe sehen.
\l \du
Liste der Datenbanken auf dem PostgreSQL-Server.
Liste der Benutzer auf dem PostgreSQL-Server.
Nachdem du die Datenbank und den Benutzer für Bucardo angelegt hast, erstellst du als Nächstes eine neue Datenbank zum Testen der Replikation auf deinem PostgreSQL-Server.
Gib die folgende Abfrage ein, um eine neue Datenbank„testdb“ zu erstellen. Dann verbindest du dich mit der Datenbank‚testdb‚ über die Abfrage‚\c‚.
CREATE DATABASE testdb; \c testdb;
Gib nun die folgende Abfrage ein, um eine neue Tabelle „users“ zu erstellen.
CREATE TABLE users ( id SERIAL PRIMARY KEY, first_name VARCHAR(255), last_name VARCHAR(255) NOT NULL, city VARCHAR(255) );
Sobald die Tabelle erstellt ist, gibst du die folgenden Abfragen ein, um das Schema der Tabelle „users“ zu überprüfen und dann die Liste der verfügbaren Daten in der Tabelle zu überprüfen.
\dt select * from users;
PostgreSQL Server einrichten
In diesem Abschnitt richtest du beide PostgreSQL-Server so ein, dass sie unter einer internen IP-Adresse laufen. Außerdem richtest du die PostgreSQL-Authentifizierung ein, um Verbindungen zwischen den Servern als vertrauenswürdig für PostgreSQL zuzulassen.
Öffne die Standard-PostgreSQL-Konfiguration „/etc/postgresql/15/main/postgresql.conf“ mit dem folgenden nano-Editor-Befehl.
sudo nano /etc/postgresql/15/main/postgresql.conf
Entferne den Kommentar im Parameter „listen_addresses“ und füge die interne IP-Adresse deines PostgreSQL-Servers hinzu. Damit richtest du PostgreSQL so ein, dass es auf jedem Server mit einer internen IP-Adresse läuft.
Unten siehst du die Konfiguration für den postgres01 Server.
listen_addresses = 'localhost, 192.168.5.121'
Und unten ist die Konfiguration für den postgres02-Server.
listen_addresses = 'localhost, 192.168.5.122'
Speichere und schließe die Datei, wenn du fertig bist.
Als Nächstes öffnest du die standardmäßige PostgreSQL-Authentifizierungskonfigurationsdatei„/etc/postgresql/15/main/pg_hba.conf“ mit dem folgenden nano-Editor-Befehl.
sudo nano /etc/postgresql/15/main/pg_hba.conf
Füge auf dem postgres01-Server die folgenden Konfigurationen hinzu und stelle sicher, dass du die IP-Adresse durch die IP-Adresse des postgres02-Servers ersetzt. Damit werden alle lokalen Verbindungen und Verbindungen des Benutzers bucardo als vertrauenswürdig eingestuft. Auch die Verbindungen der Benutzer postgres und bucardo, die von postgres02 kommen, sind vertrauenswürdig.
# local connection and bucardo user local all all trust local all bucardo trust
# Bucardo user remote connections
host all postgres 192.168.5.122/24 trust
host all bucardo 192.168.5.122/24 trust
Nachfolgend siehst du die Konfiguration für den postgres02-Server. Achte darauf, dass du die IP-Adresse mit der IP-Adresse des postgres01-Servers abgleichst.
# local connection and bucardo user local all all trust local all bucardo trust
# Bucardo user remote connections
host all postgres 192.168.5.121/24 trust
host all bucardo 192.168.5.121/24 trust
Speichere und schließe die Datei, wenn du fertig bist.
Gib nun den folgenden systemctl-Befehl ein, um den PostgreSQL-Dienst neu zu starten und die Änderungen zu übernehmen.
sudo systemctl restart postgresql
Damit sollte der PostgreSQL-Server auf localhost und der internen IP-Adresse über den Parameter‚listen_addresses‚ laufen. Gib den folgenden Befehl ein, um die Liste der offenen Ports auf jedem Server zu überprüfen. Du solltest sehen, dass PostgreSQL auf einer internen IP-Adresse der Server postgres01 und postgres02 läuft.
ss -tulpn | grep postgres
Um die Authentifizierung zu überprüfen, kannst du den folgenden Befehl eingeben, um dich mit der PostgreSQL-Shell zu verbinden.
Gib auf dem postgres01-Server den folgenden Befehl ein. Wenn du erfolgreich bist, solltest du ohne Authentifizierung in die PostgreSQL-Shell des postgres02-Servers eingeloggt sein, da du dich auf dem vertrauenswürdigen Host und Benutzer befindest.
sudo -u postgres psql sudo -u postgres psql -U bucardo -h 192.168.5.122
Für den postgres02-Server kannst du den folgenden Befehl eingeben, um dich mit der PostgreSQL-Shell zu verbinden, die auf dem postgres01-Server läuft. Das Ergebnis ist ähnlich: Du wirst ohne Passwortauthentifizierung auf dem postgres01-Server angemeldet, da sowohl der Benutzer als auch die Verbindung vertrauenswürdig sind.
sudo -u postgres psql sudo -u postgres psql -U bucardo -h 192.168.5.121
Damit hast du die Installation des PostgreSQL 15 Servers abgeschlossen, die Datenbank und den Benutzer für Bucardo konfiguriert und auch die PostgreSQL listen_addresses und die Authentifizierung konfiguriert.
Im nächsten Schritt kompilierst und installierst du Bucardo als Anwendung, mit der du eine Multi-Master PostgreSQL-Replikation erstellen kannst.
Bucardo installieren
Bucardo ist eine freie und quelloffene Anwendung, mit der du PostgreSQL-Multi-Source- und Multi-Master-Replikationssysteme erstellen kannst. In diesem Abschnitt wirst du Bucardo manuell von der Quelle aus installieren. Du musst Bucardo auch nicht auf allen Knoten installieren.
Du wirst Bucardo nur auf dem Server „postgres01“ installieren. Achte also darauf, dass du alle folgenden Befehle auf dem postgres01-Server ausführst.
Gib zunächst den folgenden apt-Befehl ein, um die Paketabhängigkeiten für Bucardo zu installieren. Gib y ein, wenn du dazu aufgefordert wirst, und drücke ENTER, um fortzufahren.
sudo apt install make libdbix-safe-perl libboolean-perl libdbd-mock-perl libdbd-pg-perl libanyevent-dbd-pg-perl libpg-hstore-perl libpgobject-perl libpod-parser-perl libencode-locale-perl
Lade nun den Quellcode von Bucardo mit dem unten stehenden wget-Befehl herunter.
wget -q https://bucardo.org/downloads/Bucardo-5.6.0.tar.gz
Entpacke den Bucardo-Quellcode nach dem Download und verschiebe ihn in das Bucardo-Arbeitsverzeichnis.
tar xf Bucardo-5.6.0.tar.gz cd Bucardo-*/
Gib nun den folgenden Befehl ein, um Bucardo zu kompilieren und auf dem postgres01-Server zu installieren.
perl Makefile.PL sudo make install
Überprüfe den Binärpfad der Anwendung „bucardo“ und überprüfe die Version von Bucardo mit dem folgenden Befehl.
which bucardo bucardo --version
Die Binärdatei„bucardo“ befindet sich unter „/usr/local/bin/bucardo“, und die derzeit installierte Version ist v5.6.0.
Nach der Installation von Bucaro richtest du als Nächstes die PostgreSQL-Multi-Master-Replikation mit den beiden PostgreSQL-Servern postgres01 und postgres02 ein.
Einrichten der Multi-Master-Replikation mit Bucardo
Die folgenden Befehle müssen auf dem postgres01 Server ausgeführt werden.
Bevor du beginnst, gib den folgenden Befehl ein, um ein neues Daten- und Log-Verzeichnis für Bucardo zu erstellen.
sudo mkdir -p /var/run/bucardo /var/log/bucardo touch /var/log/bucardo/log.bucardo
Führe den folgenden „bucardo“-Befehl aus, um die Installation zu starten. Überprüfe die Verbindungseinstellungen zu PostgreSQL und gib dann P ein, um fortzufahren.
bucardo install
Wenn die Installation von Bucardo erfolgreich war, solltest du eine Meldung wie„Die Installation ist jetzt abgeschlossen“ erhalten.
Gib den folgenden Befehl ein, um den Datenbankserver und den Namen der Datenbank zu definieren, die repliziert werden soll. Diese Informationen werden als„server1“ für den PostgreSQL-Server ppstgres01 und„server2“ für den PostgreSQL-Server postgres02 gespeichert.
bucardo add database server1 dbname=testdb bucardo add database server2 dbname=testdb host=192.168.5.122
Füge das Tabellenschema hinzu, das du replizieren möchtest. In diesem Beispiel wird die Tabelle„users“ zwischen den PostgreSQL-Servern repliziert und synchronisiert.
bucardo add table public.users db=server1 bucardo add table public.users db=server2
Du kannst auch alle Tabellen der Datenbank mit dem Befehl„bucardo add all tables“ hinzufügen. Damit erstellst du auch eine relgroup, wenn sie noch nicht existiert.
bucardo add all tables --her=testdbSrv1 db=server1 bucardo add all tables --her=testdbSrv2 db=server2
Gib den folgenden Befehl ein, um die Liste der verfügbaren relgroup zu überprüfen.
bucardo list relgroup
Wenn du die Liste der relgroups überprüfst, solltest du die folgende Detailausgabe sehen. Bei jeder relgroup siehst du den Namen der relgroup, gefolgt von dem PostgreSQL-Server und der verfügbaren Tabelle, die der relgroup hinzugefügt wurde.
Nachdem du die relgroup und die Tabelle hinzugefügt hast, startest du nun den Synchronisationsprozess für beide PostgreSQL-Server. Gib den folgenden Befehl ein, um eine neue Synchronisierung„testdbSrv1“ zu erstellen, die„server1“ und„server2“ synchronisiert. Und die Sync heißt„testdbSrv2„, die zwischen„server2“ und„server1“ synchronisiert.
bucardo add sync testdbSrv1 relgroup=testdbSrv1 db=server1,server2 bucardo add sync testdbSrv2 relgroup=testdbSrv2 db=server2,server1
Überprüfe nun die Liste der Sync auf der Bucardo, indem du den folgenden Befehl eingibst.
bucardo list sync
Du siehst die Synchronisierung„testdbSrv1“ mit dem Status„Aktiv“ und die Synchronisierung erfolgt von„server1“ als Quelle und„server2“ als Zielknoten. Die Synchronisierung von„testdbSrv2“ hat ebenfalls den Status„Aktiv„, aber die Synchronisierung erfolgt von„server2“ als Quelle zum Ziel„server1„.
Als Nächstes gibst du den folgenden Befehl ein, um den Synchronisierungsprozess neu zu starten. Wenn die Synchronisierung erfolgreich war, solltest du die Ausgabe„Starting Bucardo“ sehen.
bucardo restart sync
Überprüfe abschließend den Synchronisationsstatus mit dem folgenden„bucardo„-Befehl.
bucardo status
Du solltest eine ähnliche Ausgabe erhalten wie diese – Beide Sync‚testdbSrv1‚ und‚testdbSrv2‚ auf dem Status‚Good‚, was bestätigt, dass die Synchronisierung funktioniert und deine Konfiguration erfolgreich ist.
An dieser Stelle hast du nun die Multi-Master-Replikation auf PostgreSQL über Bucardo konfiguriert. Als Nächstes überprüfst du die Multi-Master-Replikation, indem du neue Daten von beiden Servern hinzufügst und die Replikation zwischen den PostgreSQL-Servern überprüfst.
Überprüfe die Multi-Master Replikation PostgreSQL Server
Wenn der PostgreSQL Multi-Master konfiguriert ist, bedeutet dies, dass beide PostgreSQL Server miteinander synchronisiert sind und beide Server READ- und WRITE-Operationen akzeptieren. In diesem Beispiel überprüfst du den PostgreSQL-Multi-Master-Einsatz, indem du neue Daten in die Datenbank „test“ einfügst.
Melde dich zunächst auf dem postgres01-Server in der PostgreSQL-Shell an und verbinde dich mit der Datenbank„testdb„.
sudo -u postgres psql \c testdb
Gib die folgenden Abfragen ein, um neue Daten in die Tabelle „users“ einzufügen.
INSERT INTO users(id, first_name, last_name, city) VALUES (1, 'Alice', 'Wonderland', 'Sweden'), (2, 'Bob', 'Rista', 'Romania'), (3, 'John', 'Bonas', 'England');
Überprüfe deine Daten und rufe sie mit der unten stehenden Select-Abfrage ab. Du solltest sehen, dass deine Daten verfügbar sind.
select count(*) from users; select * from users;
Gib„quit“ ein, um die PostgreSQL-Shell zu verlassen.
Überprüfe dann den Bucardo-Synchronisationsstatus mit dem unten stehenden Befehl„bucardo„.
bucardo status
Im Abschnitt„Letzte I/D“ siehst du die letzte Datensynchronisation zwischen den PostgreSQL-Servern.
Wechsle nun zum Server postgres02, rufe die PostgreSQL-Shell auf und verbinde dich mit der Datenbank„testdb„.
sudo -u postgres psql \c testdb
Rufe mit der folgenden Abfrage die Daten ab, die in der Tabelle„users“ verfügbar sind. Du solltest sehen, dass deine Daten verfügbar sind und vom postgres01 Server repliziert wurden.
select count(*) from users; select * from users;
Gib als Nächstes die folgenden Abfragen ein, um weitere Daten hinzuzufügen, und gib„quit“ ein, um die PostgreSQL-Shell zu verlassen.
INSERT INTO users(id, first_name, last_name, city) VALUES (4, 'Ian', 'Gibson', 'Liverpool'), (5, 'Tom', 'Riddle', 'Paris'), (6, 'Jared', 'Dunn', 'New York');
quit
Gehe nun zurück zum postgres01-Server und führe den folgenden bucardo-Befehl aus, um den Synchronisationsstatus zu überprüfen.
bucardo status
Du solltest sehen, dass auf‚testdbSrv2‚ die letzte Synchronisation 3 ist. Du kannst dies im Abschnitt‚Last I/D‘ sehen.
Melde dich jetzt wieder in der PostgreSQL-Shell an und verbinde dich mit der Datenbank „testdb“.
sudo -u postgres psql \c testdb
Überprüfe dann die Liste der verfügbaren Daten in der Tabelle„users„. Du solltest zusätzliche Daten sehen, die du vom postgres02-Server hinzugefügt hast.
select count(*) from users; select * from users;
Damit hast du die Multi-Master PostgreSQL-Replikationen über Bucardo auf Ubuntu 22.04-Servern konfiguriert.
Fazit
In diesem Lernprogramm hast du den PostgreSQL-Server auf Ubuntu 22.04-Servern installiert und die Multi-Master-Replikation über Bucardo mit zwei PostgreSQL-Servern konfiguriert. Du hast gelernt, wie du PostgreSQL so einrichtest, dass es auf einer lokalen IP-Adresse läuft, die Authentifizierung für PostgreSQL-Benutzer konfigurierst, Bucardo kompilierst und installierst und wie du die Multi-Master-Replikation mit Bucardo einrichtest.
Außerdem hast du die Multi-Master-Replikation auf PostgreSQL überprüft, indem du neue Daten von PostgreSQL-Servern eingefügt hast, um sicherzustellen, dass die Datenbanken und Tabellen repliziert und synchronisiert werden.
Damit kannst du nun weitere PostgreSQL-Server zu deiner aktuellen Umgebung hinzufügen. Dann kannst du auch den Lastausgleich und das Failover über eine Drittanbieter-Anwendung wie HAPROXY einrichten oder pgPool für die Verwaltung von Client-Verbindungen verwenden. Weitere Informationen über PostgreSQL findest du in der offiziellen PostgreSQL-Dokumentation. Für Bucardo besuche die offizielle Bucardo-Dokumentation.