Utilizzo di pgactive per supportare la replica active-active - Amazon Relational Database Service

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'pgactiveestensione 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'pgactiveestensione 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
  1. Accedi a AWS Management Console e apri la RDS console Amazon all'indirizzo https://console.aws.amazon.com/rds/.

  2. Nel pannello di navigazione, scegli la tua istanza SQL DB RDS per Postgree.

  3. 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.

  4. Scegli il link per aprire i parametri personalizzati associati alla tua istanza RDS per SQL Postgre DB.

  5. Trova il parametro rds.enable_pgactive e impostalo su 1 per inizializzare la funzionalità pgactive.

  6. Scegli Save changes (Salva modifiche).

  7. Nel pannello di navigazione della RDS console Amazon, scegli Databases.

  8. Seleziona la tua istanza SQL DB RDS per Postgre, quindi scegli Reboot dal menu Azioni.

  9. Conferma il riavvio dell'istanza database per applicare le modifiche.

  10. Quando l'istanza DB è disponibile, puoi utilizzare psql qualsiasi altro SQL client Postgre per connetterti all'istanza DB per Postgre. RDS SQL

    L'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
  11. 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 in shared_preload_libraries, il comando precedente restituirà quanto segue:

    ?column? ---------- t
  12. Crea l'estensione, come indicato di seguito.

    postgres=> CREATE EXTENSION pgactive;
Inizializzazione della funzionalità di estensione pgactive

Per inizializzare l'pgactiveutilizzo di AWS CLI, chiamate l'modify-db-parameter-groupoperazione per modificare determinati parametri nel gruppo di parametri personalizzato, come illustrato nella procedura seguente.

  1. Utilizzate il AWS CLI comando seguente per impostare o rds.enable_pgactive 1 inizializzare la pgactive funzionalità per l'istanza database RDS for SQL Postgre.

    postgres=>aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=rds.enable_pgactive,ParameterValue=1,ApplyMethod=pending-reboot" \ --region aws-region
  2. 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 \ --region aws-region
  3. 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
  4. 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'pgactiveestensione sull'istanza RDS per SQL Postgre DB.

  1. 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
  2. Crea un database sull'SQListanza RDS for Postgre usando il seguente comando:

    postgres=> CREATE DATABASE app;
  3. Passa alla connessione al nuovo database utilizzando il seguente comando:

    \c app
  4. Per verificare se il parametro shared_preload_libraries contiene pgactive, esegui il comando seguente:

    app=>SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';
    ?column? ---------- t
  5. Crea e compila una tabella di esempio utilizzando le seguenti istruzioni: SQL

    1. 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);
    2. 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');
    3. Verificate che i dati esistano nella tabella utilizzando la seguente SQL istruzione.

      app=>SELECT count(*) FROM inventory.products; count ------- 3
  6. Crea l'estensione pgactive database esistente.

    app=> CREATE EXTENSION pgactive;
  7. 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 su 1.

  8. 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'pgactiveestensione 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.

  1. 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
  2. Crea un database sulla seconda istanza di Postgre DB RDS usando il seguente comandoSQL:

    postgres=> CREATE DATABASE app;
  3. Passa alla connessione al nuovo database utilizzando il seguente comando:

    \c app
  4. Crea l'estensione pgactive database esistente.

    app=> CREATE EXTENSION pgactive;
  5. 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.

  6. 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.

  7. 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
  8. Esegui il seguente comando per inserire nuovi valori:

    app=> INSERT INTO inventory.products (id, product_name) VALUES ('lotion');
  9. 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:

  1. Puoi scollegare la seconda istanza database dalla prima istanza database utilizzando il seguente comando:

    app=> SELECT * FROM pgactive.pgactive_detach_nodes(ARRAY[‘node2-app']);
  2. 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);
  3. 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_historyContinueranno 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.