一、高可用(High Availability, HA)核心目标**
- 最小化停机时间:确保服务在硬件/软件故障时快速恢复。
- 数据零丢失:通过同步复制保障数据一致性。
- 自动故障转移:无需人工干预切换主节点。
二、主流高可用方案
1. 基于流复制(Streaming Replication)
异步复制:
- 主库写入后无需等待备库确认(可能丢数据)。
- 适用场景:对数据一致性要求不高的业务。
同步复制:
主库提交事务需等待至少一个备库确认(
synchronous_commit = on
+synchronous_standby_names
)。关键配置:
ALTER SYSTEM SET synchronous_standby_names = 'standby1';
2. 自动故障转移工具
工具 | 原理 | 特点 |
---|---|---|
Patroni | 基于DCS(etcd/ZooKeeper)协调选举 | 支持复杂拓扑,与Kubernetes集成最佳 |
repmgr | 轻量级,依赖节点间SSH通信 | 配置简单,适合中小规模集群 |
Pgpool-II | 集成连接池+故障检测+读写分离 | 功能全面,但复杂度较高 |
3. 共享存储方案(如DRBD)
- 多节点共享同一块磁盘(需分布式文件系统如Ceph)。
- 风险点:存储单点故障需额外规避。
三、负载均衡实现方式
⚠️ 注意:PostgreSQL 原生不支持负载均衡,需借助中间件。
1. 连接池级负载均衡
PgBouncer / pgpool-II:
将客户端连接分发到多个后端PostgreSQL实例。
读写分离:将读请求路由到备库(需设置
default_routing_mode = read
in pgpool)。配置示例(pgpool):
backend_hostname0 = 'primary' backend_port0 = 5432 backend_hostname1 = 'replica1' backend_port1 = 5432
2. 应用层负载均衡
使用 HAProxy / Nginx:
通过TCP代理分发连接(仅适用于读操作)。
HAProxy 配置片段:
frontend pg_read bind *:5000 default_backend pg_replicas backend pg_replicas balance roundrobin server replica1 192.168.1.2:5432 check server replica2 192.168.1.3:5432 check backup
3. 服务发现(动态扩容)
- 结合Consul+HAProxy:
当新备库加入时,Consul自动更新HAProxy后端列表。
四、关键架构图示例
典型高可用+读写分离架构
Client → HAProxy (VIP)
├──→ PgBouncer (Primary) → Master DB (RW)
└──→ PgBouncer (Replica) → Standby DB (RO)
↑
Streaming Replication
- VIP:虚拟IP漂移(Keepalived)
- 监控:Prometheus + Grafana(监控复制延迟)
五、故障转移(Failover)流程
检测主库失效(如Patroni通过DCS心跳判断)。
提升备库为新主库:
patronictl failover --candidate replica1 --force
- 重配置集群:
- 更新所有备库的复制源指向新主库。
- 应用层连接池重定向到新VIP。
六、数据一致性保障
- 同步复制超时处理:
- 若备库无响应,主库自动降级为异步(
synchronous_commit = remote_write
)。
- 若备库无响应,主库自动降级为异步(
- 脑裂(Split-Brain)预防:
- 使用Quorum机制(需多数节点确认写入)。
- Patroni配置
ttl
(锁租期)避免双主。
七、云原生方案(Kubernetes)
- Operator框架:
- Crunchy Data / Zalando Postgres Operator:
- 自动创建StatefulSet + 配置流复制。
- 内置备份、克隆、监控功能。
- Crunchy Data / Zalando Postgres Operator:
- 服务暴露:
- 读服务:
ClusterIP
+ 多个Endpoint(指向所有副本)。 - 写服务:固定指向主库的
Headless Service
。
- 读服务:
八、灾难恢复(Disaster Recovery)
- 物理备份:
pg_basebackup
+ WAL归档(到S3/MinIO)。 - 逻辑备份:
pg_dump
+ 定期验证恢复。 - 跨地域复制:使用级联复制或逻辑解码(Debezium)。
九、监控指标清单
类别 | 关键指标 | 工具 |
---|---|---|
复制状态 | pg_stat_replication lag (bytes) |
Prometheus + pg_exporter |
节点健康 | 连接数/锁等待/长事务 | PGHero |
负载均衡 | 请求分布/错误率 | HAProxy Stats |
十、常见陷阱
- 复制延迟导致读旧数据:
- 解决方案:应用层使用
hot_standby_feedback
或强制读主库。
- 连接池耗尽:
- 调整
max_connections
+ 使用PgBouncer
复用连接。
- 自动故障转移误判:
- 设置合理的健康检查超时(如Patroni的
loop_wait
)。
附录:命令速查
# 查看复制状态
SELECT client_addr, state, sync_state, write_lag FROM pg_stat_replication;
# 手动提升备库(无工具时)
pg_ctl promote -D /var/lib/postgresql/data