AlloyDB Omni에서 pglogical 복제 모니터링

이 페이지에서는 제공업체 및 구독자 데이터베이스를 확인하고 유효성을 검사하여 pglogical 구현을 모니터링하고 문제를 해결하는 방법을 설명합니다.

시작하기 전에

pglogical 구현을 모니터링하고 문제를 해결하기 전에 제공업체 및 구독자 데이터베이스를 확인하고 pglogical 구현을 이해한 후 구성 방법을 검증합니다.

pglogical 확장 프로그램에 대한 자세한 내용은 pglogical 정보를 참고하세요.

pglogical를 사용한 데이터 복제에 관한 자세한 내용은 Google Cloud AlloyDB와 AlloyDB Omni 간에 데이터 복제AlloyDB Omni와 다른 데이터베이스 간에 데이터 복제를 참고하세요.

pglogical, 복제, AlloyDB Omni 매개변수 설정 확인

여러 구성 매개변수가 pglogical 확장 프로그램의 작동에 영향을 미치며, 이는 제공자 및 구독자 데이터베이스에서 확인할 수 있습니다. 매개변수 값은 다를 수 있습니다.

  1. 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. 다른 논리 복제 관련 매개변수를 표시합니다.

    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. AlloyDB Omni 관련 매개변수를 표시합니다.

    SELECT name,
        setting,
        source,
        short_desc
    FROM pg_catalog.pg_settings
    WHERE name LIKE '%alloydb%'
    ORDER BY category, name;
    

구성의 노드 나열

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

    node_id 열이 NOT NULL이면 로컬 노드입니다.

  2. dsn 정보를 자세히 검토합니다. 잘못되거나 오래된 연결 문자열 정보는 복제 실패를 초래할 수 있습니다. dsn 문제 해결에 관한 자세한 내용은 구독 복제 문제 해결을 참고하세요.

구독 상태 및 테이블 복제 지점 확인

구독 상태는 항상 구독자 데이터베이스에서 확인됩니다. 구독에 initializing 또는 replicating 상태가 표시됩니다. down 상태도 표시됩니다. down 상태에 관한 자세한 내용은 정기 결제 복제 문제 해결을 참고하세요.

  1. 현재 데이터베이스에서 구독, 현재 상태, 설정을 나열합니다.

    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;
    

    출력은 다음과 비슷합니다.

    -[ 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. 현재 복제 중인 테이블과 구독의 현재 로그 시퀀스 번호 (LSN)를 나열합니다.

    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;
    

    출력은 다음과 비슷합니다.

      table_name      | sync_status | sync_statuslsn 
    ---------------------+-------------+----------------
    public.test_table_1 | r           | 0/B891BC0
    (1 row)
    
    my_test_db=#
    

    sync_statuslsn 열에는 테이블이 동기화된 LSN이 표시됩니다. 이를 제공업체 데이터베이스의 LSN과 비교하여 복제 지연을 측정할 수 있습니다.

  3. 특정 테이블의 복제 상태를 확인합니다.

    SELECT * FROM pglogical.show_subscription_table('test_sub_1','test_table_1');
    

제공업체에서 복제 세트 세부정보 확인

  1. 제공업체 데이터베이스에서 현재 복제 세트를 나열하고 복제된 항목을 확인합니다.

    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. 현재 복제 중인 테이블과 시퀀스를 나열합니다.

    -- 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;
    

제공업체에서 복제 정보 및 슬롯 지연을 확인합니다.

  1. 제공업체 데이터베이스에서 pg_stat_replication 뷰를 생성하여 각 구독자의 상태를 확인합니다.

    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;
    

    출력은 다음과 비슷합니다.

    -[ 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. 구독자 데이터베이스에서 마지막으로 업데이트를 수신한 시간을 보여주는 reply_delay 열을 확인합니다.

  3. pglogical가 제공업체 데이터베이스에 복제 슬롯을 만들므로 제공업체의 복제 슬롯 복제 지연을 모니터링합니다.

    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;
    

    출력은 다음과 비슷합니다.

    -[ 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=# 
    
    와 같은 플러그인에서 다룹니다.

구독 복제 문제 해결

구독 데이터베이스에서 확인된 정기 결제가 최근에 생성된 경우 replicating 또는 initializing 상태를 표시해야 합니다. 상태가 down이면 문제가 발생한 것입니다.

down 상태는 일반적으로 복제를 시작하려고 했지만 실패한 후에 표시됩니다. 이는 dsn 설정으로 인한 연결 문제 또는 제공업체 또는 구독자에 있는 데이터베이스 권한 누락으로 인해 발생합니다.

Google Cloud AlloyDB가 엔드포인트 중 하나인 경우 Google Cloud 에서 로그 탐색기를 사용하여 PostgreSQL 로그 파일을 검사하여 문제의 원인을 나타낼 수 있는 추가 정보를 확인합니다. 로그 파일에는 누락된 권한에 관한 구체적인 세부정보를 비롯하여 문제에 관한 세부정보가 제공됩니다.

  1. AlloyDB Omni 서버에서 PostgreSQL 로그를 확인합니다.

    Docker

    docker logs CONTAINER_NAME

    CONTAINER_NAME을 AlloyDB Omni 컨테이너를 설치할 때 할당한 이름으로 바꿉니다.

    Podman

    podman logs CONTAINER_NAME

    CONTAINER_NAME을 AlloyDB Omni 컨테이너를 설치할 때 할당한 이름으로 바꿉니다.

  2. dsn 설정을 문제 해결하고 네트워크 연결이 문제의 원인이 아닌지 확인합니다.

    1. dsn 연결 문자열을 복사하고 psql 및 동일한 문자열을 사용하여 수동 연결을 시도합니다. psql 세션을 연결할 수 없는 경우 다음을 나타냅니다.
      • 네트워킹 문제
      • 잘못된 IP 주소, 사용자 이름 또는 비밀번호
      • 차단하는 방화벽
      • 다른 클러스터의 pg_hba.conf 파일이 올바르게 구성되지 않았습니다.
  3. 수정 조치를 취한 후 정기 결제를 삭제하고 다시 만들고 싶지 않다면 테이블을 다시 동기화합니다.

    SELECT pglogical.alter_subscription_resynchronize_table(subscription_name := 'test_sub_1',relation := 'table_name');
    
  4. 또는 구독을 삭제하고 다시 만드세요.

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

다음 단계