如何使用Docker/Kubernetes为PostgreSQL故障转移群集建模?

如何使用Docker/Kubernetes为PostgreSQL故障转移群集建模?,postgresql,docker,kubernetes,Postgresql,Docker,Kubernetes,我仍在绞尽脑汁研究库伯内特斯,以及这是怎么回事。目前,我正在努力理解如何使用流式复制、向外扩展和自动故障切换/回切(pgpool II,repmgr,选择你的毒药)对PostgreSQL集群进行建模 我使用这种方法的主要问题是PostgreSQL实例的双重性质,从配置角度看——它要么是主实例,要么是冷/热/热备用实例。如果我增加复制副本的数量,我希望它们都作为备用副本出现,因此我可以想象创建一个postgresql备用复制控制器,与postgresql主pod分开。不过,我也希望其中一个备用控制

我仍在绞尽脑汁研究库伯内特斯,以及这是怎么回事。目前,我正在努力理解如何使用流式复制、向外扩展和自动故障切换/回切(pgpool II,
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将同步但作为备用节点
对于客户端应用程序,这些更改都是透明的。客户机只指向pgpool节点,在上述所有场景中都能正常工作

注意:如果您在运行PostDock时遇到问题,可以尝试

带看门狗的Pgpool II 上述体系结构的一个问题是pgpool是单点故障。因此,我还尝试使用委派的虚拟IP启用,以避免单点故障

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现在作为备用
对于客户端应用程序,这些更改都是透明的。客户机只是指向虚拟IP,在上述所有场景中都能正常工作


您可以在上找到此项目。

您可以查看以下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