PlanetScale 的 Shlomi Noach 讲 Neki 分片(一个 Postgres 主库加多个只读副本)如何做计划内切主,分三段:预检、收敛与提升、客户端恢复。和故障切换最大的区别是不需要故障检测——主库本来就要让位,Admin 可以提前把所有检查跑完,任何一项不过就拒绝切换,主库原样保留。真正的难点是确定最终 WAL 位置:主库还在产生 WAL,所以 Admin 先让 Router 缓冲查询、把主库新事务默认改成只读,采样主库位置并记录各副本最终的 receive_lsn,断开非目标副本后取两者较大值,再等目标副本追平。整个切换带截止时间,超时就恢复旧主库可写、重连副本。
ANY 1 (...):不让某个慢副本卡住主库;目标追平并断开其余副本后,它就是唯一同步备库。synchronous_commit = on 下,所有被确认的提交在提升前都已落在目标上。