Patroni项目中的Citus分布式数据库支持详解
概述
Patroni作为PostgreSQL高可用解决方案,为Citus分布式数据库提供了开箱即用的支持。Citus是PostgreSQL的一个扩展,能够将PostgreSQL转变为分布式数据库系统。本文将详细介绍如何在Patroni环境中部署和管理Citus集群。
基本要求
在Patroni中部署Citus集群需要满足以下条件:
-
Citus扩展:所有节点必须安装Citus数据库扩展,最低支持版本为10.0,但建议使用11.2及以上版本以获得完整功能
-
集群配置:
- 所有节点的集群名称(
scope
)必须相同 - 协调器(coordinator)和工作节点(worker)必须使用相同的超级用户凭据
pg_hba.conf
必须允许所有节点间的超级用户访问
- 所有节点的集群名称(
-
网络配置:
- 工作节点必须能够访问协调器的REST API
- 如果配置了客户端证书,协调器必须接受来自工作节点的证书
配置指南
在patroni.yaml
中添加以下Citus专用配置:
citus:
group: X # 0表示协调器,1,2,3等表示工作节点
database: citus # 所有节点必须使用相同的数据库名
配置完成后,Patroni会自动处理以下事项:
- 自动将
bootstrap.dcs.synchronous_mode
设置为quorum模式(如果未显式设置) - 将
citus
扩展添加到shared_preload_libraries
- 自动设置
max_prepared_transactions
为2*max_connections
(如果未显式设置) - 调整
citus.local_hostname
GUC值,确保与Patroni使用的连接地址一致 - 自动创建指定的Citus数据库并安装扩展
- 在
pg_dist_authinfo
表中添加当前超级用户凭据以支持节点间通信 - 协调器主节点自动发现工作节点并将其添加到
pg_dist_node
表 - 在发生故障转移/切换时维护
pg_dist_node
表
集群管理工具
Patroni的patronictl
工具针对Citus集群进行了特殊适配:
- 列表和拓扑视图:默认显示Citus集群的所有成员(协调器和工作节点),新增"Group"列显示所属组
- --group选项:新增的--group选项允许针对特定组执行操作
示例输出:
+ Citus cluster: demo ----------+----------------+---------+----+-------------+-----+------------+-----+
| Group | Member | Host | Role | State | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------+---------+-------------+----------------+---------+----+-------------+-----+------------+-----+
| 0 | coord1 | 172.27.0.10 | Replica | running | 1 | 0/41C0368 | 0 | 0/41C0368 | 0 |
| 0 | coord2 | 172.27.0.6 | Quorum Standby | running | 1 | 0/41C0368 | 0 | 0/41C0368 | 0 |
| 0 | coord3 | 172.27.0.4 | Leader | running | 1 | | | | |
| 1 | work1-1 | 172.27.0.8 | Quorum Standby | running | 1 | 0/31D3198 | 0 | 0/31D3198 | 0 |
| 1 | work1-2 | 172.27.0.2 | Leader | running | 1 | | | | |
| 2 | work2-1 | 172.27.0.5 | Quorum Standby | running | 1 | 0/31CDFC0 | 0 | 0/31CDFC0 | 0 |
| 2 | work2-2 | 172.27.0.7 | Leader | running | 1 | | | | |
+-------+---------+-------------+----------------+---------+----+-------------+-----+------------+-----+
工作节点切换
Citus工作节点的切换过程对应用程序几乎是透明的:
- 协调器会暂停对目标工作节点分片的SQL流量
- 切换操作在流量暂停期间进行
- 当新的主工作节点准备就绪后,流量自动恢复
这一过程通过Citus的citus_update_node
函数实现,确保应用程序几乎不会感知到切换操作。
从节点支持
从Patroni v4.0.0开始,没有noloadbalance
标签的Citus从节点也会注册到pg_dist_node
表中。应用程序可以通过设置citus.use_secondary_nodes
GUC来使用这些从节点处理只读查询。
Kubernetes部署
在Kubernetes环境中部署Citus集群时,Patroni会为每个Citus组创建独立的Kubernetes对象,命名模式为${scope}-${citus.group}-${type}
。所有Pod、Endpoints和ConfigMaps都必须包含相应的标签。
示例协调器配置:
apiVersion: v1
kind: Pod
metadata:
labels:
application: patroni
citus-group: "0"
citus-type: coordinator
cluster-name: citusdemo
spec:
containers:
- env:
- name: PATRONI_SCOPE
value: citusdemo
- name: PATRONI_CITUS_GROUP
value: "0"
Patroni会自动为创建的Kubernetes对象(如ConfigMaps和Endpoints)添加citus-group
标签,确保集群组件能够正确识别所属的Citus组。
总结
Patroni为Citus分布式数据库提供了全面的高可用支持,简化了部署和管理流程。通过自动化的节点发现、配置管理和故障处理,Patroni使Citus集群的运维变得更加简单可靠。无论是在传统环境还是Kubernetes中,Patroni都能为Citus集群提供强大的高可用保障。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考