이 페이지에서는 제공업체 및 구독자 데이터베이스를 확인하고 유효성을 검사하여 pglogical
구현을 모니터링하고 문제를 해결하는 방법을 설명합니다.
시작하기 전에
pglogical
구현을 모니터링하고 문제를 해결하기 전에 제공업체 및 구독자 데이터베이스를 확인하고 pglogical
구현을 이해한 후 구성 방법을 검증합니다.
pglogical
확장 프로그램에 대한 자세한 내용은 pglogical
정보를 참고하세요.
pglogical
를 사용한 데이터 복제에 관한 자세한 내용은 Google Cloud AlloyDB와 AlloyDB Omni 간에 데이터 복제 및 AlloyDB Omni와 다른 데이터베이스 간에 데이터 복제를 참고하세요.
pglogical
, 복제, AlloyDB Omni 매개변수 설정 확인
여러 구성 매개변수가 pglogical 확장 프로그램의 작동에 영향을 미치며, 이는 제공자 및 구독자 데이터베이스에서 확인할 수 있습니다. 매개변수 값은 다를 수 있습니다.
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;
다른 논리 복제 관련 매개변수를 표시합니다.
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;
AlloyDB Omni 관련 매개변수를 표시합니다.
SELECT name, setting, source, short_desc FROM pg_catalog.pg_settings WHERE name LIKE '%alloydb%' ORDER BY category, name;
구성의 노드 나열
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
이면 로컬 노드입니다.dsn
정보를 자세히 검토합니다. 잘못되거나 오래된 연결 문자열 정보는 복제 실패를 초래할 수 있습니다.dsn
문제 해결에 관한 자세한 내용은 구독 복제 문제 해결을 참고하세요.
구독 상태 및 테이블 복제 지점 확인
구독 상태는 항상 구독자 데이터베이스에서 확인됩니다. 구독에 initializing
또는 replicating
상태가 표시됩니다. down
상태도 표시됩니다.
down
상태에 관한 자세한 내용은 정기 결제 복제 문제 해결을 참고하세요.
현재 데이터베이스에서 구독, 현재 상태, 설정을 나열합니다.
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=#
현재 복제 중인 테이블과 구독의 현재 로그 시퀀스 번호 (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과 비교하여 복제 지연을 측정할 수 있습니다.특정 테이블의 복제 상태를 확인합니다.
SELECT * FROM pglogical.show_subscription_table('test_sub_1','test_table_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;
현재 복제 중인 테이블과 시퀀스를 나열합니다.
-- 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;
제공업체에서 복제 정보 및 슬롯 지연을 확인합니다.
제공업체 데이터베이스에서
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=#
구독자 데이터베이스에서 마지막으로 업데이트를 수신한 시간을 보여주는
reply_delay
열을 확인합니다.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 로그 파일을 검사하여 문제의 원인을 나타낼 수 있는 추가 정보를 확인합니다. 로그 파일에는 누락된 권한에 관한 구체적인 세부정보를 비롯하여 문제에 관한 세부정보가 제공됩니다.
AlloyDB Omni 서버에서 PostgreSQL 로그를 확인합니다.
Docker
docker logs CONTAINER_NAME
CONTAINER_NAME
을 AlloyDB Omni 컨테이너를 설치할 때 할당한 이름으로 바꿉니다.Podman
podman logs CONTAINER_NAME
CONTAINER_NAME
을 AlloyDB Omni 컨테이너를 설치할 때 할당한 이름으로 바꿉니다.dsn
설정을 문제 해결하고 네트워크 연결이 문제의 원인이 아닌지 확인합니다.dsn
연결 문자열을 복사하고psql
및 동일한 문자열을 사용하여 수동 연결을 시도합니다.psql
세션을 연결할 수 없는 경우 다음을 나타냅니다.- 네트워킹 문제
- 잘못된 IP 주소, 사용자 이름 또는 비밀번호
- 차단하는 방화벽
- 다른 클러스터의
pg_hba.conf
파일이 올바르게 구성되지 않았습니다.
수정 조치를 취한 후 정기 결제를 삭제하고 다시 만들고 싶지 않다면 테이블을 다시 동기화합니다.
SELECT pglogical.alter_subscription_resynchronize_table(subscription_name := 'test_sub_1',relation := 'table_name');
또는 구독을 삭제하고 다시 만드세요.
SELECT pglogical.drop_subscription(subscription_name := 'test_sub_1');
다음 단계
pglogical
복제를 사용한 전환 및 장애 조치- Google Cloud AlloyDB와 AlloyDB Omni 간에 데이터 복제
- AlloyDB Omni와 다른 데이터베이스 간에 데이터 복제