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 pgactive per supportare la replica active-active
L'pgactive
estensione utilizza la replica attiva-attiva per supportare e coordinare le operazioni di scrittura su più database Postgre. RDS SQL Amazon RDS for Postgre SQL supporta l'pgactive
estensione nelle seguenti versioni:
-
RDSper Postgre SQL 16.1 e versioni successive (16)
-
RDSper Postgre 15.4-R2 e versioni successive 15 SQL
-
RDSper SQL Postgre 14.10 e versioni successive 14
-
RDSper Postgre 13.13 e versioni successive 13 SQL
-
RDSper Postgre 12.17 e versioni successive 12 SQL
-
RDSper Postgre 11.22 SQL
Nota
Quando sono presenti operazioni di scrittura su più di un database in una configurazione di replica, sono possibili conflitti. Per ulteriori informazioni, consulta Gestione dei conflitti nella replica active-active
Inizializzazione della funzionalità di estensione pgactive
Per inizializzare la funzionalità di pgactive
estensione sulla tua istanza SQL DB RDS for Postgre, imposta il valore del rds.enable_pgactive
parametro su, quindi crea l'estensione nel database. 1
In questo modo si attivano automaticamente i parametri rds.logical_replication
e track_commit_timestamp
e il valore wal_level
viene impostato su logical
.
Per eseguire queste attività sono richieste le autorizzazioni del ruolo rds_superuser
.
Puoi usare AWS Management Console o the AWS CLI per creare le istanze database necessarie RDS per SQL Postgre. I passaggi seguenti presuppongono che l'istanza SQL DB RDS for Postgre sia associata a un gruppo di parametri DB personalizzato. Per ulteriori informazioni sulla creazione di un gruppo di parametri personalizzato, consulta Gruppi di parametri per RDS.
Inizializzazione della funzionalità di estensione pgactive
Accedi a AWS Management Console e apri la RDS console Amazon all'indirizzo https://console.aws.amazon.com/rds/
. -
Nel pannello di navigazione, scegli la tua istanza SQL DB RDS per Postgree.
-
Apri la scheda Configurazione RDS per l'istanza DB di SQL Postgre. Nei dettagli dell'istanza, trova il link Gruppo di parametri dell'istanza database.
-
Scegli il link per aprire i parametri personalizzati associati alla tua istanza RDS per SQL Postgre DB.
Trova il parametro
rds.enable_pgactive
e impostalo su1
per inizializzare la funzionalitàpgactive
.Scegli Save changes (Salva modifiche).
Nel pannello di navigazione della RDS console Amazon, scegli Databases.
Seleziona la tua istanza SQL DB RDS per Postgre, quindi scegli Reboot dal menu Azioni.
Conferma il riavvio dell'istanza database per applicare le modifiche.
Quando l'istanza DB è disponibile, puoi utilizzare
psql
qualsiasi altro SQL client Postgre per connetterti all'istanza DB per Postgre. RDS SQLL'esempio seguente presuppone che l'istanza DB RDS for Postgre SQL abbia un database predefinito denominato
postgres
.psql --host=
mydb.111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=master username
--password --dbname=postgres
Per verificare che l'estensione pgactive sia inizializzata, esegui il seguente comando.
postgres=>
SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';
Se
pgactive
è presente inshared_preload_libraries
, il comando precedente restituirà quanto segue:?column? ---------- t
Crea l'estensione, come indicato di seguito.
postgres=>
CREATE EXTENSION pgactive;
Inizializzazione della funzionalità di estensione pgactive
Per inizializzare l'pgactive
utilizzo di AWS CLI, chiamate l'modify-db-parameter-groupoperazione per modificare determinati parametri nel gruppo di parametri personalizzato, come illustrato nella procedura seguente.
Utilizzate il AWS CLI comando seguente per impostare o
rds.enable_pgactive
1
inizializzare lapgactive
funzionalità per l'istanza database RDS for SQL Postgre.postgres=>
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
-
Utilizzate il AWS CLI comando seguente RDS per riavviare l'istanza For Postgre SQL DB in modo che la libreria venga inizializzata.
pgactive
aws rds reboot-db-instance \ --db-instance-identifier
your-instance
\ --regionaws-region
Quando l'istanza è disponibile, usala
psql
per connetterti all' DB. RDSper l'istanza DB di SQL Postgre.psql --host=
mydb.111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=master user
--password --dbname=postgres
Crea l'estensione, come indicato di seguito.
postgres=>
CREATE EXTENSION pgactive;
Configurazione della replica attiva-attiva per il cluster RDS SQL
La procedura seguente mostra come avviare la replica attiva-attiva tra due cluster 15.4 o versioni successive nella stessa regione. SQL Per eseguire l'esempio di alta disponibilità multiregionale, devi distribuire SQL istanze Amazon RDS for Postgre in due regioni diverse e configurare Peering. VPC Per ulteriori informazioni, consulta la sezione peering. VPC
Nota
L'invio di traffico tra più regioni può comportare costi aggiuntivi.
Questi passaggi presuppongono che l'istanza SQL DB RDS for Postgre sia stata configurata con l'estensione. pgactive
Per ulteriori informazioni, consulta Inizializzazione della funzionalità di estensione pgactive.
Per configurare la prima istanza RDS di Postgre SQL DB con l'estensione pgactive
L'esempio seguente illustra come viene creato il pgactive
gruppo, insieme ad altri passaggi necessari per creare l'pgactive
estensione sull'istanza RDS per SQL Postgre DB.
Usa
psql
o un altro strumento client per connetterti alla tua prima istanza DB RDS for SQL Postgre.psql --host=
firstinstance.111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=master username
--password --dbname=postgres
Crea un database sull'SQListanza RDS for Postgre usando il seguente comando:
postgres=>
CREATE DATABASEapp
;Passa alla connessione al nuovo database utilizzando il seguente comando:
\c
app
Per verificare se il parametro
shared_preload_libraries
contienepgactive
, esegui il comando seguente:app=>
SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';?column? ---------- t
-
Crea e compila una tabella di esempio utilizzando le seguenti istruzioni: SQL
Create una tabella di esempio utilizzando la seguente SQL istruzione.
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);Compilate la tabella con alcuni dati di esempio utilizzando la seguente SQL istruzione.
app=>
INSERT INTO inventory.products (id, product_name) VALUES (1, 'soap'), (2, 'shampoo'), (3, 'conditioner');Verificate che i dati esistano nella tabella utilizzando la seguente SQL istruzione.
app=>
SELECT count(*) FROM inventory.products;count ------- 3
Crea l'estensione
pgactive
database esistente.app=>
CREATE EXTENSION pgactive;Crea e inizializza il gruppo pgactive usando i seguenti comandi:
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 è il nome che assegni per identificare in modo univoco un nodo nel gruppo
pgactive
.Nota
Per eseguire correttamente questo passaggio su un'istanza database accessibile pubblicamente, è necessario attivare il parametro
rds.custom_dns_resolution
impostandolo su1
.Per verificare se l'istanza database è pronta, usa il seguente comando:
app=>
SELECT pgactive.pgactive_wait_for_node_ready();Se il comando viene eseguito correttamente, verrà visualizzato il seguente output:
pgactive_wait_for_node_ready ------------------------------ (1 row)
Per configurare la seconda RDS SQL istanza di Postgre e unirla al gruppo pgactive
L'esempio seguente illustra come aggiungere un'istanza SQL DB RDS for Postgre al pgactive
gruppo, insieme ad altri passaggi necessari per creare l'pgactive
estensione sull'istanza DB.
Questi passaggi presuppongono che un altro per istanze Postgre SQL DB sia stato configurato con l'estensione. pgactive
Per ulteriori informazioni, consulta Inizializzazione della funzionalità di estensione pgactive.
Utilizza
psql
per connetterti all'istanza per cui vuoi ricevere gli aggiornamenti dal publisher.psql --host=
secondinstance.111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=master username
--password --dbname=postgres
Crea un database sulla seconda istanza di Postgre DB RDS usando il seguente comandoSQL:
postgres=>
CREATE DATABASEapp
;Passa alla connessione al nuovo database utilizzando il seguente comando:
\c
app
Crea l'estensione
pgactive
database esistente.app=>
CREATE EXTENSION pgactive;Unisci il per la SQL seconda istanza DB Postgre al gruppo come segue.
pgactive
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 è il nome che assegni per identificare in modo univoco un nodo nel gruppo
pgactive
.Per verificare se l'istanza database è pronta, usa il seguente comando:
app=>
SELECT pgactive.pgactive_wait_for_node_ready();Se il comando viene eseguito correttamente, verrà visualizzato il seguente output:
pgactive_wait_for_node_ready ------------------------------ (1 row)
Se il primo RDS SQL database di Postgre è relativamente grande, potete vederlo mentre viene
pgactive.pgactive_wait_for_node_ready()
emesso il rapporto sullo stato di avanzamento dell'operazione di ripristino. L'esito si presenta in maniera analoga all'immagine riportata di seguito.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)
Da questo momento in poi,
pgactive
sincronizza i dati tra le due istanze database.Puoi utilizzare il comando seguente per verificare se il database della seconda istanza database contiene i dati:
app=>
SELECT count(*) FROM inventory.products;Se i dati vengono sincronizzati correttamente, verrà visualizzato il seguente output:
count ------- 3
Esegui il seguente comando per inserire nuovi valori:
app=>
INSERT INTO inventory.products (id, product_name) VALUES ('lotion');Connettiti al database della prima istanza database ed esegui la seguente query:
app=>
SELECT count(*) FROM inventory.products;Se la replica active-active è inizializzata, l'output è simile al seguente:
count ------- 4
Scollegamento e rimozione di un'istanza database dal gruppo pgactive
Puoi scollegare e rimuovere un'istanza database dal gruppo pgactive
utilizzando la procedura seguente:
Puoi scollegare la seconda istanza database dalla prima istanza database utilizzando il seguente comando:
app=>
SELECT * FROM pgactive.pgactive_detach_nodes(ARRAY[‘node2-app
']);Rimuovi l'estensione
pgactive
dalla seconda istanza database utilizzando il seguente comando:app=>
SELECT * FROM pgactive.pgactive_remove();Per rimuovere forzatamente l'estensione:
app=>
SELECT * FROM pgactive.pgactive_remove(true);Elimina l'estensione usando il seguente comando:
app=>
DROP EXTENSION pgactive;
Gestione dei conflitti nella replica active-active
L'estensione pgactive
funziona per database e non per cluster. Ogni istanza database che utilizza pgactive
è un'istanza indipendente e può accettare modifiche ai dati da qualsiasi origine. Quando una modifica viene inviata a un'istanza DB, Postgre la esegue localmente e quindi la utilizza pgactive
per replicare SQL la modifica in modo asincrono su altre istanze DB. Quando due istanze SQL DB Postgre aggiornano lo stesso record quasi contemporaneamente, può verificarsi un conflitto.
L'estensione pgactive
fornisce meccanismi per il rilevamento dei conflitti e la risoluzione automatica. Tiene traccia del timestamp in cui è stata effettuata la transazione su entrambe le istanze database e applica automaticamente la modifica con il timestamp più recente. L'estensione pgactive
registra anche quando si verifica un conflitto nella tabella pgactive.pgactive_conflict_history
.
pgactive.pgactive_conflict_history
Continueranno a crescere. Potresti voler definire una politica di eliminazione. Questo può essere fatto cancellando alcuni record regolarmente o definendo uno schema di partizionamento per questa relazione (e successivamente staccando, eliminando e troncando le partizioni di interesse). Per implementare regolarmente la politica di eliminazione, un'opzione è utilizzare l'estensione. pg_cron
Vedi le seguenti informazioni su un esempio della tabella di pg_cron
cronologia, Pianificazione della manutenzione con l'estensione SQL Postgre pg_cron.
Gestione delle sequenze nella replica active-active
E RDS per Postgre SQL DB, un'istanza con pgactive
estensione utilizza due diversi meccanismi di sequenza per generare valori univoci.
Sequenze globali
Per utilizzare una sequenza globale, crea una sequenza locale con l'istruzione CREATE SEQUENCE
. Utilizza pgactive.pgactive_snowflake_id_nextval(seqname)
invece di usingnextval(seqname)
per ottenere il valore univoco successivo della sequenza.
L'esempio seguente crea una sequenza globale:
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');
Sequenze partizionate
Nelle sequenze suddivise o partizionate, viene utilizzata una normale sequenza Postgre su ciascun nodo. SQL Ogni sequenza incrementa della stessa quantità e inizia con offset diversi. Ad esempio, con il passaggio 100, il nodo 1 genera una sequenza come 101, 201, 301 e così via e il nodo 2 genera una sequenza come 102, 202, 302 e così via. Questo schema funziona bene anche se i nodi non possono comunicare per periodi prolungati, ma richiede che il progettista specifichi un numero massimo di nodi al momento di stabilire lo schema e richiede una configurazione per nodo. Gli errori possono facilmente portare alla sovrapposizione di sequenze.
È relativamente semplice configurare questo approccio con pgactive
creando la sequenza desiderata su un nodo nel modo seguente:
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');
Quindi richiama setval
su ogni nodo per assegnare un valore iniziale di offset diverso nel modo seguente.
postgres=>
-- On node 1 SELECT setval('some_seq', 1); -- On node 2 SELECT setval('some_seq', 2);
Riferimento ai parametri dell'estensione pgactive
È possibile utilizzare la seguente query per visualizzare tutti i parametri associati all'estensione pgactive
.
postgres=>
SELECT * FROM pg_settings WHERE name LIKE 'pgactive.%';
Misurazione del ritardo di replica tra i membri pgattivi
È possibile utilizzare la seguente query per visualizzare il ritardo di replica tra i membri. pgactive
Esegui questa query su ogni pgactive
nodo per ottenere il quadro completo.
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
Limitazioni per l'estensione pgactive
Tutte le tabelle richiedono una chiave primaria, altrimenti le opzioni di aggiornamento ed eliminazione non sono consentite. I valori nella colonna Chiave primaria non devono essere aggiornati.
Le sequenze possono presentare delle lacune e talvolta potrebbero non seguire un ordine. Le sequenze non vengono replicate. Per ulteriori informazioni, consulta Gestione delle sequenze nella replica active-active.
DDLe gli oggetti di grandi dimensioni non vengono replicati.
Gli indici univoci secondari possono causare divergenze tra i dati.
Le regole di confronto devono essere identiche su tutti i nodi del gruppo.
Il bilanciamento del carico tra i nodi è un anti-pattern.
Le transazioni di grandi dimensioni possono causare ritardi nella replica.