2015-04-04 102 views
26

我还在包围着Kubernetes,以及它应该如何工作。目前,我正在努力了解如何使用流式复制,扩展和自动故障转移/故障回复(pgpool-II,repmgr,选择毒药)来模拟PostgreSQL群集。如何使用Docker/Kubernetes为PostgreSQL故障转移群集建模?

该方法的主要问题是PostgreSQL实例的双重性质,配置方面 - 它是主或冷/暖/热备用。如果我增加副本的数量,我希望它们都作为standbys出现,所以我想象创建一个postgresql-standby复制控制器与postgresql-master荚分开。不过,我也希望其中一个备用数据库在当前主数据库出现故障时成为主数据库,因此毕竟这是一个常见的复制控制器。

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

(PostgreSQL中的情况下,配置很可能已经是其data目录,这本身就是很明显的东西我想在卷上里面的卷上,但这是题外话)

是这样正确的方式,还是有其他更清洁的方式?

+0

我可能会帮助观看Kelsey Hightower的[talk](https://youtu.be/9W-ngbpBSMM)... – errordeveloper 2015-04-07 12:51:38

+5

@errordeveloper:有趣的是,如何使演示时间的40%用于让Kubernetes工作 - - 也代表我的经验。视频中的tl; dr是:PostgreSQL不是为了在没有重新配置的情况下进行水平缩放而构建的,因此它应该是一个pod而不是复制控制器。 – 2015-04-08 08:14:54

+1

确实如此,尽管可以使用预先烘焙的虚拟机映像和其他几个快捷方式进行优化。 – errordeveloper 2015-09-26 01:01:57

回答

0

您可以尝试使用docker-compose或Kubernetes尝试PostDock。目前,我已经在我们的搬运工,撰写项目试了一下,与架构如下图所示:

pgmaster (primary node1) --| 
|- pgslave1 (node2)  --| 
| |- pgslave2 (node3) --|----pgpool (master_slave_mode stream)----client 
|- pgslave3 (node4)  --| 
    |- pgslave4 (node5) --| 

我已经测试了以下场景,他们都工作得很好:

  • 复制:变化在主节点(即主节点)生成的数据将被复制到所有备用节点(即从节点)
  • 故障切换:停止主节点,并且备用节点(例如节点4)将自动接管主要角色。
  • 防止两个主节点:重新生成前一个主节点(node1),node4将继续作为主节点,而node1将同步但作为备用节点。

至于客户端应用程序,这些更改都是透明的。客户端只需指向pgpool节点,并在上述所有情况下都能正常工作。

注意:如果你有问题让PostDock运行,你可以试试my forked version of PostDock

Pgpool-II与看门狗

与上述结构中的一个问题是,pgpool是失败的单个点。所以我也尝试使用委托虚拟IP来启用Watchdog for pgpool-II,以避免单点故障。

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,并在上述所有情况下都能正常工作。

您可以在my GitHub repository on the watchdog branch找到该项目。

相关问题