Esecuzione della replica logica per Amazon RDS for PostgreSQL - 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à.

Esecuzione della replica logica per Amazon RDS for PostgreSQL

A partire dalla versione 10.4, RDS per PostgreSQL supporta la pubblicazione e la sottoscrizione della sintassi SQL introdotta in PostgreSQL 10. Per ulteriori informazioni, consulta Replica logica nella documentazione di PostgreSQL.

Nota

Oltre alla funzionalità di replica logica nativa di PostgreSQL introdotta in PostgreSQL 10, RDS per PostgreSQL supporta anche l'estensione pglogical. Per ulteriori informazioni, consulta Utilizzo di pglogical per sincronizzare i dati tra le istanze.

Di seguito sono riportate informazioni sull'impostazione della replica logica per un'istanza database RDS for PostgreSQL.

Comprendere la replica logica e la decodifica logica

RDS for PostgreSQL supporta lo streaming delle modifiche write-ahead log (WAL) utilizzando slot di replica logica di PostgreSQL. Supporta inoltre l'utilizzo della decodifica logica. Puoi configurare gli slot di replica logica nell'istanza ed effettuare lo streaming delle modifiche del database tramite questi slot in un client come pg_recvlogical. Gli slot di replica logica sono creati a livello di database e supportano le connessioni di replica a un singolo database.

I client più comuni per la replica logica di PostgreSQL AWS Database Migration Service sono o un host gestito in modo personalizzato su un'istanza Amazon. EC2 Lo slot di replica logica non contiene informazioni sul ricevitore del flusso. Inoltre, non è necessario che il target sia un database di replica. Se configuri uno slot di replica logica e non leggi lo slot, i dati possono venire scritti e riempire rapidamente lo storage dell'istanza database.

La replica logica e la decodifica logica PostgreSQL in Amazon RDS vengono attivate con un parametro, un tipo di connessione di replica e un ruolo di sicurezza. Il client per la decodifica logica può essere qualsiasi client in grado di stabilire una connessione di replica a un database in un'istanza database PostgreSQL.

Per attivare la decodifica logica per un'istanza database RDS for PostgreSQL
  1. Assicurati che l'account utente che stai utilizzando abbia i seguenti ruoli:

    • Il ruolo rds_superuser in modo da poter attivare la replica logica

    • Il ruolo rds_replication per concedere le autorizzazioni per gestire gli slot logici e per eseguire lo streaming dei dati utilizzando gli slot logici

  2. Impostare il parametro statico rds.logical_replication su 1. Come parte dell'applicazione di questo parametro, imposta anche i parametri wal_level, max_wal_senders, max_replication_slots e max_connections. Le modifiche di questi parametri possono aumentare la generazione dei WAL, quindi imposta il parametro rds.logical_replication solo quando si utilizzano gli slot logici.

  3. Affinché il parametro statico rds.logical_replication abbia effetto, riavviare l'istanza database.

  4. Creare uno slot di replica logica come spiegato nella sezione successiva. Questo processo richiede che venga specificato un plug-in di decodifica. Attualmente RDS for PostgreSQL supporta i plugin di output test_decoding e wal2json forniti con PostgreSQL.

Per ulteriori informazioni sulla decodifica logica di PostgreSQL, consulta la documentazione di PostgreSQL.

Lavorare con gli slot di replica logica

Puoi utilizzare i comandi SQL per lavorare con gli slot logici. Ad esempio, il seguente comando crea uno slot logico denominato test_slot che utilizza il plugin di output PostgreSQL predefinito test_decoding test_decoding.

SELECT * FROM pg_create_logical_replication_slot('test_slot', 'test_decoding'); slot_name | xlog_position -----------------+--------------- regression_slot | 0/16B1970 (1 row)

Per elencare gli slot logici, utilizza il seguente comando:

SELECT * FROM pg_replication_slots;

Per eliminare uno slot logico, utilizza il seguente comando:

SELECT pg_drop_replication_slot('test_slot'); pg_drop_replication_slot ----------------------- (1 row)

Per ulteriori esempi su come lavorare con gli slot di replica logica, consulta gli esempi di decodifica logica nella documentazione PostgreSQL.

Una volta creato lo slot di replica logica, puoi iniziare lo streaming. Nell'esempio seguente viene illustrato il modo in cui la decodifica logica viene controllata tramite il protocollo di replica in streaming. Questo esempio utilizza il programma pg_recvlogical, incluso nella distribuzione PostgreSQL. Questa operazione richiede che l'autenticazione del client sia configurata per permettere le connessioni alla replica.

pg_recvlogical -d postgres --slot test_slot -U postgres --host -instance-name.111122223333.aws-region.rds.amazonaws.com -f - --start

Per visualizzare il contenuto della vista pg_replication_origin_status, eseguire una query sulla funzione pg_show_replication_origin_status.

SELECT * FROM pg_show_replication_origin_status(); local_id | external_id | remote_lsn | local_lsn ----------+-------------+------------+----------- (0 rows)

Replica dei dati a livello di tabella mediante la replica logica

