如果您考虑使用基于 Docker 的解决方案,请尝试使用PostDock。
目前我已经在我们的项目中使用 docker-compose 进行了尝试,其架构如下所示:
pgmaster (primary node1) --|
|- pgslave1 (node2) --|
| |- pgslave2 (node3) --|----pgpool (master_slave_mode stream)----client
|- pgslave3 (node4) --|
|- pgslave4 (node5) --|
我已经测试了以下场景,它们都运行良好:
- 复制:在主(即主)节点所做的更改将被复制到所有备用(即从)节点
- Failover:停止主节点,备用节点(如node4)将自动接管主节点。
- 防止两个主节点:复活之前的主节点(node1),node4会继续作为主节点,而node1会同步但作为备用节点。
至于客户端应用程序,这些更改都是透明的。客户端只指向 pgpool 节点,并在上述所有场景中保持正常工作。
注意:如果您在运行 PostDock 时遇到问题,您可以尝试我的 PostDock 分叉版本。
带看门狗的 Pgpool-II
上述架构的一个问题是 pgpool 是单点故障。所以我也尝试使用委托的虚拟IP为pgpool-II启用Watchdog,以避免单点故障。
master (primary node1) --\
|- slave1 (node2) ---\ / pgpool1 (active) \
| |- slave2 (node3) ----|---| |----client
|- slave3 (node4) ---/ \ pgpool2 (standby) /
|- slave4 (node5) --/
我已经测试了以下场景,它们都运行良好:
- 正常情况:两个 pgpool 都启动,虚拟 IP 自动应用于其中一个,在我的例子中是 pgpool1
- 故障转移:关闭 pgpool1。虚拟 IP 将自动应用到 pgpool2,从而变为活动状态。
- 启动失败的 pgpool:重新启动 pgpool1。虚拟 IP 将与 pgpool2 一起保存,而 pgpool1 现在作为备用服务器工作。
至于客户端应用程序,这些更改都是透明的。客户端只是指向虚拟 IP,并在上述所有场景中保持正常工作。
你可以在我的 GitHub 仓库的 watchdog 分支上找到这个项目。