Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Utilizzo di pglogical per sincronizzare i dati tra le istanze
Tutte le versioni di Aurora PostgreSQL attualmente disponibili supportano l'estensione pglogical
, che precede la funzionalità di replica logica funzionalmente simile introdotta nella versione 10 di PostgreSQL. Per ulteriori informazioni, consulta Utilizzo della replica logica di PostgreSQL con Aurora.
L'estensione pglogical
supporta la replica logica tra due o più cluster database Aurora PostgreSQL. Supporta anche la replica tra diverse versioni di PostgreSQL e tra database in esecuzione in istanze database RDS per PostgreSQL e cluster database Aurora PostgreSQL. L'estensione pglogical
utilizza un modello publish-subscribe per replicare le modifiche apportate alle tabelle e ad altri oggetti, come le sequenze, da un publisher in un subscriber. Si basa su uno slot di replica per garantire la sincronizzazione delle modifiche da un nodo publisher a un nodo subscriber, definiti come indicato di seguito.
Il nodo publisher è il cluster database Aurora PostgreSQL che costituisce l'origine dei dati da replicare in altri nodi. Il nodo publisher definisce le tabelle da replicare in un set di pubblicazione.
Il nodo subscriber è il cluster database Aurora PostgreSQL che riceve gli aggiornamenti WAL dal publisher. Il subscriber crea una sottoscrizione per connettersi al publisher e ottenere i dati WAL decodificati e contemporaneamente nel nodo publisher viene creato lo slot di replica.
Di seguito sono riportati gli argomenti sull'impostazione dell'estensione pglogical
.
Argomenti
- Requisiti e limitazioni dell'estensione pglogical
- Impostazione dell'estensione pglogical
- Impostazione della replica logica per il cluster database Aurora PostgreSQL
- Riconnessione della replica logica dopo un aggiornamento principale
- Gestione degli slot di replica logica per Aurora PostgreSQL
- Riferimento sui parametri dell'estensione pglogical
Requisiti e limitazioni dell'estensione pglogical
Tutte le versioni attualmente disponibili di Aurora PostgreSQL supportano l'estensione pglogical
.
Sia il nodo publisher che il nodo subscriber devono essere impostati per la replica logica.
Le tabelle che devono essere replicate dal subscriber nel publisher devono avere gli stessi nomi e lo stesso schema. Inoltre devono contenere le stesse colonne e le colonne devono utilizzare gli stessi tipi di dati. Le tabelle del publisher e del subscriber devono avere le stesse chiavi primarie. Si consiglia di utilizzare solo la CHIAVE PRIMARIA come vincolo univoco.
Le tabelle del nodo subscriber possono avere vincoli più permissivi rispetto ai vincoli CHECK e NOT NULL delle tabelle del nodo publisher.
L'estensione pglogical
fornisce funzionalità, come la replica bidirezionale, che non sono supportate dalla funzionalità di replica logica integrata in PostgreSQL 10 e versioni successive. Per ulteriori informazioni, consulta PostgreSQL bi-directional replication using pglogical
Impostazione dell'estensione pglogical
Per impostare l'estensione pglogical
per il cluster database Aurora PostgreSQL, aggiungi pglogical
alle librerie condivise nel gruppo di parametri del·cluster database personalizzato per il cluster database Aurora PostgreSQL. È inoltre necessario impostare il valore del parametro rds.logical_replication
su 1
per attivare la decodifica logica. Infine, crei l'estensione nel database. Per queste attività puoi utilizzare la AWS Management Console o AWS CLI.
Per eseguire queste attività sono richieste le autorizzazioni del ruolo rds_superuser
.
Le fasi seguenti si basano sull'ipotesi che il cluster database Aurora PostgreSQL sia associato a un gruppo di parametri cluster di database personalizzato. Per informazioni sulla creazione di un gruppo di parametri del·cluster database, consulta Utilizzo di gruppi di parametri.
Per impostare l'estensione pglogical
Accedi alla AWS Management Console e apri la console Amazon RDS all'indirizzo https://console.aws.amazon.com/rds/
. -
Nel riquadro di navigazione, scegli l'istanza di scrittura del cluster database Aurora PostgreSQL .
-
Apri la scheda Configurazione per l'istanza di scrittura del cluster database Aurora PostgreSQL. Tra i dettagli dell'istanza, individua il collegamento Parameter group (Gruppo di parametri).
-
Scegli il collegamento per aprire i parametri personalizzati associati al cluster database Aurora PostgreSQL.
-
Nel campo di ricerca Parametri, digita
shared_pre
per trovare il parametroshared_preload_libraries
. -
Scegli Edit parameters (Modifica parametri) per accedere ai valori delle proprietà.
-
Aggiungi
pglogical
all'elenco nel campo Values (Valori). Utilizza una virgola per separare gli elementi nell'elenco di valori. Individua il parametro
rds.logical_replication
e impostalo su1
per attivare la replica logica.Riavvia l'istanza di scrittura del cluster database Aurora PostgreSQL per rendere effettive le modifiche.
Quando l'istanza è disponibile, puoi utilizzare
psql
(o pgAdmin) per connetterti all'istanza di scrittura del cluster database Aurora PostgreSQL.psql --host=
111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
Per verificare che l'estensione pglogical sia inizializzata, esegui il seguente comando.
SHOW shared_preload_libraries;
shared_preload_libraries -------------------------- rdsutils,pglogical (1 row)
Verifica l'impostazione che abilita la decodifica logica, come indicato di seguito.
SHOW wal_level;
wal_level ----------- logical (1 row)
Crea l'estensione, come indicato di seguito.
CREATE EXTENSION pglogical;
EXTENSION CREATED
Seleziona Salvataggio delle modifiche.
Apri la console di Amazon RDS all'indirizzo https://console.aws.amazon.com/rds/
. Scegli l'istanza di scrittura del cluster database Aurora PostgreSQL dall'elenco di database per selezionarla, quindi scegli Reboot (Riavvia) dal menu Actions (Operazioni).
Per impostare l'estensione pglogical
Per configurare pglogical utilizzandoAWS CLI, si chiama l'modify-db-parameter-groupoperazione per modificare determinati parametri nel gruppo di parametri personalizzato, come illustrato nella procedura seguente.
Utilizza il seguente comando AWS CLI per aggiungere
pglogical
al parametroshared_preload_libraries
.aws rds modify-db-parameter-group \ --db-parameter-group-name
custom-param-group-name
\ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pglogical,ApplyMethod=pending-reboot" \ --regionaws-region
Utilizza il seguente comando AWS CLI per impostare
rds.logical_replication
su1
per attivare la funzionalità di decodifica logica per l'istanza di scrittura del cluster database Aurora PostgreSQL.aws rds modify-db-parameter-group \ --db-parameter-group-name
custom-param-group-name
\ --parameters "ParameterName=rds.logical_replication,ParameterValue=1,ApplyMethod=pending-reboot" \ --regionaws-region
-
Utilizza il seguente comando AWS CLI per riavviare l'istanza di scrittura del cluster database Aurora PostgreSQL in modo che la libreria pglogical venga inizializzata.
aws rds reboot-db-instance \ --db-instance-identifier
writer-instance
\ --regionaws-region
Quando l'istanza è disponibile, utilizza
psql
per connetterti all'istanza di scrittura del cluster database Aurora PostgreSQL.psql --host=
111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
Crea l'estensione, come indicato di seguito.
CREATE EXTENSION pglogical;
EXTENSION CREATED
Riavvia l'istanza di scrittura del cluster database Aurora PostgreSQL utilizzando il comando AWS CLI seguente.
aws rds reboot-db-instance \ --db-instance-identifier
writer-instance
\ --regionaws-region
Impostazione della replica logica per il cluster database Aurora PostgreSQL
La seguente procedura mostra come avviare la replica logica tra due cluster database Aurora PostgreSQL. I passaggi presuppongono che sia l'origine (publisher) che la destinazione (subscriber) abbiano l'estensione pglogical
impostata come descritto dettagliatamente in Impostazione dell'estensione pglogical.
Per creare il nodo publisher e definire le tabelle da replicare
Questi passaggi presuppongono che il cluster database Aurora PostgreSQL abbia un'istanza di scrittura con un database contenente una o più tabelle che desideri replicare in un altro nodo. È necessario ricreare la struttura delle tabelle dal publisher nel subscriber, quindi prima, se occorre, recupera la struttura delle tabelle. Puoi farlo utilizzando il metacomando psq1
\d
e quindi creando la stessa tabella nell'istanza subscriber. Nella procedura seguente viene illustrato come creare una tabella di esempio nel publisher (origine) a scopo dimostrativo.tablename
Utilizza
psql
per connetterti all'istanza che include la tabella da usare come origine per i subscriber.psql --host=
source-instance
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
Se non hai una tabella esistente da replicare, puoi creare una tabella di esempio come indicato di seguito.
Crea una tabella di esempio utilizzando la seguente istruzione SQL.
CREATE TABLE docs_lab_table (a int PRIMARY KEY);
Popola la tabella con i dati generati utilizzando la seguente istruzione SQL.
INSERT INTO docs_lab_table VALUES (generate_series(1,5000));
INSERT 0 5000
Verifica che i dati siano presenti nella tabella utilizzando la seguente istruzione SQL.
SELECT count(*) FROM docs_lab_table;
Identifica il cluster database Aurora PostgreSQL come nodo publisher, come indicato di seguito.
SELECT pglogical.create_node( node_name := '
docs_lab_provider
', dsn := 'host=source-instance
.aws-region
.rds.amazonaws.com port=5432 dbname=labdb
');create_node ------------- 3410995529 (1 row)
Aggiungi la tabella da replicare al set di replica predefinito. Per ulteriori informazioni sui set di replica, consulta Replication sets
(Set di replica) nella documentazione di pglogical. SELECT pglogical.replication_set_add_table('default', '
docs_lab_table
', 'true', NULL, NULL);replication_set_add_table --------------------------- t (1 row)
L'impostazione del nodo publisher è completata. Ora puoi impostare il nodo subscriber per ricevere gli aggiornamenti dal publisher.
Per impostare il nodo subscriber e creare una sottoscrizione per ricevere gli aggiornamenti
Questi passaggi presuppongono che sia stata eseguita l'impostazione del cluster database Aurora PostgreSQL con l'estensione pglogical
. Per ulteriori informazioni, consulta Impostazione dell'estensione pglogical.
Utilizza
psql
per connetterti all'istanza per cui vuoi ricevere gli aggiornamenti dal publisher.psql --host=
target-instance
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
-
Nel cluster database Aurora PostgreSQL del subscriber crea la stessa tabella presente nel publisher. In questo esempio, la tabella è
docs_lab_table
. È possibile creare la tabella come indicato di seguito.CREATE TABLE docs_lab_table (a int PRIMARY KEY);
Verifica che questa tabella sia vuota.
SELECT count(*) FROM docs_lab_table;
count ------- 0 (1 row)
Identifica il cluster database Aurora PostgreSQL come nodo subscriber, come indicato di seguito.
SELECT pglogical.create_node( node_name := '
docs_lab_target
', dsn := 'host=target-instance
.aws-region
.rds.amazonaws.com port=5432 sslmode=require dbname=labdb
user=postgres
password=********
');create_node ------------- 2182738256 (1 row)
Crea la sottoscrizione.
SELECT pglogical.create_subscription( subscription_name := 'docs_lab_subscription', provider_dsn := 'host=
source-instance
.aws-region
.rds.amazonaws.com port=5432 sslmode=require dbname=labdb
user=postgres
password=*******
', replication_sets := ARRAY['default'], synchronize_data := true, forward_origins := '{}' );create_subscription --------------------- 1038357190 (1 row)
Una volta completato questo passaggio, i dati della tabella del publisher vengono creati nella tabella del subscriber. È possibile verificare questa operazione utilizzando la seguente query SQL.
SELECT count(*) FROM docs_lab_table;
count ------- 5000 (1 row)
Da questo momento in poi, le modifiche apportate alla tabella del publisher vengono replicate nella tabella del subscriber.
Riconnessione della replica logica dopo un aggiornamento principale
Prima di poter eseguire un aggiornamento della versione principale di un cluster database Aurora PostgreSQL impostata come nodo publisher per la replica logica, è necessario rimuovere tutti gli slot di replica, anche quelli non attivi. Si consiglia di deviare temporaneamente le transazioni del database dal nodo publisher, rimuovere gli slot di replica, aggiornare il cluster database Aurora PostgreSQL e quindi riconnettere e riavviare la replica.
Gli slot di replica sono ospitati solo nel nodo publisher. Il nodo subscriber Aurora PostgreSQL in uno scenario di replica logica non ha slot da rimuovere. Il processo di aggiornamento alla versione principale di Aurora PostgreSQL supporta l'aggiornamento del subscriber a una nuova versione principale di PostgreSQL indipendente dal nodo publisher. Tuttavia, il processo di aggiornamento interrompe il processo di replica e interferisce con la sincronizzazione dei dati WAL tra il nodo publisher e il nodo subscriber. È necessario riconnettere la replica logica tra publisher e subscriber dopo aver aggiornato il publisher, il subscriber o entrambi. Nella procedura seguente viene illustrato come determinare se la replica è stata interrotta e come risolvere il problema.
Determinazione della replica logica interrotta
È possibile determinare che il processo di replica è stato interrotto eseguendo una query sul nodo publisher o sul nodo subscriber, come indicato di seguito.
Per controllare il nodo publisher
Utilizza
psql
per connetterti al nodo publisher e quindi esegui la query sulla funzionepg_replication_slots
. Osserva il valore nella colonna attiva. Normalmente, la query restituiscet
(true) per indicare che la replica è attiva. Se restituiscef
(false), indica che la replica nel subscriber è stata interrotta.SELECT slot_name,plugin,slot_type,active FROM pg_replication_slots;
slot_name | plugin | slot_type | active -------------------------------------------+------------------+-----------+-------- pgl_labdb_docs_labcb4fa94_docs_lab3de412c | pglogical_output | logical | f (1 row)
Per controllare il nodo subscriber
Nel nodo subscriber è possibile verificare lo stato della replica in tre modi diversi.
Esamina i log di PostgreSQL sul nodo subscriber per trovare i messaggi di errore. Il log identifica gli errori nei messaggi che includono il codice di uscita 1, come illustrato di seguito.
2022-07-06 16:17:03 UTC::@:[7361]:LOG: background worker "pglogical apply 16404:2880255011" (PID 14610) exited with exit code 1 2022-07-06 16:19:44 UTC::@:[7361]:LOG: background worker "pglogical apply 16404:2880255011" (PID 21783) exited with exit code 1
Esegui la query sulla funzione
pg_replication_origin
. Connettiti al database sul nodo subscriber utilizzandopsql
ed esegui la query sulla funzionepg_replication_origin
, come indicato di seguito.SELECT * FROM pg_replication_origin;
roident | roname ---------+-------- (0 rows)
Se il set di risultati è vuoto, la replica è stata interrotta. Normalmente, viene restituito l'output riportato di seguito.
roident | roname ---------+---------------------------------------------------- 1 | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
Esegui la query sulla funzione
pglogical.show_subscription_status
come illustrato nell'esempio seguente.SELECT subscription_name,status,slot_name FROM pglogical.show_subscription_status();
subscription_name | status | slot_name ---====----------------+--------+------------------------------------- docs_lab_subscription | down | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
Questo output mostra che la replica è stata interrotta. Lo stato è
down
e normalmente l'output mostra lo statoreplicating
.
Se il processo di replica logica è stato interrotto, è possibile riconnettere la replica seguendo questi passaggi.
Per riconnettere la replica logica tra i nodi publisher e subscriber
Per riconnettere la replica, devi prima disconnettere il subscriber dal nodo publisher e quindi riconnettere la sottoscrizione, come descritto in questi passaggi.
Connettiti al nodo subscriber utilizzando
psql
, come indicato di seguito.psql --host=
222222222222
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
Disattiva la sottoscrizione utilizzando la funzione
pglogical.alter_subscription_disable
.SELECT pglogical.alter_subscription_disable('docs_lab_subscription',true);
alter_subscription_disable ---------------------------- t (1 row)
Ottieni l'identificatore del nodo publisher eseguendo la query su
pg_replication_origin
, come indicato di seguito.SELECT * FROM pg_replication_origin;
roident | roname ---------+------------------------------------- 1 | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
Utilizza la risposta restituita dal passaggio precedente con il comando
pg_replication_origin_create
per assegnare l'identificatore che può essere usato dalla sottoscrizione una volta riconnessa.SELECT pg_replication_origin_create('pgl_labdb_docs_labcb4fa94_docs_lab3de412c');
pg_replication_origin_create ------------------------------ 1 (1 row)
Attiva la sottoscrizione specificando il nome con lo stato
true
, come illustrato nell'esempio seguente.SELECT pglogical.alter_subscription_enable('docs_lab_subscription',true);
alter_subscription_enable --------------------------- t (1 row)
Controlla lo stato del nodo. Lo stato deve essere replicating
come mostrato nell'esempio.
SELECT subscription_name,status,slot_name FROM pglogical.show_subscription_status();
subscription_name | status | slot_name -------------------------------+-------------+------------------------------------- docs_lab_subscription | replicating | pgl_labdb_docs_lab98f517b_docs_lab3de412c (1 row)
Verifica lo stato dello slot di replica del subscriber sul nodo publisher. La colonna active
dello slot deve restituire t
(true) per indicare che la replica è stata riconnessa.
SELECT slot_name,plugin,slot_type,active FROM pg_replication_slots;
slot_name | plugin | slot_type | active -------------------------------------------+------------------+-----------+-------- pgl_labdb_docs_lab98f517b_docs_lab3de412c | pglogical_output | logical | t (1 row)
Gestione degli slot di replica logica per Aurora PostgreSQL
Prima di poter eseguire un aggiornamento alla versione principale su un'istanza di scrittura del cluster database Aurora PostgreSQL che funge da nodo publisher in uno scenario di replica logica, è necessario rimuovere gli slot di replica nell'istanza. Il processo di verifica preliminare dell'aggiornamento alla versione principale avvisa che l'aggiornamento non può procedere fino a quando gli slot non vengono rimossi.
Per identificare gli slot di replica creati utilizzando l'estensione pglogical
, accedi a ciascun database e recupera il nome dei nodi. Quando esegui la query sul nodo subscriber, nell'output viene restituito sia il nodo publisher che il nodo subscriber, come mostrato nell'esempio seguente.
SELECT * FROM pglogical.node;
node_id | node_name ------------+------------------- 2182738256 | docs_lab_target 3410995529 | docs_lab_provider (2 rows)
Puoi ottenere i dettagli sulla sottoscrizione con la seguente query.
SELECT sub_name,sub_slot_name,sub_target FROM pglogical.subscription;
sub_name | sub_slot_name | sub_target ----------+--------------------------------+------------ docs_lab_subscription | pgl_labdb_docs_labcb4fa94_docs_lab3de412c | 2182738256 (1 row)
A questo punto puoi rimuovere la sottoscrizione, come indicato di seguito.
SELECT pglogical.drop_subscription(subscription_name := 'docs_lab_subscription');
drop_subscription ------------------- 1 (1 row)
Dopo aver rimosso la sottoscrizione, puoi eliminare il nodo.
SELECT pglogical.drop_node(node_name := 'docs-lab-subscriber');
drop_node ----------- t (1 row)
Puoi verificare che il nodo sia stato eliminato, come indicato di seguito.
SELECT * FROM pglogical.node;
node_id | node_name ---------+----------- (0 rows)
Riferimento sui parametri dell'estensione pglogical
Nella tabella sono illustrati i parametri associati all'estensione pglogical
. Parametri come pglogical.conflict_log_level
e pglogical.conflict_resolution
vengono utilizzati per gestire i conflitti di aggiornamento. I conflitti possono emergere quando vengono apportate modifiche localmente alle stesse tabelle che hanno una sottoscrizione con il publisher. I conflitti possono verificarsi anche in altri scenari, ad esempio la replica bidirezionale o quando più subscriber eseguono la replica dallo stesso publisher. Per ulteriori informazioni, consulta PostgreSQL bi-directional replication using pglogical
Parametro | Descrizione |
---|---|
pglogical.batch_inserts | Esegue inserimenti batch, se possibile. Non impostato per impostazione predefinita. Imposta "1" per attivarlo, "0" per disattivarlo. |
pglogical.conflict_log_level | Imposta il livello di log da utilizzare per la registrazione dei conflitti risolti. I valori di stringa supportati sono debug5, debug4, debug3, debug2, debug1, info, notice, warning, error, log, fatal, panic. |
pglogical.conflict_resolution | Imposta il metodo da utilizzare per risolvere i conflitti quando sono risolvibili. I valori di stringa supportati sono error, apply_remote, keep_local, last_update_wins, first_update_wins. |
pglogical.extra_connection_options | Specifica le opzioni di connessione da aggiungere a tutte le connessioni dei nodi peer. |
pglogical.synchronous_commit | Valore di commit sincrono specifico pglogical |
pglogical.use_spi | Utilizza la SPI (Server Programming Interface) invece dell'API di basso livello per applicare le modifiche. Imposta "1" per attivarlo, "0" per disattivarlo. Per ulteriori informazioni sulla SPI, consulta Server Programming Interface |