高可用性
具有自动故障转移和自愈能力的企业级高可用性
Pigsty 使用 Patroni 为 PostgreSQL 实现高可用性,确保自动故障转移。
主节点故障 RTO ≈ 30s,RPO < 1MB,副本故障 RTO≈0(重置当前连接)
概述
Pigsty 的 PostgreSQL 集群具有由 Patroni、Etcd 和 HAProxy 支持的内置高可用性。
当您在 PostgreSQL 集群中有两个或更多实例时,您就能够从硬件故障中自愈,无需任何进一步配置——只要集群中的任何实例存活,集群就能提供服务。客户端只需连接到集群中的任何节点即可获得完整服务,无需担心复制拓扑变化。
默认情况下,主节点故障的恢复时间目标(RTO)约为 30s ~ 60s,数据恢复点目标(RPO)< 1MB;对于备用节点故障,RPO = 0,RTO ≈ 0(瞬时)。在一致性优先模式下,保证故障转移期间零数据丢失:RPO = 0。这些指标可以根据您的实际硬件条件和可靠性要求 按需配置。
Pigsty 集成了 HAProxy 负载均衡器进行自动流量切换,为客户端提供多种访问方法,如 DNS/VIP/LVS。除了偶发的中断外,故障转移和切换对业务端几乎不可感知,这意味着应用程序不需要修改连接字符串或重启。
关键指标
高可用性解决的问题
高可用性解决关键的运营挑战:
数据安全
提升可用性:RPO ≈ 0,RTO < 30s,增强数据保护
滚动维护
无缝维护:最小化维护窗口,运营便利
硬件故障
自愈能力:无需人工干预即可从硬件故障中自动恢复
负载分布
读扩展:在备用实例间分布只读查询
具体优势
- 增强数据安全性:将数据安全 CIA 的可用性方面提升到新高度
- 滚动维护能力:实现最小停机时间的无缝维护
- 硬件故障恢复:无需人工干预即可从硬件故障中自愈
- 负载共享:只读请求可以分布在备用实例间
高可用性的成本
实施 HA 会引入某些权衡和要求:
基础设施要求:HA 需要至少 3 个节点 和额外的基础设施依赖。
资源要求
- 最小集群规模:至少 3 个节点以实现适当的共识
- 额外基础设施:需要共识存储(Etcd)和负载均衡器
- 资源开销:额外的 CPU、内存和网络资源
- 运营复杂性:增加的监控和管理要求
限制
高可用性 无法防止:
- 人为错误和操作失误
- 导致数据损坏的软件缺陷
- 逻辑数据删除或损坏
对于这些场景,需要额外的恢复策略:
- 延迟集群 防护逻辑损坏
- 时间点恢复 进行细粒度数据恢复
- 定期备份 用于灾难恢复场景
架构
Pigsty 的 HA 架构利用多组件设计消除单点故障:
Patroni
集群管理:编排 PostgreSQL 进程并处理自动故障转移
Etcd
共识存储:提供分布式配置和领导者选举
HAProxy
负载均衡器:路由流量并提供服务发现
VIP Manager
虚拟 IP:用于无缝连接的可选第二层 VIP 绑定
组件角色
集群编排器
- 管理 PostgreSQL 服务器进程
- 处理自动故障转移和切换
- 监控集群健康和拓扑
- 配置流复制
- 提供集群管理 REST API
# Patroni 配置示例
patron:
name: pg-test-1
scope: pg-test
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 30
分布式配置存储
- 存储集群配置和状态
- 提供领导者选举机制
- 确保所有节点的一致视图
- 优雅处理网络分区
- 维护集群成员信息
# Etcd 集群配置
etcd_cluster: etcd
etcd_safeguard: false
etcd_clean: true
流量路由器和负载均衡器
- 将读/写流量路由到适当的节点
- 为数据库实例提供健康检查
- 提供多个服务端点
- 处理连接池和负载分布
- 支持 SSL 终止和连接限制
# HAProxy 服务端点
primary:5433 # 主节点读写流量
replica:5434 # 副本只读流量
default:5436 # 故障转移感知连接
offline:5438 # 专用离线查询
虚拟 IP 管理
- 管理第二层虚拟 IP 地址
- 提供无缝客户端连接
- 在故障转移期间处理 VIP 迁移
- 支持多个 VIP 接口
- 用于简化客户端访问的可选组件
# VIP 配置
vip_enabled: true
vip_address: 10.10.10.99/24
vip_interface: eth0
实现
Pigsty 的 HA 实现遵循 PostgreSQL 集群的成熟模式:
复制架构
流复制
PostgreSQL 使用内置流复制在主节点和备用节点之间进行数据同步。
基于共识的领导
Patroni 使用 Etcd 进行分布式共识来选举集群领导者并管理拓扑变化。
自动故障转移
当主节点失败时,Patroni 自动提升最新的备用节点成为新的主节点。
流量重路由
HAProxy 检测拓扑变化并自动将流量路由到新的主实例。
故障场景
主节点故障处理过程
- 检测:Patroni 检测主节点故障(15-30 秒)
- 领导者选举:Etcd 协调新领导者选择
- 提升:最新的备用节点被提升为主节点
- 重新配置:剩余的备用节点重新配置到新主节点
- 流量切换:HAProxy 将流量重定向到新主节点
写服务中断:故障转移过程中 15-30 秒
备用节点故障处理过程
- 检测:立即检测到备用节点故障
- 流量重路由:HAProxy 从池中移除故障节点
- 服务连续性:只读查询在剩余备用节点上继续
- 自动恢复:节点恢复时自动重新加入集群
最小影响:只读查询仅经历短暂中断
网络分区处理
- 防止脑裂:Etcd 共识防止多个主节点
- 仲裁要求:需要大多数节点进行操作
- 优雅降级:少数分区中的只读模式
- 自动恢复:分区愈合时恢复正常操作
仲裁依赖:需要大多数共识节点保持运行
权衡
Pigsty 提供可配置参数来平衡恢复速度和数据一致性:
恢复时间目标(RTO)
pg_rto
参数控制故障转移时间和敏感性:
# RTO 配置
pg_rto: 30 # 默认:30 秒
较低的 RTO 值:
- ✅ 更快的故障转移响应
- ✅ 减少服务中断
- ❌ 更高的误报风险
- ❌ 可能导致不必要的故障转移
较高的 RTO 值:
- ✅ 更稳定,较少误报
- ✅ 对网络故障有更好的容忍度
- ❌ 更长的服务中断
- ❌ 对真实故障的延迟响应
恢复点目标(RPO)
pg_rpo
参数限制故障转移期间的潜在数据丢失:
# RPO 配置
pg_rpo: 1048576 # 默认:1MB
较低的 RPO 值:
- ✅ 更好的数据一致性
- ✅ 最小的数据丢失风险
- ❌ 可能延迟故障转移
- ❌ 可能影响可用性
较高的 RPO 值:
- ✅ 更快的故障转移过程
- ✅ 更好的可用性
- ❌ 更多数据丢失的可能性
- ❌ 一致性权衡
配置示例
# 零数据丢失配置
synchronous_mode: true
synchronous_mode_strict: true
pg_rpo: 0
pg_rto: 60
synchronous_standby_names: 'ANY 1 (*)'
使用场景:金融系统、关键交易数据
# 快速故障转移配置
synchronous_mode: false
pg_rpo: 16777216 # 16MB
pg_rto: 15
max_replication_slots: 16
使用场景:高流量应用、读重型工作负载
# 默认平衡配置
synchronous_mode: false
pg_rpo: 1048576 # 1MB
pg_rto: 30
max_replication_slots: 8
使用场景:大多数生产环境
网络质量影响
网络条件显著影响 HA 行为:
- 高质量网络:可以安全使用较低的 RTO 值
- 不稳定网络:需要较高的 RTO 以防止误报
- WAN 部署:需要仔细调整超时参数
- 本地网络:可以优化更快的故障转移
监控和可观测性
Pigsty 为 HA 集群健康提供全面监控:
关键指标
集群状态
监控集群拓扑、领导者状态和成员健康
复制延迟
跟踪所有副本的复制延迟和同步状态
故障转移事件
记录并分析故障转移事件及其影响
性能
监控查询性能和连接健康
仪表板集成
Pigsty 包含用于 HA 监控的预构建 Grafana 仪表板:
- 集群概览:实时集群拓扑和健康
- 复制监控:延迟指标和同步状态
- 故障转移分析:历史故障转移事件和时间
- 性能指标:正常和故障转移场景下的查询性能
最佳实践
部署建议
反亲和性:在不同的物理主机、机架或可用区部署集群节点。
- 硬件多样性:使用不同的硬件配置以避免常见故障模式
- 网络冗余:确保集群节点间有多条网络路径
- 存储考虑:使用本地存储获得最佳性能,特定用例使用共享存储
- 监控设置:在投产前实施全面监控
运营指南
- 定期测试:在非生产环境中执行受控的故障转移测试
- 容量规划:为故障转移场景适当调整集群节点大小
- 备份策略:维护独立于 HA 设置的定期备份
- 文档:保持紧急程序运行手册的更新
常见陷阱
避免这些常见错误:
- 节点间网络带宽不足
- 复制延迟监控不充分
- 不定期测试故障转移程序
- 防火墙配置不正确
总结
Pigsty 的高可用性解决方案提供:
- 自动故障转移,RTO 不到一分钟
- 可配置一致性,具有 RPO 控制
- 自愈能力,用于硬件故障
- 负载均衡,用于读扩展
- 最小运营开销,具有自动化管理
Patroni、Etcd 和 HAProxy 的组合创建了一个强大的、生产就绪的 HA 解决方案,自动处理大多数故障场景,同时提供基于特定要求调整行为的灵活性。
高可用性不仅仅是技术——它是构建您的业务可以依赖的弹性系统。