pglogical.
Prima di iniziare
Dopo aver configurato la replica pglogical e aver implementato una soluzione di alta
disponibilità (HA) e ripristino di emergenza (RE) praticabile, e tenendo presente che la replica logica
non fornisce una replica true e completa di tutti gli oggetti del
database, devi testare questa configurazione prima di iniziare a utilizzarla.
Per saperne di più sull'estensione pglogical, consulta Informazioni su pglogical.
Per informazioni sulla replica dei dati utilizzando pglogical, consulta
Replicare i dati tra AlloyDB per PostgreSQL e AlloyDB Omni e Replicare i dati tra AlloyDB Omni e altri database.
Eseguire lo switchover con la replica pglogical
Lo switchover è un processo controllato utilizzato per scambiare i ruoli tra i database del provider e del sottoscrittore. Quando esegui uno switchover, i ruoli dei due database, provider e sottoscrittore, vengono invertiti. Il provider diventa il sottoscrittore e il sottoscrittore diventa il provider.
Questa funzionalità di switchover è importante per gli upgrade del sistema operativo, gli upgrade di PostgreSQL o i test di failover.
Per ottenere questo risultato nelle configurazioni di replica unidirezionale, devi configurare una nuova relazione provider/sottoscrittore e rimuovere la vecchia relazione provider/sottoscrittore.
Creare la nuova configurazione provider/sottoscrittore
Impedisci all'applicazione di scrivere nel sistema del provider per evitare ulteriori modifiche al database e controlla il ritardo della replica per assicurarti che tutte le transazioni vengano riprodotte sul nodo del sottoscrittore:
SELECT application_name, state, sync_state, client_addr, client_hostname, pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) AS sent_lag, pg_wal_lsn_diff(sent_lsn,flush_lsn) AS receiving_lag, pg_wal_lsn_diff(flush_lsn,replay_lsn) AS replay_lag, pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn) AS total_lag, now()-reply_time AS reply_delay FROM pg_stat_replication ORDER BY client_hostname;Quando tutti i campi di ritardo mostrano zero, la replica è aggiornata e il database è pronto per uno switchover.
L'output è simile al seguente:
-[ RECORD 1 ]----+------------------------------ application_name | test_sub_1 state | streaming sync_state | async client_addr | 10.45.0.80 client_hostname | sent_lag | 0 receiving_lag | 0 replay_lag | 0 total_lag | 0 reply_delay | 00:00:26.203433Converti il database del sottoscrittore in un database del provider:
- Interrompi l'abbonamento del sottoscrittore esistente.
- Aggiungi il set di replica, se necessario.
- Aggiungi le tabelle necessarie al set di replica.
- Crea un nuovo abbonamento del sottoscrittore nel nuovo database del sottoscrittore.
- Reindirizza le applicazioni al nuovo provider.
Interrompi l'abbonamento nel database del sottoscrittore esistente, che diventa il nuovo provider:
SELECT pglogical.alter_subscription_disable(SUBSCRIPTION_NAME);(Facoltativo) Crea un set di replica che corrisponda alla definizione del database del provider originale. Questa operazione non è necessaria se utilizzi i set di replica predefiniti:
SELECT pglogical.create_replication_set(REPLICATION_SET_NAME);Aggiungi le tabelle al set di replica:
SELECT pglogical.replication_set_add_table(REPLICATION_SET_NAME, TABLE_NAME);Sostituisci quanto segue:
- REPLICATION_SET_NAME: il nome del set di replica.
- TABLE_NAME: il nome della tabella di un proprietario dello schema. Ad esempio,
ARRAY['public'].`
Nel nuovo database del sottoscrittore, che in precedenza era il database del provider, crea il nuovo abbonamento con l'opzione
synchronize_dataimpostata sufalseper impedire il caricamento iniziale della tabella:SELECT pglogical.create_subscription ( subscription_name := '<subscription name>', replication_sets := array['default'], synchronize_data := false, provider_dsn := 'host=<hostname or IP> port=5432 dbname=<db name> user=pglogical_replication password=<password>');Controlla se l'abbonamento funziona sul nodo del provider:
SELECT application_name, state, sync_state, client_addr, client_hostname, pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) AS sent_lag, pg_wal_lsn_diff(sent_lsn,flush_lsn) AS receiving_lag, pg_wal_lsn_diff(flush_lsn,replay_lsn) AS replay_lag, pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn) AS total_lag, now()-reply_time AS reply_delay FROM pg_stat_replication ORDER BY client_hostname;Se la replica funziona, modifica le stringhe di connessione dell'applicazione in modo che utilizzino il nuovo database del provider e riavvia i livelli dell'applicazione.
Se modifichi i dati sul vecchio nodo del provider dopo aver interrotto il sottoscrittore, queste modifiche non vengono replicate e si verifica una perdita di dati. Se nel database del provider originale sono presenti modifiche dei dati non replicate o se il provider originale, che è il nuovo sottoscrittore, non si trova in uno stato coerente con il nuovo database del provider, che è il vecchio sottoscrittore, devi creare completamente il nuovo database del sottoscrittore.
Rimuovere il vecchio provider e l'abbonamento
Se vuoi una replica unidirezionale, devi rimuovere la vecchia configurazione provider/sottoscrittore.
Rimuovi il vecchio abbonamento sul nuovo provider:
SELECT pglogical.drop_subscription('<subscription name>')Rimuovi il set di replica sul nuovo sottoscrittore o rimuovi tutte le tabelle dal set di replica:
SELECT pglogical.drop_replication_set('<replication set name>')SELECT pglogical.replication_set_remove_table('<replication set name>','<table name>')
Replica bidirezionale
Per eseguire lo switchover senza causare tempi di inattività o per assicurarti che non vengano persi dati a causa di modifiche non pianificate, devi utilizzare la replica bidirezionale. Quando implementi la replica bidirezionale, prendi in considerazione la risoluzione dei conflitti, a meno che non siano in vigore controlli rigorosi per impedire l'accesso in scrittura a entrambi i nodi contemporaneamente.
Puoi configurare la risoluzione dei conflitti utilizzando le seguenti impostazioni di pglogical.conflict_resolution:
error: il sottoscrittore si interrompe quando viene rilevato un conflitto.apply_remote: applica sempre le modifiche in entrata indipendentemente dai dati nel database del sottoscrittore. Questa è l'impostazione predefinita.keep_local: ignora sempre i dati in entrata in conflitto e scarta la modifica in conflitto.last_update_wins: la versione dei dati con il timestamp di commit più recente è quella di cui viene eseguito il commitfirst_update_wins: la versione dei dati con il timestamp più vecchio è quella di cui viene eseguito il commit
Per configurare la replica bidirezionale, configura il provider e il sottoscrittore in modo che la replica avvenga in entrambe le direzioni. Anche il sottoscrittore originale diventa un provider con lo stesso set di replica del provider originale. Consulta Creare una tabella e aggiungerla al set di replica predefinito nel database del provider AlloyDB per PostgreSQL per creare un set di replica che duplichi il set di replica originale nel database del provider iniziale.
Nel provider originale devi aggiungere un nuovo sottoscrittore. Consulta
Creare un nodo e un abbonamento nel database del sottoscrittore AlloyDB Omni
per creare un nuovo sottoscrittore assicurandoti che il parametro synchronize_data per
il comando pglogical.create_subscription sia impostato su false. In questo modo si evita la copia iniziale della tabella dei dati.
Eseguire il failover con la replica pglogical
Il failover si verifica quando il database del provider non è disponibile per qualsiasi motivo e devi passare all'applicazione per utilizzare il database del sottoscrittore.
Per evitare che dati duplicati vengano applicati accidentalmente al database del sottoscrittore di cui è stato eseguito il failover, devi disattivare l'abbonamento. In questo modo, le modifiche apportate a un provider ripristinato non vengono applicate per errore quando il provider torna disponibile.
Interrompi il sottoscrittore,
test_sub_1:SELECT pglogical.alter_subscription_disable(`test_sub_1`);Verifica che lo stato sia impostato su
disabled:SELECT pglogical.show_subscription_status('test_sub_1');L'output è simile al seguente:
show_subscription_status ---------------------------------------------------------------------------- (test_sub1,disabled,subscriber,"host=10.45.0.108 port=5432 dbname=my_test_db user=pglogical_replication",subscriber,{failover_set},{all})Controlla la parola chiave disabled nell'output dello stato.
Crea una nuova configurazione provider/sottoscrittore per mantenere la capacità di alta affidabilità e ripristino di emergenza.
Crea un nuovo set di replica contenente tutte le tabelle replicate originariamente in modo che venga creato un nuovo sottoscrittore quando il vecchio database del provider viene recuperato e convertito in un nuovo sottoscrittore o viene creato un nuovo sottoscrittore.
Configura questo database come nuovo sottoscrittore se puoi recuperare il vecchio database del provider al momento dell'errore. Segui gli stessi passaggi per creare un abbonamento e imposta il parametro
synchronize_dataper il comandopglogical.create_subscriptionsufalseper evitare la copia iniziale della tabella.Rimuovi la vecchia configurazione del provider sul nodo recuperato per evitare l'accumulo di file WAL.
Se utilizzi il vecchio database del provider, elimina l'intero set di replica o rimuovi tutte le tabelle dal set di replica una alla volta:
SELECT pglogical.drop_replication_set('<replication set name>')SELECT pglogical.replication_set_remove_table('<replication set name>','<table name>')Passa all'applicazione per scrivere nel nuovo nodo.
Passaggi successivi
- Replicare i dati tra AlloyDB per PostgreSQL e AlloyDB Omni
- Replicare i dati tra AlloyDB Omni e altri database