Postgresql 9.2故障转移

时间:2013-10-18 13:08:03

标签: postgresql streaming replication failover pgpool

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

我有一个使用master数据库存储数据的Web应用程序。

一些细节:

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

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

问题:

  • 从属服务器是只读的。如何在故障转移后自动将其设为主(可写)?
  • 如果原来的主人突然再次开始工作又有两个主人怎么办?我如何拍摄头部的原始主人?自动。

3 个答案:

答案 0 :(得分:3)

我建议使用failover_command选项查看pgpool。在那里你可以有一个小的shell脚本来在读/写模式下重启slave。 pgpool

如果你遇到pgpool的一些问题,我在排除故障时遵循的这个过程可能会有所帮助 - pgpool - stracing

答案 1 :(得分:1)

PGPool-II做到了这一点。

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

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

感谢您的提示!

答案 2 :(得分:0)

如果您考虑使用基于Docker的解决方案,请尝试PostDock

目前我已经在我们的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时遇到问题,可以尝试my forked version of PostDock

Pgpool-II with Watchdog

上述架构的一个问题是pgpool是单点故障。所以我也尝试使用委派的虚拟IP启用Watchdog for pgpool-II,以避免单点故障。

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,并在所有上述场景中保持良好的工作状态。

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