postgres-replication-lag

PostgreSQL 复制延迟的定位与修复

现象

备库数据落后于主库,pg_stat_replication 的 replay_lag/write_lag 增大,只读查询看到旧数据。严重时备库无法追上,WAL 堆积。

快速定位

SELECT application_name, client_addr, state,
       sent_lsn, write_lsn, flush_lsn, replay_lsn,
       write_lag, flush_lag, replay_lag
FROM pg_stat_replication;

SELECT pg_wal_lsn_diff(pg_current_wal_lsn(),
       replay_lsn) AS lag_bytes
FROM pg_stat_replication;

备库:

SELECT pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn(),
       now() - pg_last_xact_replay_timestamp() AS replay_delay;

常见根因

  1. 网络带宽/延迟不足,WAL 传输慢。
  2. 备库磁盘慢或 CPU 不足,单线程回放跟不上。
  3. 主库写入量突增或大批量 DDL/索引构建。
  4. 备库长查询与回放冲突(hot_standby_feedback)。
  5. 复制槽保留过多 WAL,磁盘压力反过来影响复制。
  6. wal_keep_size/归档配置不当。

修复

相关命令

读完自测

合上页面,先回答,再展开对照。

  1. 主库上如何判断延迟发生在传输还是回放?
  2. 备库上用什么查询查看回放延迟?
  3. 常见根因和修复手段有哪些?
答案
  1. 查 pg_stat_replication 的 write_lag 与 replay_lag(及对应 LSN),比较写入与回放的差距。
  2. 查 pg_last_wal_receive_lsn()、pg_last_wal_replay_lsn() 和 now() - pg_last_xact_replay_timestamp()。
  3. 网络带宽不足、备库磁盘/CPU 慢、主库大事务、长查询冲突或复制槽堆积 WAL;应提升资源、分批写入、调整 wal_keep_size/复制槽并监控 lag。