pglogical
.
Antes de começar
Depois que a replicação pglogical
for configurada e houver uma solução viável de alta disponibilidade (HA) e recuperação de desastres (DR), e reconhecendo que a replicação lógica não oferece true
e replicação abrangente de todos os objetos de banco de dados, teste essa configuração antes de começar a usá-la.
Para mais informações sobre a extensão pglogical
, consulte Sobre o pglogical
.
Para informações sobre replicação de dados usando pglogical
, consulte
Replicar dados entre o AlloyDB para PostgreSQL e o AlloyDB Omni e Replicar dados entre o AlloyDB Omni e outros bancos de dados.
Failover com replicação pglogical
A alternância é um processo controlado usado para trocar as funções entre os bancos de dados do provedor e do assinante. Quando você faz uma alternância, as funções dos dois bancos de dados, provedor e assinante, são invertidas. O provedor se torna o assinante, e o assinante se torna o provedor.
Essa capacidade de failover é importante para upgrades do sistema operacional, do PostgreSQL ou testes de failover.
Para fazer isso em configurações de replicação unidirecional, configure uma nova relação provedor/assinante e remova a antiga.
Criar a nova configuração de provedor/assinante
Impeça que o aplicativo grave no sistema do provedor para evitar mais mudanças no banco de dados e verifique o atraso na replicação para garantir que todas as transações sejam reproduzidas no nó do assinante:
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 todos os campos de atraso mostrarem zero, a replicação estará atualizada e o banco de dados pronto para uma alternância.
O resultado será assim:
-[ 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.203433
Converter o banco de dados de assinantes em um banco de dados de provedores:
- Interrompa a assinatura do assinante atual.
- Adicione o conjunto de réplicas, se necessário.
- Adicione as tabelas necessárias ao conjunto de replicação.
- Crie uma nova assinatura de assinante no novo banco de dados de assinantes.
- Redirecione os aplicativos para o novo provedor.
Interrompa a assinatura no banco de dados de assinantes atual, que se torna o novo provedor:
SELECT pglogical.alter_subscription_disable(SUBSCRIPTION_NAME);
(Opcional) Crie um conjunto de replicação que corresponda à definição do banco de dados do provedor original. Isso não é necessário se você estiver usando os conjuntos de replicação padrão:
SELECT pglogical.create_replication_set(REPLICATION_SET_NAME);
Adicione tabelas a esse conjunto de replicação:
SELECT pglogical.replication_set_add_table(REPLICATION_SET_NAME, TABLE_NAME);
Substitua:
- REPLICATION_SET_NAME: o nome do conjunto de réplicas.
- TABLE_NAME: o nome da tabela de um proprietário do esquema. Por exemplo,
ARRAY['public']
.`
No novo banco de dados de assinantes, que antes era o banco de dados do provedor, crie a nova assinatura com a opção
synchronize_data
definida comofalse
para evitar o carregamento inicial da tabela: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>');
Verifique se a assinatura está funcionando no nó do provedor:
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 a replicação estiver funcionando, mude as strings de conexão do aplicativo para usar o novo banco de dados do provedor e reinicie as camadas do aplicativo.
Se você mudar os dados no nó do provedor antigo depois que o assinante for interrompido, essas mudanças não serão replicadas, o que resultará em perda de dados. Se houver mudanças não replicadas nos dados do banco de dados do provedor original ou se o provedor original, que é o novo assinante, não estiver em um estado consistente com o novo banco de dados do provedor, que é o assinante antigo, será necessário criar o novo banco de dados do assinante do zero.
Remover o provedor e a assinatura antigos
Se você quiser a replicação unidirecional, remova a configuração antiga de provedor/assinante.
Remova a assinatura antiga no novo provedor:
SELECT pglogical.drop_subscription('<subscription name>')
Remova o conjunto de replicação no novo assinante ou remova todas as tabelas do conjunto de replicação:
SELECT pglogical.drop_replication_set('<replication set name>')
SELECT pglogical.replication_set_remove_table('<replication set name>','<table name>')
Replicação bidirecional
Para fazer a troca sem inatividade ou garantir que nenhum dado seja perdido devido a mudanças não planejadas, use a replicação bidirecional. Ao implementar a replicação bidirecional, considere a resolução de conflitos, a menos que haja controles rigorosos para impedir o acesso de gravação aos dois nós ao mesmo tempo.
É possível configurar a resolução de conflitos usando as seguintes configurações de pglogical.conflict_resolution
:
error
: o assinante para quando um conflito é detectado.apply_remote
: sempre aplique as mudanças recebidas, independente dos dados no banco de dados do assinante. Esta é a configuração padrão.keep_local
: sempre ignore os dados conflitantes recebidos e descarte a mudança conflitante.last_update_wins
: a versão dos dados com o carimbo de data/hora do commit mais recente é a que é confirmadafirst_update_wins
: a versão dos dados com o carimbo de data/hora mais antigo é a que é confirmada.
Para configurar a replicação bidirecional, configure o provedor e o assinante para que a replicação aconteça nos dois sentidos. O assinante original também se torna um provedor com o mesmo conjunto de replicação do provedor original. Consulte Criar uma tabela e adicioná-la ao conjunto de replicação padrão no banco de dados do provedor do AlloyDB para PostgreSQL para criar um conjunto de replicação que duplica o conjunto original no banco de dados do provedor inicial.
No provedor original, adicione um novo assinante. Consulte
Criar um nó e uma assinatura no banco de dados assinante do AlloyDB Omni
para criar um novo assinante e garantir que o parâmetro synchronize_data
do
comando pglogical.create_subscription
esteja definido como false
. Isso evita a cópia inicial da tabela de dados.
Failover com replicação pglogical
O failover ocorre quando o banco de dados do provedor fica indisponível por qualquer motivo, e você precisa mudar o aplicativo para usar o banco de dados do assinante.
Para evitar que dados duplicados sejam aplicados por engano ao banco de dados de assinantes de failover, desative a assinatura. Isso garante que as mudanças de um provedor restaurado não sejam aplicadas por engano quando o provedor ficar disponível novamente.
Parar o subscriber,
test_sub_1
:SELECT pglogical.alter_subscription_disable(`test_sub_1`);
Verifique se o status está definido como
disabled
:SELECT pglogical.show_subscription_status('test_sub_1');
O resultado será assim:
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})
Confira a palavra-chave desativada na saída de status.
Crie uma nova configuração de provedor/assinante para manter a alta disponibilidade e a capacidade de recuperação de desastres.
Crie um novo conjunto de replicação com todas as tabelas que foram replicadas originalmente para que um novo assinante seja criado quando o banco de dados do provedor antigo for recuperado e convertido em um novo assinante ou um novo assinante seja criado.
Configure esse banco de dados como o novo assinante se for possível recuperar o banco de dados do provedor antigo até o momento da falha. Use as mesmas etapas para criar uma assinatura e defina o parâmetro
synchronize_data
do comandopglogical.create_subscription
comofalse
para evitar a cópia inicial da tabela.Remova a configuração antiga do provedor no nó recuperado para evitar o acúmulo de arquivos WAL.
Se você estiver usando o banco de dados do provedor antigo, descarte o conjunto de replicação completo ou remova todas as tabelas do conjunto de replicação uma por uma:
SELECT pglogical.drop_replication_set('<replication set name>')
SELECT pglogical.replication_set_remove_table('<replication set name>','<table name>')
Mude o aplicativo para gravar no novo nó.
A seguir
- Replicar dados entre o AlloyDB para PostgreSQL e o AlloyDB Omni
- Replicar dados entre o AlloyDB Omni e outros bancos de dados