Replicare i dati tra AlloyDB Omni e altri database

Seleziona una versione della documentazione:

Questa pagina fornisce i passaggi per replicare i dati tra AlloyDB Omni e altri database utilizzando l'estensione pglogical.

Per ulteriori informazioni, vedi Informazioni sull'estensione pglogical e Terminologia e componenti fondamentali di pglogical.

Metodi di autenticazione supportati

I due principali metodi di autenticazione utilizzati con l'estensione pglogical sono l'autenticazione con password e l'autenticazione basata sulla fiducia.

Il metodo di autenticazione consigliato è il metodo di autenticazione basato sulla fiducia. Per saperne di più, consulta la pagina Metodi di autenticazione supportati.

Prima di iniziare

Puoi installare pglogical come estensione all'interno di un determinato database.

Prima di implementare l'estensione pglogical su AlloyDB Omni, assicurati di soddisfare i seguenti requisiti di sistema:

  • Accesso al cluster PostgreSQL non AlloyDB come superuser.
  • L'estensione pglogical è installata nel tuo cluster PostgreSQL non AlloyDB. Per istruzioni di installazione specifiche per il rilascio e la distribuzione, consulta pglogical.
  • Un server AlloyDB Omni installato e configurato. Per istruzioni su come installare AlloyDB Omni, consulta Installa AlloyDB Omni.
  • Gli indirizzi IP sia per il cluster PostgreSQL non AlloyDB sia per il server host AlloyDB Omni.
  • Una rete stabilita e protetta tra il cluster PostgreSQL non AlloyDB e il server host AlloyDB Omni. È richiesta la connettività TCP sulla porta PostgreSQL standard 5432.

Modifica i parametri sul provider non AlloyDB

  1. Imposta il parametro wal_level su logical e aggiungi pglogical al parametro shared_preload_libraries nel file postgresql.conf. L'estensione pglogical richiede un insieme minimo di aggiustamenti dei parametri sul cluster del provider non AlloyDB.

    cp postgresql.conf postgresql.bak
    sed -r -i "s|(\#)?wal_level\s*=.*|wal_level=logical|" postgresql.conf
    sed -r -i "s|(\#)?(shared_preload_libraries\s*=\s*)'(.*)'.*$|\2'\3,pglogical'|" postgresql.conf
    sed -r -i "s|',|'|" postgresql.conf
  2. Verifica che i parametri siano impostati correttamente:

    grep -iE 'wal_level|shared_preload_libraries' postgresql.conf
  3. Riavvia il cluster non AlloyDB per applicare le modifiche ai parametri.

    Altri parametri potrebbero essere già impostati su valori sufficienti o potrebbero richiedere una modifica a seconda della distribuzione e della versione non AlloyDB.

    Controlla i seguenti parametri:

    • max_worker_processes: uno per ogni database del fornitore e almeno uno per ogni nodo abbonato. Il valore standard per questo parametro è almeno 10.
    • max_replication_slots: uno per nodo sui nodi provider.
    • max_wal_senders: uno per nodo sui nodi provider.
    • track_commit_timestamp: impostato su on se è necessaria la risoluzione dei conflitti in base all'ultimo o al primo aggiornamento.
    • listen_addresses: deve includere l'indirizzo IP di AlloyDB Omni o menzionarlo tramite un blocco CIDR di copertura.
  4. (Facoltativo) Se il tuo provider non AlloyDB è Amazon RDS o Aurora, l'estensione pglogical deve essere abilitata e i parametri richiesti devono essere modificati tramite gli aggiustamenti di cluster parameter group.

    1. All'interno di un gruppo di parametri del cluster esistente o nuovo, imposta i seguenti parametri:

      • Da rds.logical_replication a 1
      • Da max_replication_slots a 50
      • Da max_wal_senders a 50
      • Da max_worker_processes a 64
      • Da shared_preload_libraries a pg_stat_statements, pglogical
    2. Riavvia il cluster Amazon RDS o Aurora per applicare le modifiche al gruppo di parametri del cluster.

  5. Verifica che tutti i valori dei parametri siano pertinenti:

    SELECT name, setting
    FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
     ORDER BY name;
    

Modifiche all'autenticazione basata sull'host al cluster del provider non AlloyDB Omni

