Monitorize a replicação pglogical no AlloyDB Omni

Selecione uma versão da documentação:

Esta página disponibiliza informações sobre como monitorizar e resolver problemas de implementações verificando e validando as bases de dados de fornecedores e subscritores.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.

  1. 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;
    
  2. 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;
    
  3. 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

  1. 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 for NOT NULL, esse é o nó local.

  2. 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 a dsnresoluçã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.

  1. 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=#
    
  2. 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.

  3. 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

  1. 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;
    
  2. 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

  1. 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=#
    
  2. 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.

  3. 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.

  1. 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.

  2. Resolva problemas com a definição dsn e certifique-se de que a conetividade de rede não é a origem do problema:

    1. Copie a string de ligação dsne experimente uma ligação manual através de psql e da mesma string. Se a sessão psql 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.
  3. 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');
    
  4. Em alternativa, cancele a subscrição e volte a criá-la:

    SELECT pglogical.drop_subscription(subscription_name := 'test_sub_1');
    

O que se segue?