Patroni支持以下几种分布式配置存储(DCS)系统来保存集群的元数据和Leader信息:

  • etcd:一个流行的分布式键值存储系统,Patroni默认使用它作为DCS。

  • Zookeeper:知名的分布式协调服务,可以作为Patroni的DCS。

  • Consul:一种服务发现和配置工具,同样可以为Patroni提供分布式配置能力。

  • Kubernetes:直接使用Kubernetes的分布式存储能力,无需独立DCS。

  • Redis:可以使用Redis集群来实现Patroni的分布式配置存储。

  • PostgreSQL:直接使用PostgreSQL数据库来存储配置信息。

  • AWS DynamoDB:可以使用AWS的NoSQL数据库作为后端存储。

  • File:使用共享文件来维护集群元数据,适用于简单场景。

  • Memory:在单节点情况下,元数据可以直接存在内存中。

除了etcd之外,常见的组合还包括:

所以Patroni支持多种工业级的分布式配置存储系统,用户可以根据现有基础设施选择合适的DCS。

  • Zookeeper+Patroni:结合Zookeeper的稳定性与Patroni实现自动故障转移。

  • Kubernetes+Patroni:直接基于Kubernetes原生的分布式能力来实现高可用PostgreSQL。

  • Consul+Patroni:使用Consul灵活的服务发现集成Patroni实现高可用。

patroni 网络分区的概念与技术风险

Patroni在网络分区场景下的行为和技术风险主要包括:

  1. 网络分区的概念

网络分区是指节点之间的网络通信被分成两个或多个完全隔离的组,节点在各自组内可以通信,但不同组之间不可以。这会导致分布式系统的分化。

  1. Patroni在分区场景下的行为

如果分区中每一方都有多数的节点存活,那么都会在各自的主分区内选出新的Leader提供服务。但这将导致数据可能不一致。

  1. 技术风险
  • 数据不一致:不同分区的数据可能会不一致,如果应用不能容忍,则存在数据不正确的风险。

  • 服务中断:主分区之外的节点访问会被中断。主分区也可能在资源不足时发生宕机。

  • 脑裂:如果分区恢复后,不同分区的数据可能存在不可调和的冲突。

  • 误判:如果只有一个分区存活大多数节点,可能误判为正常而不知已经发生了分区。

  1. 规避技术手段
  • 尽量避免网络单点故障造成分区。

  • 在应用层增加重试和容错逻辑。

  • 通过声明式分区可以消除分区之外节点的不确定性。

  • 手动设定最小仲裁数,避免小分区误判。

  • 分区恢复后进行人工确认和数据修复。

安全考虑

patroni HA 多数据中心的概念与技术风险

Patroni支持跨数据中心的高可用部署,其主要的概念和技术风险包括:

  1. 概念
  • 多数据中心(Multi-DC):每个DC内部有一个Patroni集群,不同DC之间通过异步流复制进行数据同步。

  • 跨DC故障转移:一个DC发生故障时,可以手动将另一个DC提升为主数据中心,Stemmerais结束服务中断。

  • 多层次界域:可以设置不同规模的故障域,如机架、机房、数据中心,进行级联故障转移。

  1. 技术风险
  • 跨DC网络发生中断,会导致跨DC同步终止。

  • 跨DC同步延迟可能超过业务容忍阈值。

  • 跨DC手动切换存在操作风险,可能导致主备切换错误。

  • 异地双活存在数据不一致的风险。

  • 跨DC部署成本较高,需要权衡商业价值。

  1. 规避技术手段
  • 使用冗余低延迟的专线进行跨DC互联。

  • 监控跨DC同步延迟,评估减少容忍时间窗口。

  • 进行跨DC切换的演练,并设置切换前的数据校验。

  • 通过应用端读取本地DC数据,弱化异地多活的数据不一致问题。

  • 权衡商业需求,也可以使用更经济的单DC容灾方案。

单个数据中心的Patroni集群,既要满足跨洲的高延迟,又要满足高可用如何实现

  1. 网络优化
  • 使用高质量的专线确保数据中心内部网络稳定可靠。

  • 对Patroni组件进行网络隔离,防止污染故障影响。

  • 加密Patroni的网络通信,防止攻击干扰。

  1. 参数优化
  • 调大最大同步延迟参数,满足跨洲的延迟需求。

  • 适当加长故障检测和Leader选举时间,防止跨洲时误判。

  • 配置最小投票数以防止误判失效。

  1. 硬件优化
  • 使用高可靠的企业级服务器、SAN存储。

  • 配置冗余的电源、网络、风扇等组件。

  • 设置服务器监控并启用智能预警。

  1. 部署优化
  • 每个关键组件多节点部署,消除单点故障。

  • 采用分布式的NoSQL数据库作为DCS。

  • 对重要节点设置双机热备。

采用NoSQL数据库作为DCS的原因

主要有以下几个原因推荐使用分布式NoSQL数据库作为Patroni的分布式配置存储(DCS):

  1. 高可用性

NoSQL数据库本身通过分布式结构可以实现高可用,不存在单点故障问题。这提高了Patroni DCS的可靠性。

  1. 高性能

NoSQL数据库优化了读写性能,支持大量读写操作。这可以满足Patroni对DCS的频繁访问需求。

  1. 去中心化

NoSQL数据库是分布式的,天然支持Patroni这样的去中心化架构。不同于使用单点的关系型数据库。

  1. 易操作

NoSQL数据库提供了便捷的接口和操作方式,方便Patroni进行数据存取。运维也较为简单。

  1. 数据一致性

NoSQL数据库支持副本复制和数据一致性,可以保证Patroni中各实例访问到同一可靠数据。

  1. 成熟产品

有多种成熟的NoSQL产品可用,如etcd/Consul/ZooKeeper等,可以直接安装使用。

  1. 云原生支持

NoSQL数据库与容器、微服务等云原生技术结合紧密,适合当前的技术栈。