pglogical
Antes de começar
Antes de começar a monitorizar e resolver problemas de implementações de pglogical
, verifique as bases de dados de fornecedores e subscritores, compreenda a implementação de pglogical
e valide a respetiva configuração.
Para mais informações sobre a extensão pglogical
, consulte o artigo Acerca da extensão pglogical
.
Para informações sobre a replicação de dados com o pglogical
, consulte os artigos
Replique dados entre o AlloyDB para PostgreSQL e o AlloyDB Omni e Replique dados entre o AlloyDB Omni e outras bases de dados.
Verifique as definições de parâmetros do pglogical
, da replicação e do AlloyDB Omni
Vários parâmetros de configuração afetam o funcionamento da extensão pglogical e pode verificá-los nas bases de dados do fornecedor e do subscritor. Tenha em atenção que os valores dos parâmetros podem variar.
Mostrar a definição atual dos parâmetros específicos de
pglogical
:SELECT name, setting, source, short_desc FROM pg_catalog.pg_settings WHERE name LIKE '%pglogical%' AND name NOT LIKE '%alloydb%' ORDER BY category, name;
Mostrar outros parâmetros relacionados com a replicação lógica:
SELECT name, setting, source, short_desc FROM pg_catalog.pg_settings WHERE name IN ('wal_level', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'shared_preload_libraries', 'track_commit_timestamp') ORDER BY name;
Mostrar parâmetros específicos do AlloyDB Omni:
SELECT name, setting, source, short_desc FROM pg_catalog.pg_settings WHERE name LIKE '%alloydb%' ORDER BY category, name;
Liste os nós na configuração
Liste os nós locais e remotos na configuração de replicação pglogical:
SELECT node_id, if_nodeid AS node_id, if_name AS node_name, if_dsn AS dsn FROM pglogical.node_interface LEFT JOIN pglogical.local_node ON (node_id = if_nodeid AND node_local_interface = if_id) ORDER BY node_name;
Se a coluna
node_id
forNOT NULL
, esse é o nó local.Reveja as informações
dsn
detalhadamente. Quaisquer informações de string de ligação incorretas ou desatualizadas podem resultar em falhas de replicação. Para obter informações sobre adsn
resolução de problemas, consulte o artigo Resolva problemas de replicação de subscrições.
Verifique o estado da subscrição e o ponto de replicação da tabela
O estado da subscrição é sempre validado a partir da base de dados de subscritores. A subscrição
mostra o estado initializing
ou replicating
". Também mostra o estado down
.
Para mais informações sobre o estado down
, consulte o artigo Resolva problemas de replicação de subscrições.
Liste as subscrições, o respetivo estado atual e as definições na base de dados atual:
SELECT s.sub_name AS subscription_name, n1.node_name AS origin_name, n2.node_name AS target_name, x.status, sub_slot_name, sub_replication_sets, sub_forward_origins, sub_apply_delay, sub_force_text_transfer, sub_enabled AS enabled FROM pglogical.subscription s, (SELECT subscription_name, status FROM pglogical.show_subscription_status()) AS x, pglogical.node n1, pglogical.node n2 WHERE s.sub_origin = n1.node_id AND s.sub_target = n2.node_id AND s.sub_name = x.subscription_name ORDER BY s.sub_name;
O resultado é semelhante ao seguinte:
-[ RECORD 1 ]-----------+-------------------------------------- subscription_id | 3072625608 subscription_name | test_sub_1 origin_name | provider target_name | subscriber status | replicating sub_slot_name | pgl_my_test_db_provider_test_sub_1 sub_replication_sets | {default,default_insert_only,ddl_sql} sub_forward_origins | {all} sub_apply_delay | 00:00:00 sub_force_text_transfer | f enabled | t my_test_db=#
Apresente uma lista das tabelas que estão atualmente replicadas e o respetivo número de sequência de registo (LSN) atual por subscrição:
SELECT sync_nspname||'.'||sync_relname AS table_name, sync_status, sync_statuslsn FROM pglogical.local_sync_status WHERE sync_relname IS NOT NULL ORDER BY table_name;
O resultado é semelhante ao seguinte:
table_name | sync_status | sync_statuslsn ---------------------+-------------+---------------- public.test_table_1 | r | 0/B891BC0 (1 row) my_test_db=#
A coluna
sync_statuslsn
mostra com que LSN a tabela está sincronizada. Pode comparar este valor com o LSN na base de dados do fornecedor para avaliar o atraso na replicação.Verifique o estado da replicação de uma tabela específica:
SELECT * FROM pglogical.show_subscription_table('test_sub_1','test_table_1');
Valide os detalhes do conjunto de replicação no fornecedor
Liste os conjuntos de replicação atuais na base de dados do fornecedor e verifique os itens replicados:
SELECT set_name, node_name, replicate_insert, replicate_update, replicate_delete, replicate_truncate FROM pglogical.replication_set JOIN pglogical.node ON set_nodeid = node_id ORDER BY set_name, node_name;
Liste as tabelas e as sequências replicadas:
-- Table details: SELECT set_name, set_reloid AS table_name, set_att_list, set_row_filter FROM pglogical.replication_set NATURAL JOIN pglogical.replication_set_table ORDER BY set_name, table_name; -- Sequence details: SELECT set_name, set_seqoid AS sequence_name FROM pglogical.replication_set NATURAL JOIN pglogical.replication_set_seq ORDER BY set_name, sequence_name;
Verifique as informações de replicação e o atraso de slots no fornecedor
Verifique o estado de cada subscritor gerando a vista
pg_stat_replication
na base de dados do fornecedor: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;
O resultado é semelhante ao seguinte:
-[ 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 my_test_db=#
Tenha em atenção a coluna
reply_delay
, que mostra a hora em que recebeu a última atualização da base de dados de subscritores.Monitorize o atraso da replicação do espaço de replicação no fornecedor porque
pglogical
cria espaços de replicação na base de dados do fornecedor:SELECT slot_name, slot_type, database, active, COALESCE(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn),0) AS restart_lag, COALESCE(pg_wal_lsn_diff(pg_current_wal_lsn(),confirmed_flush_lsn),0) AS confirmed_flush_lag FROM pg_replication_slots WHERE plugin like '%pglogical%' ORDER BY slot_name;
O resultado é semelhante ao seguinte:
-[ RECORD 1 ]-------+----------------------------------- slot_name | pgl_my_test_db_provider_test_sub_1 slot_type | logical database | my_test_db active | t restart_lag | 56 confirmed_flush_lag | 0 my_test_db=#
Resolução de problemas de replicação de subscrições
A subscrição selecionada na base de dados de subscritores tem de apresentar o estado replicating
ou initializing
se tiver sido criada recentemente.
Se o estado for down
, ocorreu um problema.
O estado down
é normalmente apresentado depois de a replicação ter tentado iniciar, mas ter falhado. Isto deve-se a problemas de conetividade causados pela definição dsn
ou a autorizações de base de dados em falta, que se encontram no fornecedor ou no subscritor.
Use o Explorador de registos e inspecione os ficheiros de registo do PostgreSQL quando o Google Cloud Google Cloud AlloyDB for um dos pontos finais, para obter informações adicionais que possam indicar a causa do problema. Os ficheiros de registo fornecem detalhes do problema, incluindo detalhes específicos sobre autorizações em falta.
Verifique o registo do PostgreSQL no seu servidor AlloyDB Omni:
Docker
docker logs CONTAINER_NAME
Substitua
CONTAINER_NAME
pelo nome que atribuiu ao contentor do AlloyDB Omni quando o instalou.Podman
podman logs CONTAINER_NAME
Substitua
CONTAINER_NAME
pelo nome que atribuiu ao contentor do AlloyDB Omni quando o instalou.Resolva problemas com a definição
dsn
e certifique-se de que a conetividade de rede não é a origem do problema:- Copie a string de ligação
dsn
e experimente uma ligação manual através depsql
e da mesma string. Se a sessãopsql
não conseguir estabelecer ligação, indica o seguinte:- Um problema de rede.
- Um endereço IP, um nome de utilizador ou uma palavra-passe incorretos.
- Uma firewall de bloqueio.
- O ficheiro
pg_hba.conf
do outro cluster não está configurado corretamente.
- Copie a string de ligação
Resincronize uma tabela se não quiser eliminar e recriar a subscrição após tomar medidas corretivas:
SELECT pglogical.alter_subscription_resynchronize_table(subscription_name := 'test_sub_1',relation := 'table_name');
Em alternativa, cancele a subscrição e volte a criá-la:
SELECT pglogical.drop_subscription(subscription_name := 'test_sub_1');
O que se segue?
- Comutação e comutação por falha com replicação
pglogical
- Replique dados entre o Google Cloud AlloyDB e o AlloyDB Omni
- Replique dados entre o AlloyDB Omni e outras bases de dados