pglogical stabilisce connessioni TCP locali al database del fornitore. Pertanto, devi aggiungere l'indirizzo IP del server host al file DATA_DIR/pg_hba.conf di AlloyDB Omni, dove DATA_DIR è il percorso del file system alla directory dei dati, ad esempio /home/$USER/alloydb-data.

  1. Aggiungi una voce di autenticazione attendibile per il server locale, specifica per un nuovo utente pglogical_replication, al file DATA_DIR/pg_hba.conf.

    Inoltre, i nodi abbonati devono essere in grado di autenticarsi rispetto ai nodi del provider. Aggiungi l'indirizzo IP di ogni nodo abbonato o l'intervallo IP blocco CIDR appropriato al file DATA_DIR/pg_hba.conf:

    echo -e "# pglogical entries:
    host all pglogical_replication samehost trust
    host all pglogical_replication SERVER_IP_ADDRESS/32 trust
    " | column -t | sudo tee -a DATA_DIR/pg_hba.conf

    Sostituisci SERVER_IP_ADDRESS con l'indirizzo IP dell'istanza principale di AlloyDB Omni da cui eseguire la replica.

  2. Verifica che le voci siano corrette:

    tail -3 DATA_DIR/pg_hba.conf
  3. Riavvia il cluster non AlloyDB per applicare le modifiche ai parametri.

Modifica i parametri del cluster di sottoscrizione AlloyDB Omni

pglogical richiede anche un insieme minimo di aggiustamenti dei parametri sul cluster di sottoscrizione AlloyDB Omni. Devi aggiungere pglogical al parametro shared_preload_libraries nel file DATA_DIR/postgresql.conf. Se un database all'interno del cluster funge da database del fornitore, apporta le modifiche ai parametri necessarie per i database del fornitore.

  1. Regola i parametri:

    sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
  2. Verifica che il parametro sia impostato correttamente:

    grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
  3. Riavvia AlloyDB Omni affinché la modifica del parametro diventi effettiva:

    Docker

     docker container restart CONTAINER_NAME

    Sostituisci CONTAINER_NAME con il nome assegnato al container AlloyDB Omni quando l'hai avviato.

    Podman

     podman container restart CONTAINER_NAME

    Sostituisci CONTAINER_NAME con il nome assegnato al container AlloyDB Omni quando l'hai avviato.

  4. Imposta i valori predefiniti di AlloyDB Omni per gli altri parametri del database del provider:

    • max_worker_processes: uno per ogni database del fornitore e uno per ogni nodo abbonato.
    • track_commit_timestamp: impostato su on se è necessaria la risoluzione dei conflitti in base all'ultimo/primo aggiornamento.
  5. Verifica che tutti i valori dei parametri siano pertinenti:

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -c "
    SELECT name, setting
      FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
         ORDER BY name;
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -c "
    SELECT name, setting
      FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
         ORDER BY name;
    "

Modifiche all'autenticazione basata sull'host al cluster di sottoscrizione AlloyDB Omni

pglogical stabilisce connessioni TCP locali al database subscriber AlloyDB Omni. Pertanto, devi aggiungere l'indirizzo IP del server host dell'abbonato al file DATA_DIR/pg_hba.conf di AlloyDB Omni.

  1. Aggiungi una voce di autenticazione trust per il server locale, specifica per un nuovo utente pglogical_replication, al file DATA_DIR/pg_hba.conf:

    echo -e "# pglogical entries:
    host all pglogical_replication samehost trust
    " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
  2. Verifica che la voce sia corretta:

    tail -2 DATA_DIR/pg_hba.conf
  3. Riavvia AlloyDB Omni affinché la modifica dell'autenticazione diventi effettiva:

    docker container restart CONTAINER_NAME

Crea un utente pglogical sia nel cluster provider che in quello abbonato

Devi creare un nuovo utente sia nel cluster del fornitore sia in quello del sottoscrittore. pglogical richiede che l'utente disponga degli attributi superuser e replication.

  1. Nel cluster del provider AlloyDB, crea il ruolo utente: Google Cloud

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    ALTER USER pglogical_replication WITH superuser;
    
  2. (Facoltativo) Se il tuo fornitore non AlloyDB è Amazon RDS o Aurora, devi concedere il seguente ruolo:

    GRANT rds_superuser TO replication_user;
    

