standby의 WAL 수신 및 replay 지연 모니터링(pg_stat_wal_receiver)
PostgreSQL복제명령어
-- Run on the standby:
SELECT pg_is_in_recovery() AS in_recovery,
pg_last_wal_receive_lsn() AS receive_lsn,
pg_last_wal_replay_lsn() AS replay_lsn,
pg_size_pretty(pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn())) AS replay_backlog,
now() - pg_last_xact_replay_timestamp() AS last_replay_age,
pg_get_wal_replay_pause_state() AS pause_state;
SELECT pid, status, sender_host, sender_port, slot_name, received_tli, flushed_lsn, latest_end_lsn, now() - last_msg_receipt_time AS since_last_msg FROM pg_stat_wal_receiver;하는 일
standby가 WAL을 얼마나 수신했고 얼마나 적용했는지(replay backlog), 마지막으로 replay된 트랜잭션의 경과 시간, replay 일시 중지 여부, walreceiver 연결 상태(어느 primary, slot, timeline, 마지막 메시지 시각)를 보여 준다.
사용 시점
primary에 접근할 수 없거나 cascading standby에서 지연을 진단할 때. 'standby behind' 알림 시 네트워크(수신) 문제와 replay(I/O, 충돌) 문제를 구분하기 위해.
주의
pg_stat_wal_receiver가 행을 반환하지 않으면 standby가 streaming 중이 아니다(아카이브로 공급되거나 연결이 끊김). last_replay_age는 primary에 쓰기가 없어도 증가하므로 receive_lsn/replay_lsn 차이와 함께 해석한다. 수신은 진행되는데 replay backlog가 늘어나면 standby에 장시간 쿼리(max_standby_streaming_delay)가 있거나 I/O 병목이 있다.