Lobsters | 原文链接 | 2026-09-03 收录

在副本上读取自己刚写入的数据:PostgreSQL 19 的 WAIT FOR LSN

来源: boringsql.com — 2026-09-01

概述

现代应用把变更写入主库后,会立刻并行地去副本读取,却常常撞上复制延迟(replica lag),看到刚提交的数据凭空消失几秒。常见的规避手法——把读固定到主库、加 sleep 延迟、用 Redis 打标记——本质上都是靠猜。PostgreSQL 19 新增的 WAIT FOR LSN 让副本能直说“我等到了哪个位置”:提交后在主库取到 WAL 的 LSN,读之前在副本上执行 WAIT FOR LSN,副本会阻塞到重放完该位置再返回。作者在真实流量下测了数千次:朴素读副本的陈旧率高达 99.2%,sleep 50ms 虽消除陈旧但延迟暴涨,而 WAIT FOR 把延迟压到接近主库(p50 2.8ms vs 1.9ms),且无需修改框架。文章还剖析了 TIMEOUT 本质是“路由预算”而非调优旋钮、synchronous_commit 只等 flush 不等 replay 的陷阱,以及超时回退主库会引发的“羊群踩踏”。

核心要点

金句

Your application has to act like a traffic conductor. It guesses the replication lag using timeouts and Redis flags. The replica already knows exactly where it stands; your code just has no way to ask.(应用像交通指挥一样靠超时与标记去猜延迟,而副本明明清楚自己的位置——只是你的代码无从询问。)
返回 Lobsters 首页