Patroni 是什么

一句话总结

PostgreSQL 的高可用方案——主库挂了自动选新主,整个过程不用人碰,应用端几乎无感。


🤔 为什么会有它 / 解决了什么问题

PostgreSQL 内置的流复制(Streaming Replication)能让你搞一主一备,但主库宕机后不会自动切换——得靠 DBA 半夜起来手动跑命令。而且”谁是主”这个信息没有统一的地方查,应用不知道该连哪个 IP。Patroni 就是解决了这个问题:它用分布式一致性存储(etcd/Consul/ZooKeeper)记录”当前主库是谁”,主库挂了自动触发选主(Leader Election),把备库提升为新的主库,同时更新集群状态让所有人知道新主是谁。


🔍 具体原理 / 运作逻辑

每台数据库服务器上跑一个 Patroni 进程(Python 写的),它通过 etcd 的分布式锁(Leader Key)确定谁是当前主库。主库挂了后 etcd 的锁过期,备库们发起竞选,最先拿到 etcd 锁的备库把自己提升为主库并开始接受写请求。应用不直接连 PostgreSQL IP,而是连 Patroni 的 REST API 或负载均衡器(如 HAProxy),Patroni 告诉它”当前主库是哪个”。


🧭 什么情况下会用到 / 什么场景会遇到它

  • PostgreSQL 跑在生产环境,需要自动故障转移不能依赖 DBA 手动操作
  • 数据库集群需要读写分离(主库写、备库读查询)

🛠️ 怎么上手 / 在哪操作

在 PostgreSQL 集群的每台机器上装 Patroni + etcd/Consul,写 patroni.yml 配置,systemd 启动。


⚖️ 副作用 / 代价 / 取舍

  • 需要额外维护 etcd 或 Consul 集群(本身也是分布式系统,有自己的运维复杂性)
  • 异步复制模式下故障切换可能丢几秒数据(主库已写但备库还没同步的事务)
  • Python 写的,在某些极端场景下性能不如 C/Rust 实现的管理工具
  • 切换期间写操作会短暂中断(几秒到几十秒,取决于 etcd 检测 + 选主时间)

🕰️ 来历

  • 谁提出/创造的:Zalando(欧洲电商公司)开源,由 Alexander Kukushkin 等工程师开发
  • 什么时候出现的:2015 年开源发布

🔗 关联 / 经常一起出现的概念

  • etcd:Patroni 依赖的分布式键值存储,用来记录集群状态和实现 Leader Election(用 Raft 共识)
  • PostgreSQL Streaming Replication:Patroni 底层的数据库复制技术,主库把 WAL 日志实时传给备库
  • HAProxy:常和 Patroni 搭配的负载均衡器,把写请求路由到主库、读请求分发到备库

⚠️ 注意事项 / 常见误区

Patroni 不等于”数据库完全不怕挂”。它的切换不是即时的(通常 10-30 秒),而且异步模式下会丢数据。同步复制模式不丢数据但写入变慢。另外很多人以为 Patroni 能自动解决脑裂——不完全,网络分区(Network Partition)场景下可能出现多主同时写入,需要 etcd 的租约机制和合理配置来缓解。


📎 记忆锚点

“PG 的自动换胎系统——主胎爆了备胎自己顶上,不需要你下车操作。”


📝 更新日志

日期改动原因
2026-07-13首次创建-