如何使用Docker/Kubernetes为PostgreSQL故障转移群集建模?
我仍在绞尽脑汁研究库伯内特斯,以及这是怎么回事。目前,我正在努力理解如何使用流式复制、向外扩展和自动故障切换/回切(pgpool II,如何使用Docker/Kubernetes为PostgreSQL故障转移群集建模?,postgresql,docker,kubernetes,Postgresql,Docker,Kubernetes,我仍在绞尽脑汁研究库伯内特斯,以及这是怎么回事。目前,我正在努力理解如何使用流式复制、向外扩展和自动故障切换/回切(pgpool II,repmgr,选择你的毒药)对PostgreSQL集群进行建模 我使用这种方法的主要问题是PostgreSQL实例的双重性质,从配置角度看——它要么是主实例,要么是冷/热/热备用实例。如果我增加复制副本的数量,我希望它们都作为备用副本出现,因此我可以想象创建一个postgresql备用复制控制器,与postgresql主pod分开。不过,我也希望其中一个备用控制
repmgr
,选择你的毒药)对PostgreSQL集群进行建模
我使用这种方法的主要问题是PostgreSQL实例的双重性质,从配置角度看——它要么是主实例,要么是冷/热/热备用实例。如果我增加复制副本的数量,我希望它们都作为备用副本出现,因此我可以想象创建一个postgresql备用
复制控制器,与postgresql主
pod分开。不过,我也希望其中一个备用控制器在当前主控制器关闭时成为主控制器,所以它毕竟是一个常见的postgresql
复制控制器
到目前为止,我唯一的想法是将复制配置放在外部卷上,并在容器外部管理状态和状态更改
(对于PostgreSQL,配置可能已经在其data
目录中的卷上,这显然是我想要的卷上的配置,但这不是重点)
这是正确的方法,还是有其他更干净的方法?在OpenShift中有一个例子:在纯Kube中原理是相同的(它没有使用任何真正特定于OpenShift的东西,您可以使用普通docker中的图像)Kubernetes的statefulset是建立有状态服务的良好基础。要在PostgreSQL副本中配置正确的成员身份,您仍需要做一些工作 库伯内特斯有一个例子 你可以试试,用docker compose或Kubernetes。目前,我已经在docker compose项目中尝试了它,模式如下所示:
pgmaster (primary node1) --|
|- pgslave1 (node2) --|
| |- pgslave2 (node3) --|----pgpool (master_slave_mode stream)----client
|- pgslave3 (node4) --|
|- pgslave4 (node5) --|
我已经测试了以下场景,它们都工作得很好:
- 复制:在主(即主)节点所做的更改将复制到所有备用(即从)节点
- 故障转移:停止主节点,备用节点(如node4)将自动接管主角色
- 防止两个主节点:恢复前一个主节点(node1),node4将继续作为主节点,而node1将同步但作为备用节点
master (primary node1) --\
|- slave1 (node2) ---\ / pgpool1 (active) \
| |- slave2 (node3) ----|---| |----client
|- slave3 (node4) ---/ \ pgpool2 (standby) /
|- slave4 (node5) --/
我已经测试了以下场景,它们都工作得很好:
- 正常场景:两个PGPool都启动,虚拟IP自动应用到其中一个,在我的例子中是pgpool1
- 故障转移:关闭pgpool1。虚拟IP将自动应用于pgpool2,因此pgpool2变为活动状态
- 启动失败的pgpool:重新启动pgpool1。虚拟IP将保留在pgpool2中,pgpool1现在作为备用
您可以在上找到此项目。您可以查看以下postgresql开源工具之一 1脆弱数据postgresql
我可能会帮忙看Kelsey Hightower的…@errordeveloper:有趣的是,40%的演示时间都花在让Kubernetes工作上——这也代表了我的经验。tl;视频中的dr是:PostgreSQL的构建不是为了在不重新配置的情况下水平扩展,所以它应该是一个pod而不是一个复制控制器。这是真的,虽然可以使用预烘焙的VM映像和其他一些快捷方式进行优化。您可能需要查看我已运行您的fork版本,但我遇到超时异常。>>>>>不会添加节点1-无法访问它!>>>>>>正在等待后端3启动pgpool(等待后端超时=60)2019/02/13 10:26:27正在等待主机:tcp://pgslave3:5432