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

28

我还在学习Kubernetes以及它的工作原理。目前,我正在努力理解如何使用流复制(streaming replication)来建模像PostgreSQL集群这样的东西,并进行扩展和自动故障转移/恢复 (pgpool-II, repmgr, 随你选)。

我的主要问题在于 PostgreSQL 实例的双重性质,配置上--它既可以是主节点也可以是冷热备份(cold/warm/hot standby)。如果我增加副本数量,我希望所有副本都能作为备份启动,因此我想单独创建一个 postgresql-standby 副本控制器以及一个 postgresql-master pod。然而,我也希望在当前主节点失效时,其中一个备份可以成为新的主节点,所以最终它们都需要属于同一个 postgresql 副本控制器。

迄今为止,我唯一的想法是将复制配置放在外部卷上,并在容器之外管理状态和状态更改。

(对于PostgreSQL来说,配置很可能已经存在于其data目录内部的卷上了,显然我也想要这个目录在卷上,但这并不是重点)

这是正确的方法吗,还是有其他更简洁的方式?


我可以建议观看Kelsey Hightower的演讲 - errordeveloper
5
@errordeveloper:有趣的是,演示时间的40%都花在让Kubernetes正常工作上了--这也代表了我的经验。视频中的tl;dr是:PostgreSQL并不是为了水平扩展而设计的,需要重新配置,因此应该使用pod而不是复制控制器。 - Nikolai Prokoschenko
1
这是正确的,虽然可以通过预先制作的VM映像和其他一些快捷方式进行优化。 - errordeveloper
你可能想要查看 https://github.com/zalando-incubator/postgres-operator - Paweł Prażak
4个回答

11

1
你可以尝试使用PostDock,无论是使用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正常运行,则可以尝试使用 我修改过的PostDock版本

Pgpool-II with Watchdog

前面提到的架构存在一个问题,就是pgpool是单点故障。因此,我还尝试启用pgpool-II的看门狗,使用委派虚拟IP,以避免单点故障。

master (primary node1)  --\
|- slave1 (node2)       ---\     / pgpool1 (active)  \
|  |- slave2 (node3)    ----|---|                     |----client
|- slave3 (node4)       ---/     \ pgpool2 (standby) /
   |- slave4 (node5)    --/

我已经测试了以下场景,并且它们都非常有效:
  • 正常情况:两个pgpools都启动,虚拟IP自动应用于其中一个,在我的情况下是pgpool1
  • 故障转移:关闭pgpool1。虚拟IP将自动应用于pgpool2,因此成为活动状态。
  • 启动失败的pgpool:重新启动pgpool1。虚拟IP将保留在pgpool2中,而pgpool1现在作为备用工作。
至于客户端应用程序,这些更改对其来说都是透明的。客户端只需指向虚拟IP,在所有上述情况下都能正常工作。
您可以在我的GitHub存储库上的watchdog分支找到此项目。

我运行了你的分支版本,但是出现了超时异常。>>>>>> 不会添加节点1 - 它无法访问!
等待后端3启动pgpool(WAIT_BACKEND_TIMEOUT = 60) 2019/02/13 10:26:27 等待主机:tcp://pgslave3:5432
- Bhargav Patel

0

0
你可以查看以下其中一个开源的postgresql工具:
1. Crunchy Data PostgreSQL
2. Patroni PostgreSQL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接