Aggiungi pglogical e nodi al database del fornitore non AlloyDB

  1. Concedi i privilegi richiesti.

    Devi installare l'estensione pglogical in ogni database e concedere l'autorizzazione usage all'utente del database pglogical.

    Ad esempio, se il tuo database è my_test_db, esegui il seguente comando:

    CREATE EXTENSION IF NOT EXISTS pglogical;
    GRANT usage ON SCHEMA pglogical TO pglogical_replication;
    
  2. Crea un nodo pglogical per i database del provider. node_name è arbitrario e la stringa dsn deve essere una connessione TCP valida allo stesso database.

    Ad esempio, per il database my_test_db, esegui questo comando:

    SELECT pglogical.create_node(node_name := 'provider', dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    

Crea una tabella e aggiungila al set di repliche predefinito

Crea una tabella e aggiungila al set di replica predefinito nel database del provider non AlloyDB.

  1. Crea una tabella di test denominata test_table_1 nel database del provider:

    CREATE TABLE test_table_1 (col1 INT PRIMARY KEY);
    INSERT INTO test_table_1 VALUES (1),(2),(3);
    
  2. Aggiungi manualmente la tabella di test al set di replica predefinito. Puoi creare set di repliche pglogical personalizzati oppure utilizzare i set di repliche predefiniti. Quando hai creato l'estensione, sono stati creati diversi set di replica predefiniti, ad esempio default, default_insert_only e ddl_sql. Puoi aggiungere tabelle e sequenze ai set di replica singolarmente o tutte contemporaneamente per uno schema specificato.

    -- Add the specified table to the default replication set:
    SELECT pglogical.replication_set_add_table(set_name := 'default', relation := 'test_table_1', synchronize_data := TRUE);
    
    -- Check which tables have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_table;
    
  3. (Facoltativo) Aggiungi tutte le tabelle di uno schema specificato, ad esempio public:

    -- Add all "public" schema tables to the default replication set:
    SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
    
    -- Check which tables have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_table;
    
    -- Add all "public" schema sequences to the default replication:
    SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public']);
    
    -- Check which sequences have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_seq;
    
  4. Rimuovi la tabella dal set di repliche default. Se nello schema sono presenti tabelle che non hanno una chiave primaria o un'identità di replica, è possibile replicare solo le istruzioni INSERT. Se hai aggiunto queste tabelle al set di replica default automaticamente tramite la funzione replication_set_add_all_tables, devi rimuoverle manualmente da questo set di replica e aggiungerle al set default_insert_only.

    -- Remove the table from the **default** replication set:
    SELECT pglogical.replication_set_remove_table(set_name := 'default', relation := 'test_table_2');
    
    -- Manually add to the **default_insert_only** replication set:
    SELECT pglogical.replication_set_add_table(set_name := 'default_insert_only', relation := 'test_table_2');
    

    (Facoltativo) Se vuoi aggiungere automaticamente le tabelle appena create al set di replica, aggiungi il trigger pglogical_assign_repset come suggerito nell'origine pglogical.

Copia il database nel cluster di sottoscrizione AlloyDB Omni

  1. Crea un backup solo dello schema del database di origine utilizzando l'utilità pg_dump.

  2. Esegui il comando pg_dump dal server di sottoscrizione AlloyDB Omni utilizzando l'indirizzo IP o l'endpoint del server non AlloyDB.

    pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
  3. Importa il backup nel database del sottoscrittore sul server AlloyDB Omni del sottoscrittore:

    Docker

    docker exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql

    Podman

    podman exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql

In questo modo vengono creati il database e lo schema, senza i dati delle righe. I dati delle righe vengono replicati dall'estensione pglogical. Copia o ricrea manualmente gli altri utenti o ruoli necessari.

Crea un nodo e un abbonamento nel database di sottoscrizione AlloyDB Omni

  1. Crea un nodo nel database di sottoscrizione AlloyDB Omni. Aggiungi la password a dsn se scegli di utilizzare l'autenticazione con password.

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');
    "
  2. Crea una sottoscrizione nel database del sottoscrittore, che punta al database del fornitore nel server del fornitore AlloyDB Omni.

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    "
  3. Entro pochi secondi o minuti, i dati iniziali dovrebbero essere replicati dal fornitore al sottoscrittore:

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT * FROM test_table_1 ORDER BY 1;
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT * FROM test_table_1 ORDER BY 1;
    "

    Anche le righe aggiuntive che vengono aggiunte al database dei fornitori vengono replicate in tempo reale in pochi secondi.

Considerazioni aggiuntive sul deployment di pglogical

L'estensione pglogical ha molte funzionalità avanzate che non sono trattate in questo documento. Molte di queste funzionalità sono applicabili alla tua implementazione. Puoi prendere in considerazione le seguenti funzionalità avanzate:

  • Risoluzione dei conflitti
  • Replica multimaster e bidirezionale
  • Inclusione di sequenze
  • Procedure di switchover e failover

Passaggi successivi