Patroni介绍
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在网络分区场景下的行为和技术风险主要包括:
- 网络分区的概念
网络分区是指节点之间的网络通信被分成两个或多个完全隔离的组,节点在各自组内可以通信,但不同组之间不可以。这会导致分布式系统的分化。
- Patroni在分区场景下的行为
如果分区中每一方都有多数的节点存活,那么都会在各自的主分区内选出新的Leader提供服务。但这将导致数据可能不一致。
- 技术风险
数据不一致:不同分区的数据可能会不一致,如果应用不能容忍,则存在数据不正确的风险。
服务中断:主分区之外的节点访问会被中断。主分区也可能在资源不足时发生宕机。
脑裂:如果分区恢复后,不同分区的数据可能存在不可调和的冲突。
误判:如果只有一个分区存活大多数节点,可能误判为正常而不知已经发生了分区。
- 规避技术手段
尽量避免网络单点故障造成分区。
在应用层增加重试和容错逻辑。
通过声明式分区可以消除分区之外节点的不确定性。
手动设定最小仲裁数,避免小分区误判。
分区恢复后进行人工确认和数据修复。
安全考虑
patroni HA 多数据中心的概念与技术风险
Patroni支持跨数据中心的高可用部署,其主要的概念和技术风险包括:
- 概念
多数据中心(Multi-DC):每个DC内部有一个Patroni集群,不同DC之间通过异步流复制进行数据同步。
跨DC故障转移:一个DC发生故障时,可以手动将另一个DC提升为主数据中心,Stemmerais结束服务中断。
多层次界域:可以设置不同规模的故障域,如机架、机房、数据中心,进行级联故障转移。
- 技术风险
跨DC网络发生中断,会导致跨DC同步终止。
跨DC同步延迟可能超过业务容忍阈值。
跨DC手动切换存在操作风险,可能导致主备切换错误。
异地双活存在数据不一致的风险。
跨DC部署成本较高,需要权衡商业价值。
- 规避技术手段
使用冗余低延迟的专线进行跨DC互联。
监控跨DC同步延迟,评估减少容忍时间窗口。
进行跨DC切换的演练,并设置切换前的数据校验。
通过应用端读取本地DC数据,弱化异地多活的数据不一致问题。
权衡商业需求,也可以使用更经济的单DC容灾方案。
单个数据中心的Patroni集群,既要满足跨洲的高延迟,又要满足高可用如何实现
- 网络优化
使用高质量的专线确保数据中心内部网络稳定可靠。
对Patroni组件进行网络隔离,防止污染故障影响。
加密Patroni的网络通信,防止攻击干扰。
- 参数优化
调大最大同步延迟参数,满足跨洲的延迟需求。
适当加长故障检测和Leader选举时间,防止跨洲时误判。
配置最小投票数以防止误判失效。
- 硬件优化
使用高可靠的企业级服务器、SAN存储。
配置冗余的电源、网络、风扇等组件。
设置服务器监控并启用智能预警。
- 部署优化
每个关键组件多节点部署,消除单点故障。
采用分布式的NoSQL数据库作为DCS。
对重要节点设置双机热备。
采用NoSQL数据库作为DCS的原因
主要有以下几个原因推荐使用分布式NoSQL数据库作为Patroni的分布式配置存储(DCS):
- 高可用性
NoSQL数据库本身通过分布式结构可以实现高可用,不存在单点故障问题。这提高了Patroni DCS的可靠性。
- 高性能
NoSQL数据库优化了读写性能,支持大量读写操作。这可以满足Patroni对DCS的频繁访问需求。
- 去中心化
NoSQL数据库是分布式的,天然支持Patroni这样的去中心化架构。不同于使用单点的关系型数据库。
- 易操作
NoSQL数据库提供了便捷的接口和操作方式,方便Patroni进行数据存取。运维也较为简单。
- 数据一致性
NoSQL数据库支持副本复制和数据一致性,可以保证Patroni中各实例访问到同一可靠数据。
- 成熟产品
有多种成熟的NoSQL产品可用,如etcd/Consul/ZooKeeper等,可以直接安装使用。
- 云原生支持
NoSQL数据库与容器、微服务等云原生技术结合紧密,适合当前的技术栈。