Postgresql 9.2故障转移

问题描述 投票:4回答:3

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

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

一些细节:

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

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

问题:

  • 从服务器是只读的。如何在故障转移后自动将其设为主(可写)?
  • 如果原来的主人突然再次开始工作并且我们现在有两个主人怎么办?我如何拍摄头部的原始主人?自动。
postgresql streaming replication failover pgpool
3个回答
3
投票

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

如果您遇到pgpool的一些问题,我执行此故障排除的过程可能有所帮助 - pgpool - stracing


1
投票

PGPool-II做到了这一点。

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

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

谢谢你的提示!


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找到这个项目。

© www.soinside.com 2019 - 2024. All rights reserved.