È possibile utilizzare la replica logica per replicare i dati dalle tabelle di origine alle tabelle di destinazione in RDS per PostgreSQL. La replica logica esegue prima un caricamento iniziale dei dati esistenti dalle tabelle di origine e poi continua a replicare le modifiche in corso.

  1. Crea le tabelle di origine

    Connettiti al database di origine nella tua istanza DB RDS per PostgreSQL:

    source=> CREATE TABLE testtab (slno int primary key); CREATE TABLE
  2. Inserisci i dati nelle tabelle di origine
    source=> INSERT INTO testtab VALUES (generate_series(1,1000)); INSERT 0 1000
  3. Crea una pubblicazione per le tabelle di origine
    • Crea una pubblicazione per le tabelle di origine:

      source=> CREATE PUBLICATION testpub FOR TABLE testtab; CREATE PUBLICATION
    • Utilizzate una query SELECT per verificare i dettagli della pubblicazione che è stata creata:

      source=> SELECT * FROM pg_publication; oid | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate | pubviaroot --------+---------+----------+--------------+-----------+-----------+-----------+-------------+------------ 115069 | testpub | 16395 | f | t | t | t | t | f (1 row)
    • Verificate che le tabelle di origine vengano aggiunte alla pubblicazione:

      source=> SELECT * FROM pg_publication_tables; pubname | schemaname | tablename ---------+------------+----------- testpub | public | testtab (1 rows)
    • Per replicare tutte le tabelle di un database, utilizzate:

      CREATE PUBLICATION testpub FOR ALL TABLES;
    • Se la pubblicazione è già stata creata per una singola tabella ed è necessario aggiungere una nuova tabella, è possibile eseguire la query seguente per aggiungere nuove tabelle alla pubblicazione esistente:

      ALTER PUBLICATION <publication_name> add table <new_table_name>;
  4. Connect al database di destinazione e creazione di tabelle di destinazione
    • Connect al database di destinazione nell'istanza DB di destinazione. Crea le tabelle di destinazione con gli stessi nomi delle tabelle di origine:

      target=> CREATE TABLE testtab (slno int primary key); CREATE TABLE
    • Assicurati che non ci siano dati presenti nelle tabelle di destinazione eseguendo una query SELECT sulle tabelle di destinazione:

      target=> SELECT count(*) FROM testtab; count ------- 0 (1 row)
  5. Crea e verifica la sottoscrizione nel database di destinazione
    • Crea l'abbonamento nel database di destinazione:

      target=> CREATE SUBSCRIPTION testsub CONNECTION 'host=<source RDS/host endpoint> port=5432 dbname=<source_db_name> user=<user> password=<password>' PUBLICATION testpub; NOTICE: Created replication slot "testsub" on publisher CREATE SUBSCRIPTION
    • Utilizza una query SELECT per verificare che l'abbonamento sia abilitato:

      target=> SELECT oid, subname, subenabled, subslotname, subpublications FROM pg_subscription; oid | subname | subenabled | subslotname | subpublications -------+---------+------------+-------------+----------------- 16434 | testsub | t | testsub | {testpub} (1 row)
    • Quando la sottoscrizione viene creata, carica tutti i dati dalle tabelle di origine alle tabelle di destinazione. Esegui una query SELECT sulle tabelle di destinazione per verificare che i dati iniziali vengano caricati:

      target=> SELECT count(*) FROM testtab; count ------- 1000 (1 row)
  6. Verifica lo slot di replica nel database di origine

    La creazione di una sottoscrizione nel database di destinazione crea uno slot di replica nel database di origine. Verifica i dettagli dello slot di replica eseguendo la seguente query SELECT sul database di origine:

    source=> SELECT * FROM pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size ----------+----------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+--------------- testsub | pgoutput | logical | 115048 | source | f | t | 846 | | 6945 | 58/B4000568 | 58/B40005A0 | reserved | (1 row)
  7. Test della replica
    • Verifica se le modifiche ai dati nelle tabelle di origine vengono replicate nelle tabelle di destinazione inserendo righe nelle tabelle di origine:

      source=> INSERT INTO testtab VALUES(generate_series(1001,2000)); INSERT 0 1000 source=> SELECT count(*) FROM testtab; count ------- 2000 (1 row)
    • Verifica il numero di righe nelle tabelle di destinazione per confermare che i nuovi inserti vengano replicati:

      target=> SELECT count(*) FROM testtab; count ------- 2000 (1 row)
  8. Aggiornamento dell'abbonamento dopo l'aggiunta di tabelle
    • Quando aggiungi nuove tabelle a una pubblicazione esistente, è obbligatorio aggiornare la sottoscrizione affinché le modifiche abbiano effetto:

      ALTER SUBSCRIPTION <subscription_name> REFRESH PUBLICATION;
    • Questo comando recupera le informazioni mancanti sulle tabelle dall'editore e avvia la replica delle tabelle che sono state aggiunte alle pubblicazioni sottoscritte dopo la creazione o l'ultimo aggiornamento della sottoscrizione.