Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Verwenden von „pgactive“ zur Unterstützung der Aktiv-Aktiv-Replikation
Die pgactive
Erweiterung verwendet die Active-Active-Replikation, um Schreibvorgänge auf mehreren Datenbanken für Postgre-Datenbanken zu unterstützen und zu koordinieren. RDS SQL Amazon RDS for Postgre SQL unterstützt die pgactive
Erweiterung in den folgenden Versionen:
-
RDSfür Postgre SQL 16.1 und höhere 16-Versionen
-
RDSfür Postgre SQL 15.4-R2 und höhere Versionen 15
-
RDSfür Postgre SQL 14.10 und höhere 14-Versionen
-
RDSfür Postgre SQL 13.13 und höhere 13-Versionen
-
RDSfür Postgre SQL 12.17 und höhere 12-Versionen
-
RDSfür Postgre 11.22 SQL
Anmerkung
Wenn in einer Replikationskonfiguration Schreibvorgänge für mehr als eine Datenbank ausgeführt werden, sind Konflikte möglich. Weitere Informationen finden Sie unter Umgang mit Konflikten bei der Aktiv-Aktiv-Replikation
Themen
- Initialisierung der „pgactive“-Erweiterungsfunktion
- Einrichtung der aktiv-aktiven Replikation für den SQL
- Umgang mit Konflikten bei der Aktiv-Aktiv-Replikation
- Umgang mit Sequenzen bei der Aktiv-Aktiv-Replikation
- Parameterreferenz für die pgactive-Erweiterung
- Messung der Replikationsverzögerung zwischen pgactive-Mitgliedern
- Einschränkungen für die pgactive-Erweiterung
Initialisierung der „pgactive“-Erweiterungsfunktion
Um die pgactive
Erweiterungsfunktion auf Ihrer RDS for SQL Postgre-DB-Instance zu initialisieren, setzen Sie den Wert des rds.enable_pgactive
Parameters auf 1
und erstellen Sie dann die Erweiterung in der Datenbank. Dadurch werden die Parameter „rds.logical_replication
“ und „track_commit_timestamp
“ automatisch aktiviert und der Wert von wal_level
wird auf logical
festgelegt.
Sie müssen über Berechtigungen als rds_superuser
-Rolle verfügen, um diese Aufgaben ausführen zu können.
Sie können das AWS Management Console oder das verwenden AWS CLI , um die RDS für Postgre SQL erforderlichen DB-Instances zu erstellen. Bei den folgenden Schritten wird davon ausgegangen, dass Ihre RDS for SQL Postgre-DB-Instance einer benutzerdefinierten DB-Parametergruppe zugeordnet ist. Informationen zum Erstellen einer benutzerdefinierten DB-Parametergruppe finden Sie unter Parametergruppen für Amazon RDS.
So initialisieren Sie die „pgactive“-Erweiterungsfunktion
Melden Sie sich bei der an AWS Management Console und öffnen Sie die RDS Amazon-Konsole unter https://console.aws.amazon.com/rds/
. -
Wählen Sie im Navigationsbereich Ihre RDS SQL Postgre-DB-Instance aus.
-
Öffnen Sie die Registerkarte Konfiguration für Ihre RDS for SQL Postgre-DB-Instance. Suchen Sie in den Instance-Details nach dem Link DB-Instance-Parametergruppe.
-
Wählen Sie den Link, um die benutzerdefinierten Parameter zu öffnen, die mit Ihrer RDS for SQL Postgre-DB-Instance verknüpft sind.
Suchen Sie den Parameter „
rds.enable_pgactive
“ und setzen Sie ihn auf „1
“, um die „pgactive
“-Funktion zu initialisieren.Wählen Sie Änderungen speichern.
Wählen Sie im Navigationsbereich der RDS Amazon-Konsole Datenbanken aus.
Wählen Sie Ihre RDS für SQL Postgre-DB-Instance aus und wählen Sie dann im Aktionsmenü die Option Reboot aus.
Bestätigen Sie den Neustart der DB-Instance, damit die Änderungen in Kraft treten.
Wenn die DB-Instance verfügbar ist, können Sie einen beliebigen anderen SQL Postgre-Client verwenden
psql
, um eine Verbindung zur RDS for Postgre-DB-Instance herzustellen. SQLIm folgenden Beispiel wird davon ausgegangen, dass Ihre RDS for SQL Postgre-DB-Instance eine Standarddatenbank mit dem Namen hat
postgres
.psql --host=
mydb.111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=master username
--password --dbname=postgres
Führen Sie den folgenden Befehl aus, um zu überprüfen, dass „pgactive“ initialisiert ist.
postgres=>
SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';
Wenn „
pgactive
“ inshared_preload_libraries
ist, gibt der vorherige Befehl Folgendes zurück:?column? ---------- t
Erstellen Sie die Erweiterung wie folgt.
postgres=>
CREATE EXTENSION pgactive;
So initialisieren Sie die „pgactive“-Erweiterungsfunktion
Um das pgactive
mit dem zu initialisieren AWS CLI, rufen Sie den modify-db-parameter-groupVorgang auf, um bestimmte Parameter in Ihrer benutzerdefinierten Parametergruppe zu ändern, wie im folgenden Verfahren gezeigt.
Verwenden Sie den folgenden AWS CLI Befehl, um auf festzulegen
rds.enable_pgactive
,1
um diepgactive
Funktion RDS für die Postgre-DB-Instance zu initialisieren. SQLpostgres=>
aws rds modify-db-parameter-group \ --db-parameter-group-namecustom-param-group-name
\ --parameters "ParameterName=rds.enable_pgactive,ParameterValue=1,ApplyMethod=pending-reboot" \ --regionaws-region
-
Verwenden Sie den folgenden AWS CLI Befehl, um die RDS for SQL Postgre-DB-Instance neu zu starten, sodass die
pgactive
Bibliothek initialisiert wird.aws rds reboot-db-instance \ --db-instance-identifier
your-instance
\ --regionaws-region
Wenn die Instance verfügbar ist, verwenden Sie
psql
sie, um eine Verbindung zur herzustellen. RDSfür die SQL Postgre-DB-Instance.psql --host=
mydb.111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=master user
--password --dbname=postgres
Erstellen Sie die Erweiterung wie folgt.
postgres=>
CREATE EXTENSION pgactive;
Einrichtung der aktiv-aktiven Replikation für den SQL
Das folgende Verfahren zeigt Ihnen, wie Sie die aktiv-aktive Replikation zwischen zwei starten, auf denen Postgre SQL 15.4 oder höher in derselben Region ausgeführt wird. Um das Beispiel für Hochverfügbarkeit in mehreren Regionen auszuführen, müssen Sie Amazon RDS for SQL Postgre-Instances in zwei verschiedenen Regionen bereitstellen und Peering einrichtenVPC. Weitere Informationen finden Sie unter Peering. VPC
Anmerkung
Beim Senden von Datenverkehr zwischen mehreren Regionen können zusätzliche Kosten anfallen.
Bei diesen Schritten wird davon ausgegangen, dass die RDS for SQL Postgre-DB-Instance mit der pgactive
Erweiterung eingerichtet wurde. Weitere Informationen finden Sie unter Initialisierung der „pgactive“-Erweiterungsfunktion.
Um die erste RDS für SQL Postgre-DB-Instance mit der Erweiterung zu konfigurieren pgactive
Das folgende Beispiel zeigt, wie die pgactive
Gruppe erstellt wird, zusammen mit anderen Schritten, die zum Erstellen der pgactive
Erweiterung auf der RDS for SQL Postgre-DB-Instance erforderlich sind.
Verwenden Sie
psql
oder ein anderes Client-Tool, um eine Verbindung zu Ihrer ersten RDS for SQL Postgre-DB-Instance herzustellen.psql --host=
firstinstance.111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=master username
--password --dbname=postgres
Erstellen Sie mit dem folgenden Befehl eine Datenbank auf der RDS for SQL Postgre-Instance:
postgres=>
CREATE DATABASEapp
;Wechseln Sie mit dem folgenden Befehl die Verbindung zur neuen Datenbank:
\c
app
Führen Sie den folgenden Befehl aus, um zu überprüfen, ob der Parameter „
shared_preload_libraries
“ „pgactive
“ enthält:app=>
SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';?column? ---------- t
-
Erstellen Sie eine Beispieltabelle und füllen Sie sie mit den folgenden Anweisungen aus: SQL
Erstellen Sie mit der folgenden SQL Anweisung eine Beispieltabelle.
app=>
CREATE SCHEMA inventory; CREATE TABLE inventory.products ( id int PRIMARY KEY, product_name text NOT NULL, created_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP);Füllen Sie die Tabelle mit einigen Beispieldaten auf, indem Sie die folgende SQL Anweisung verwenden.
app=>
INSERT INTO inventory.products (id, product_name) VALUES (1, 'soap'), (2, 'shampoo'), (3, 'conditioner');Überprüfen Sie mithilfe der folgenden SQL Anweisung, ob Daten in der Tabelle vorhanden sind.
app=>
SELECT count(*) FROM inventory.products;count ------- 3
Erstellen Sie eine „
pgactive
“-Erweiterung für die bestehende Datenbank.app=>
CREATE EXTENSION pgactive;Erstellen und initialisieren Sie die Gruppe „pgactive“ mit den folgenden Befehlen:
app=>
SELECT pgactive.pgactive_create_group( node_name :='node1-app'
, node_dsn := 'dbname=app
host=firstinstance.111122223333
.aws-region
.rds.amazonaws.com user=master username
password=PASSWORD
');node1-app ist der Name, den Sie vergeben, um einen Knoten in der „
pgactive
“-Gruppe eindeutig zu identifizieren.Anmerkung
Um diesen Schritt erfolgreich auf einer DB-Instance durchzuführen, auf die öffentlich zugegriffen werden kann, müssen Sie den Parameter „
rds.custom_dns_resolution
“ aktivieren, indem Sie ihn auf1
setzen.Verwenden Sie den folgenden Befehl, um zu überprüfen, ob die DB-Instance bereit ist:
app=>
SELECT pgactive.pgactive_wait_for_node_ready();Wird der Befehl erfolgreich ausgeführt, wird Ihnen die folgende Ausgabe angezeigt:
pgactive_wait_for_node_ready ------------------------------ (1 row)
Um die zweite RDS für SQL Postgre-Instanz zu konfigurieren und sie der pgactive
Gruppe hinzuzufügen
Das folgende Beispiel zeigt, wie Sie der pgactive
Gruppe eine RDS for SQL Postgre-DB-Instance hinzufügen können, zusammen mit anderen Schritten, die zum Erstellen der pgactive
Erweiterung auf der DB-Instance erforderlich sind.
Bei diesen Schritten wird davon ausgegangen, dass ein weiterer für SQL Postgre-DB-Instances mit der pgactive
Erweiterung eingerichtet wurde. Weitere Informationen finden Sie unter Initialisierung der „pgactive“-Erweiterungsfunktion.
Verwenden Sie
psql
, um sich mit der Instance zu verbinden, die Updates vom Herausgeber erhalten soll.psql --host=
secondinstance.111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=master username
--password --dbname=postgres
Erstellen Sie mit dem folgenden Befehl eine Datenbank auf der zweiten RDS für SQL Postgre-DB-Instance:
postgres=>
CREATE DATABASEapp
;Wechseln Sie mit dem folgenden Befehl die Verbindung zur neuen Datenbank:
\c
app
Erstellen Sie die „
pgactive
“-Erweiterung für die bestehende Datenbank.app=>
CREATE EXTENSION pgactive;Fügen Sie den für die SQL zweite Postgre-DB-Instance wie folgt der
pgactive
Gruppe hinzu.app=>
SELECT pgactive.pgactive_join_group( node_name :='node2-app'
, node_dsn := 'dbname=app
host=secondinstance.111122223333
.aws-region
.rds.amazonaws.com user=master username
password=PASSWORD
', join_using_dsn := 'dbname=app
host=firstinstance.111122223333
.aws-region
.rds.amazonaws.com user=postgres
password=PASSWORD
');node2-app ist der Name, den Sie vergeben, um einen Knoten in der „
pgactive
“-Gruppe eindeutig zu identifizieren.Verwenden Sie den folgenden Befehl, um zu überprüfen, ob die DB-Instance bereit ist:
app=>
SELECT pgactive.pgactive_wait_for_node_ready();Wird der Befehl erfolgreich ausgeführt, wird Ihnen die folgende Ausgabe angezeigt:
pgactive_wait_for_node_ready ------------------------------ (1 row)
Wenn die erste SQL Datenbank RDS für Postgre relativ groß ist, können Sie sehen
pgactive.pgactive_wait_for_node_ready()
, dass der Fortschrittsbericht über den Wiederherstellungsvorgang ausgegeben wird. Die Ausgabe sieht folgendermaßen oder ähnlich aus:NOTICE: restoring database 'app', 6% of 7483 MB complete NOTICE: restoring database 'app', 42% of 7483 MB complete NOTICE: restoring database 'app', 77% of 7483 MB complete NOTICE: restoring database 'app', 98% of 7483 MB complete NOTICE: successfully restored database 'app' from node node1-app in 00:04:12.274956 pgactive_wait_for_node_ready ------------------------------ (1 row)
Ab diesem Zeitpunkt werden die Daten zwischen den beiden DB-Instances durch „
pgactive
“ synchronisiert.Sie können den folgenden Befehl verwenden, um zu überprüfen, ob die Datenbank der zweiten DB-Instance die Daten enthält:
app=>
SELECT count(*) FROM inventory.products;Wenn die Daten erfolgreich synchronisiert wurden, sehen Sie die folgende Ausgabe:
count ------- 3
Führen Sie den folgenden Befehl aus, um neue Werte einzufügen:
app=>
INSERT INTO inventory.products (id, product_name) VALUES ('lotion');Stellen Sie eine Verbindung zur Datenbank der ersten DB-Instance her und führen Sie die folgende Abfrage aus:
app=>
SELECT count(*) FROM inventory.products;Wenn die Aktiv-Aktiv-Replikation initialisiert ist, sieht die Ausgabe ungefähr wie folgt aus:
count ------- 4
So trennen Sie eine DB-Instance von der „pgactive
“-Gruppe und entfernen Sie daraus
Sie können eine DB-Instance mit den folgenden Schritten von der „pgactive
“-Gruppe trennen und daraus entfernen:
Sie können die zweite DB-Instance mit dem folgenden Befehl von der ersten DB-Instance trennen:
app=>
SELECT * FROM pgactive.pgactive_detach_nodes(ARRAY[‘node2-app
']);Entfernen Sie die „
pgactive
“-Erweiterung mit dem folgenden Befehl aus der zweiten DB-Instance:app=>
SELECT * FROM pgactive.pgactive_remove();So erzwingen Sie die Entfernung der Erweiterung:
app=>
SELECT * FROM pgactive.pgactive_remove(true);Löschen Sie die Erweiterung mit dem folgenden Befehl:
app=>
DROP EXTENSION pgactive;
Umgang mit Konflikten bei der Aktiv-Aktiv-Replikation
Die „pgactive
“-Erweiterung funktioniert pro Datenbank und nicht pro Cluster. Jede DB-Instance, die „pgactive
“ verwendet, ist eine unabhängige Instance und kann Datenänderungen aus jeder Quelle akzeptieren. Wenn eine Änderung an eine DB-Instance gesendet wird, überträgt Postgre SQL sie lokal und repliziert die Änderung anschließend asynchron pgactive
auf andere DB-Instances. Wenn zwei SQL Postgre-DB-Instances denselben Datensatz fast zur gleichen Zeit aktualisieren, kann es zu einem Konflikt kommen.
Die Erweiterung „pgactive
“ bietet Mechanismen zur Konflikterkennung und automatischen Lösung. Sie verfolgt den Zeitstempel, zu dem die Transaktion auf beiden DB-Instances festgeschrieben wurde, und wendet die Änderung automatisch mit dem neuesten Zeitstempel an. Die Erweiterung „pgactive
“ protokolliert auch, wenn in der Tabelle pgactive.pgactive_conflict_history
ein Konflikt auftritt.
Sie pgactive.pgactive_conflict_history
werden weiter wachsen. Möglicherweise möchten Sie eine Löschrichtlinie definieren. Dies kann erreicht werden, indem Sie regelmäßig einige Datensätze löschen oder ein Partitionierungsschema für diese Beziehung definieren (und später die gewünschten Partitionen trennen, löschen oder kürzen). Um die Bereinigungsrichtlinie regelmäßig zu implementieren, besteht eine Möglichkeit darin, die Erweiterung zu verwenden. pg_cron
Im Folgenden finden Sie ein Beispiel für die pg_cron
History-Tabelle Scheduling maintenance with the Postgre SQL pg_cron extension.
Umgang mit Sequenzen bei der Aktiv-Aktiv-Replikation
Eine RDS SQL For-Postgre-DB-Instance mit der pgactive
Erweiterung verwendet zwei verschiedene Sequenzmechanismen, um eindeutige Werte zu generieren.
Globale Sequenzen
Um eine globale Sequenz zu verwenden, erstellen Sie mit der Anweisung CREATE SEQUENCE
eine lokale Sequenz. Verwenden Sie pgactive.pgactive_snowflake_id_nextval(seqname)
statt usingnextval(seqname)
, um den nächsten eindeutigen Wert der Sequenz abzurufen.
Mit dem folgenden Beispiel wird eine globale Sequenz erstellt:
postgres=>
CREATE TABLE gstest ( id bigint primary key, parrot text );
postgres=>
CREATE SEQUENCE gstest_id_seq OWNED BY gstest.id;
postgres=>
ALTER TABLE gstest \ ALTER COLUMN id SET DEFAULT \ pgactive.pgactive_snowflake_id_nextval('gstest_id_seq');
Partitionierte Sequenzen
In Split-Step- oder partitionierten Sequenzen wird auf jedem Knoten eine normale SQL Postgre-Sequenz verwendet. Jede Sequenz wird um den gleichen Betrag inkrementiert und beginnt mit unterschiedlichen Offsets. Bei Schritt 100 generiert Knoten 1 beispielsweise die Sequenz 101, 201, 301 usw. und Knoten 2 generiert die Sequenz 102, 202, 302 usw. Dieses Schema funktioniert auch dann gut, wenn die Knoten über einen längeren Zeitraum nicht kommunizieren können. Es ist jedoch erforderlich, dass der Designer bei der Einrichtung des Schemas eine maximale Anzahl von Knoten festlegt und jeden Knoten einzeln konfiguriert. Fehler können leicht zu überlappenden Sequenzen führen.
Es ist relativ einfach, diesen Ansatz mit pgactive
zu konfigurieren, indem Sie die gewünschte Sequenz auf einem Knoten wie folgt erstellen:
CREATE TABLE some_table (generated_value bigint primary key);
postgres=>
CREATE SEQUENCE some_seq INCREMENT 100 OWNED BY some_table.generated_value;
postgres=>
ALTER TABLE some_table ALTER COLUMN generated_value SET DEFAULT nextval('some_seq');
Rufen Sie dann setval
auf jedem Knoten auf, um einen anderen Offset-Startwert wie folgt anzugeben.
postgres=>
-- On node 1 SELECT setval('some_seq', 1); -- On node 2 SELECT setval('some_seq', 2);
Parameterreferenz für die pgactive-Erweiterung
Sie können die folgende Abfrage verwenden, um alle mit der „pgactive
“-Erweiterung verknüpften Parameter anzuzeigen.
postgres=>
SELECT * FROM pg_settings WHERE name LIKE 'pgactive.%';
Messung der Replikationsverzögerung zwischen pgactive-Mitgliedern
Sie können die folgende Abfrage verwenden, um die Replikationsverzögerung zwischen den pgactive
Mitgliedern anzuzeigen. Führen Sie diese Abfrage auf jedem pgactive
Knoten aus, um sich ein vollständiges Bild zu machen.
postgres=# SELECT *, (last_applied_xact_at - last_applied_xact_committs) AS lag FROM pgactive.pgactive_node_slots;
-{ RECORD 1 ]----------------+-----------------------------------------------------------------
node_name | node2-app
slot_name | pgactive_5_7332551165694385385_0_5__
slot_restart_lsn | 0/1A898A8
slot_confirmed_lsn | 0/1A898E0
walsender_active | t
walsender_pid | 69022
sent_lsn | 0/1A898E0
write_lsn | 0/1A898E0
flush_lsn | 0/1A898E0
replay_lsn | 0/1A898E0
last_sent_xact_id | 746
last_sent_xact_committs | 2024-02-06 18:04:22.430376+00
last_sent_xact_at | 2024-02-06 18:04:22.431359+00
last_applied_xact_id | 746
last_applied_xact_committs | 2024-02-06 18:04:22.430376+00
last_applied_xact_at | 2024-02-06 18:04:52.452465+00
lag | 00:00:30.022089
Einschränkungen für die pgactive-Erweiterung
Alle Tabellen benötigen einen Primärschlüssel, andernfalls sind Aktualisierungen und Löschungen nicht zulässig. Die Werte in der Spalte „Primärschlüssel“ sollten nicht aktualisiert werden.
Sequenzen können Lücken aufweisen und manchmal keine bestimmte Reihenfolge beachten. Sequenzen werden nicht repliziert. Weitere Informationen finden Sie unter Umgang mit Sequenzen bei der Aktiv-Aktiv-Replikation.
DDLund große Objekte werden nicht repliziert.
Sekundäre eindeutige Indizes können zu Datendivergenzen führen.
Die Sortierung muss auf allen Knoten in der Gruppe identisch sein.
Das Load Balancing zwischen den Knoten ist ein Anti-Muster.
Große Transaktionen können zu Verzögerungen bei der Replikation führen.