PostgreSQL 分布式高可用集群方案

vip-manager 的作用与技术风险

vip-manager是Citus集群管理高可用的一个关键组件,它的主要作用和可能的技术风险包括:

  1. 作用
  • 管理虚拟IP资源,实现自动故障转移。

  • 检测节点故障,触发虚拟IP漂移到存活节点。

  • 与Patroni集成,协调故障转移过程。

  • 提供HTTP API进行高可用状态监控。

  1. 技术风险
  • 虚拟IP漂移过程中,请求可能丢失。

  • 虚拟IP不必要的漂移会中断服务。

  • 故障判定参数设置不当,可能将故障判定为健康。

  • 虚拟IP不支持云平台,可能需要改用DNS方式。

  • 虚拟IP依赖底层网络服务质量。

  • HTTP API存在安全风险,需要设防护措施。

  • 与Patroni集成问题可能影响自动故障转移。

  1. 规避措施
  • 减少故障判定的时间粒度,但又不至于造成虚拟IP抖动。

  • 在应用端设置重试机制。

  • 对故障判定逻辑进行充分测试。设置容错参数。

  • 支持多种高可用实现方式,如虚拟IP和DNS。

  • 对网络服务进行冗余部署,提高底层可靠性。

  • 对API进行访问控制和安全验证。

  • 优化与Patroni的集成接口,进行充分的集成测试。

Citus 分布式下故障恢复

常规恢复

Citus是一个开源的分布式 PostgreSQL 扩展,可以轻松地将大规模 PostgreSQL 数据库水平切分到多个节点上。Citus 在分布式查询处理、故障恢复等方面提供了很好的支持:

  1. 节点故障

Citus 通过在每个节点上维护数据副本来提供高可用性和故障恢复能力。如果一个节点发生故障,Citus 会自动将该节点上的查询路由到存有该节点数据副本的其他节点上。这种方式可以提供无缝的故障转移。

  1. 协调器故障

Citus 集群有一个协调器节点,它负责计划和路由查询到适当的工作器节点。如果协调器发生故障,Citus 会自动故障转移到一个预置的后备协调器。后备协调器在启动时会接管集群,使得整个集群可以持续运行。

  1. 数据恢复

如果节点数据损坏或者丢失,Citus 支持从其他节点的副本中恢复数据。这可以通过pg_restore工具实现。管理员只需要从包含完整数据副本的节点导出数据,然后还原到发生数据丢失的节点上。

  1. 备份与恢复

Citus 允许使用 PostgreSQL 的物理备份和恢复机制对每个节点进行备份和恢复。此外,还可以对 Citus 集群做逻辑备份,例如使用pg_dump导出集群的逻辑表结构。在故障后,可以通过这些备份来恢复每个节点的数据和集群的逻辑结构。

其他恢复方式

  1. 跨数据中心复制

Citus支持将集群扩展到多个数据中心,并且可以在数据中心之间进行双向复制,实现跨机房冗余。如果单个数据中心不可用,Citus可以故障转移到另一个数据中心,避免整个服务中断。

  1. 预写日志复制(WAL Streaming Replication)

Citus支持使用PostgreSQL的预写日志流复制功能,可以将某个节点的WAL日志实时复制到其他节点,实现高可用性。如果有节点失效,其他节点可以快速接管而不会丢失数据。

  1. 级联复制

Citus可以在节点之间进行多级联复制。例如节点A复制到B,B复制到C。这样如果A故障,可以先使用B,然后建立一个新的A进行复制。

  1. 可插拔的分区恢复

Citus允许灵活移除或恢复 individual 分区,而不影响查询其他分区的数据。这在单个分区故障时可以避免整个服务中断。

  1. 按需物理备份

Citus支持按节点或分区进行增量物理备份。这样即使巨大的分布式数据库,也可以进行可管理的备份和恢复,而不需要全量备份整个集群。

  1. 流复制订阅

Citus还支持PostgreSQL的流复制订阅和可 decryptable异步复制,这提供了更多的异步和级联复制选项。

patroni 与 Citus 分布式下故障恢复

Patroni与Citus可以很好地集成,来提供分布式 PostgreSQL 集群的高可用性和容错能力。
Patroni是一个用于管理PostgreSQL高可用的工具。它使用Raft协议,在数据库节点之间进行Leader选举和自动故障转移。

Citus 可以和Patroni集成的主要方式:

  1. 对Citus每个节点配置Patroni。这样当单个PostgreSQL节点故障时,Patroni可以自动进行故障转移,从而保证Citus的高可用。
  2. 在Citus协调器节点上运行Patroni。协调器节点可以自动故障转移,避免整个Citus集群不可用。
  3. 同时在每个工作节点和协调器上使用Patroni。这样全面保证每个数据节点和协调器的高可用。
  4. 将Patroni与Citus的跨数据中心复制结合使用。通过Patroni的自动故障转移与Citus的多数据中心冗余机制,可以实现跨机房的故障恢复。
  5. 结合Citus的流复制、级联复制和物理备份。Patroni 进行主要的自动故障转移,而Citus提供流复制、增量备份等辅助手段。

技术风险

  1. 网络抖动导致的误判

如果网络发生抖动,Patroni可能会误判当前Leader不可用,引发不必要的故障转移。可以优化故障判定逻辑,增加判断门限。

  1. 同步延迟造成数据不一致

在故障转移过程中,新的Leader可能来不及与旧Leader进行完整同步,导致短暂的数据不一致。需要评估应用的容忍时间。

  1. 脑裂导致数据冲突

极端情况下,如果数据中心内部网络发生分区,可能出现脑裂,各分区选出不同Leader,数据可能冲突。需要人工介入修复。

  1. 人为误操作切换错误Leader

Patroni允许通过HTTP API进行人工干预Leader切换,如果误操作可能导致服务中断。应限制人工操作或做确认。

  1. 配置错误影响数据一致性

如果Patroni或流复制的参数配置错误,也可能导致数据同步或一致性问题。需要进行充分的测试验证。

  1. 备份恢复失败

如果备份及恢复机制出现问题,可能无法从故障中完全恢复。应建立冗余的多级备份和定期演练。

  1. 升级问题破坏高可用

软硬件的升级可能导致兼容问题,应充分测试并分阶段进行,以免破坏生产环境稳定性。

  1. 资源容量规划不足

规避技术风险

如果计算资源、存储容量、网络带宽规划不留足余量,也可能导致节点故障并触发服务中断。

为了规避在Patroni与Citus集成时可能遇到的技术风险,可以考虑采取以下措施:

  1. 优化网络配置,防止抖动。如使用冗余网卡、 bonded连接等。

  2. 调整故障检测逻辑,增加判断延迟和确认阈值,防止误判。

  3. 测试和设置合理的故障转移超时时间,评估数据同步的容忍窗口。

  4. 在关键环节设置人工确认步骤,避免误操作。采取RBAC授权机制。

  5. 对配置进行代码评审,设置校验机制。充分测试各种故障场景。

  6. 建立多级备份体系。定期演练各类故障的恢复过程。

  7. 设置可以回滚的升级方案。分阶段分批次进行升级。完全测试后再推全量。

  8. 按峰值需求设计资源容量。监控并预留一定的资源余量。

  9. 监控并设置预警规则,避免出现单点或cascade故障。

  10. 开发自动化的故障自愈系统,降低依赖人工操作。

高级示例

参考资料