4

我已经设置了从主数据库到从数据库的流复制。如果 master 关闭,slave 将接管。复制和故障转移工作正常。

我有一个使用主数据库存储数据的网络应用程序。

一些细节:

  • 两台服务器都运行 Centos 6.4 和 Postgres 9.2。
  • 使用 Postgres 内置复制设置从主到从的流复制。
  • 故障转移由 Postgresql JDBC 驱动程序 (v9.2-1003) 通过在连接字符串中指定主/从来处理。

我想继续使用这种复制方法。

问题:

  • 从服务器是只读的。如何在故障转移后自动使其成为主控(可写)?
  • 如果原来的 master 突然又开始工作了,我们现在有两个 master 怎么办?怎么才能拍到原主的脑袋?自动地。
4

3 回答 3

3

我建议使用 failover_command 选项查看 pgpool。在那里,您可以有一个小的 shell 脚本以读/写模式重新启动从站。 pgpool

如果您遇到 pgpool 的一些问题,我遵循的这个过程可能会有所帮助 - pgpool - stracing

于 2013-11-06T11:43:20.680 回答
1

PGPool-II 做到了。

我在第三台服务器上安装了 PGPool;一个同样运行 CentOS 的监控服务器。我将运行状况检查配置为每 10 秒运行一次。failover_command 设置为运行一个小的 shell 脚本,如果主服务器发生故障,该脚本会在从属服务器上生成一个触发文件。它工作得很好。

为了防止主服务器突然重新启动,我将为应用服务器使用两个配置文件(一个用于主服务器,一个用于从服务器)并扩展 shell 脚本以使用从配置重新启动应用服务器。

谢谢你的提示!

于 2013-11-12T14:19:30.810 回答
0

如果您考虑使用基于 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 分支上找到这个项目。

于 2017-12-14T13:36:55.903 回答