2013-10-18 171 views
4

我已经建立了从主数据库到从数据库的流式复制。如果主人关闭,奴隶将接管。复制和故障转移工作正常。Postgresql 9.2故障转移

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

一些细节:

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

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

的问题:

  • 从属服务器是只读的。如何在故障转移后自动将它作为主(可写)?
  • 如果原来的主人突然重新开始工作,我们现在有两个主人?我怎样才能在头部拍摄原来的主人?自动。
+0

在主站发生故障并且系统切换到从服务器后,您会做什么?你如何恢复主人并使其重新掌握或者它只是成为奴隶? –

回答

3

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

在您运行与pgpool一些问题的情况下,这个过程,我也跟着来解决可能会帮助 - pgpool - stracing

1

PGPool-II的伎俩。

我在第三台服务器上安装了PGPool;一台运行CentOS的监控服务器。我将健康检查配置为每10秒运行一次。 failover_command被设置为运行一个小的shell脚本,如果主服务器发生故障,它将在从服务器上生成一个触发文件。它的工作完美。

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

感谢您的提示!

0

PostDock试试,如果你会考虑基于Docker的解决方案。

目前我已经在我们的搬运工,撰写项目试了一下,与架构如下图所示:

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与看门狗

与上述结构中的一个问题是,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找到该项目。