零停机 Postgres 升级
工程师们剖析了一次在 AWS 上对大型 PostgreSQL 数据库进行实际升级、并尽量实现用户无感停机的尝试,这一过程依赖逻辑复制、应用双连以及精细的切换编排。评论者则争论这种复杂性是否值得,还是应该接受一次短暂的计划内停机——争点包括可用性与一致性的权衡、运维简单性与专用工具之间的取舍,以及客户究竟应当对可靠性抱有多高的预期。讨论还提到了 AWS blue/green 部署、基于 snapshot 的方案,以及把 Postgres 作为通用底座还是引入更专门服务的不同策略。
托管方案 vs 自定义流程
- 有人指出 Heroku 和 AWS 已经支持扩容和 follower 数据库,但也有人澄清,在繁忙的 DB 上 follower 可能严重滞后,而备份/副本也可能变慢或卡住。
- Aurora 新一些的小版本升级和 blue/green 功能受到称赞,但其支持取决于引擎版本,而且有人反馈体验不稳定,所以目前还不能被普遍信任。
多久升级一次,以及一次升多远
- 讨论集中在“big-bang”升级和频繁小升级之间的取舍。
- 一方观点:每次大版本升级的可用性风险都差不多,因此拖延只是在堆积工作量;一次跨很多版本升级会增加风险。
- 另一方观点:“如果没坏,就别修”再加上真实停机成本,导致团队通常会等到最后,然后投入大量精力做一个稳健的一次性流程。
Postgres 作为核心基础设施
- 批评意见认为:把一个 RDBMS 什么都拿来做(日志、队列、调度、业务数据)会形成单点故障,并把这项技术推到了其初衷之外。
- 反驳意见是:很多成功系统都是“Postgres/MySQL + Redis”;更少的组件和一个大家都熟悉的系统,可能比很多专门服务更好。
- 也有人强调这更像工程问题,而不是纯 CS:先把负载尽量收敛到 Postgres,等它不再适合时,再把日志之类的工作负载拆到其他系统中。
零停机 vs 可接受停机
- 对真正的零停机是否值得,分歧非常大。
- 很多人认为,短暂、提前公告的维护窗口(例如每隔几年停 10–15 分钟)对几乎所有 SaaS 都足够,而且比复杂的“零停机”工程更便宜。
- 另一些人,尤其是面向全球客户或基础设施客户的团队,认为任何故障都等同于他们客户的故障,并会损害信任或竞争力。
- 也有人强调,与其追求 100% 可用性,不如重视一致性和清晰沟通,并指出连医院和 hyperscalers 也接受计划内停机。
迁移技术与风险
- 讨论到的方法包括:
- 按表做逻辑复制(更安全,但繁琐且 IO 开销大)。
- 通过 snapshot + replication slot + 推进 LSN 快速创建逻辑副本;但有专家提醒这里存在微妙的数据损坏/丢失风险以及逻辑复制 bug。
- pglogical、自定义工具(例如 pg_easy_replicate)以及 GitLab/Instacart 风格的零停机切换。
- 大表挑战、sequence 同步,以及 ID 策略(UUIDv4/v7、KSUID、HiLo)是反复出现的主题。
- 还有不少人强调演练、验证(checksum、canary)以及至少要有概念上的回滚路径,即使它并不完全对称。