← 中文资源

简体中文版本

复制延迟

复制延迟是主库写入到副本可见之间的滞后,会导致陈旧读、读己之写失败和结果回退,除非有意路由读请求。

阅读英文原文

读己之写失败

用户更新资料,写入主库;下一次页面加载从尚未应用变更的副本读取,显示旧资料;一秒后刷新才看到新值。数据没有丢失,只是读请求被路由到了陈旧副本。

缓解方式

  • 必须反映用户自己写入的读请求,在短窗口内路由到主库。
  • 跟踪写入时间戳或日志序列号,要求副本已追上。
  • 会话期间使用粘性会话或按用户路由读取。
  • 对信息流和分析接受有界陈旧,并标注新鲜度。
-- PostgreSQL:查看副本延迟
SELECT client_addr, state, sent_lsn, replay_lsn,
       pg_wal_lsn_diff(sent_lsn, replay_lsn) AS lag_bytes
FROM pg_stat_replication;

何时选择副本

当应用能容忍有界陈旧时,使用副本扩展读取和降低地理延迟。与同步复制相比,异步副本保持低写入延迟但削弱读保证;与缓存相比,副本持有完整数据集并应用写入,但仍会滞后。

陷阱

故障转移、批量加载或长事务期间延迟可能更大。只检查连通性的健康检查会漏掉应用延迟。如果读取需要最新写入,应在数据访问层显式表达,而不是依赖负载均衡器的选择。