PostgreSQL 9.2故障转移

4

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

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

一些细节:

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

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

问题:

  • 从服务器是只读的。如何在故障切换后自动使其成为主服务器(可写)?
  • 如果原主服务器突然重新起作用,现在我们有两个主服务器怎么办?如何自动地"杀死"原主服务器?

主服务器失效并切换到从服务器后,您该怎么做?如何恢复主服务器并使其重新成为主服务器,还是它只能成为从服务器? - Michał Maciej Gałuszka
3个回答

3
我建议查看带有failover_command选项的pgpool。在那里,您可以编写一个小的shell脚本以使从机以读/写模式重新启动。 pgpool 如果您在使用pgpool时遇到问题,可以尝试按照以下流程进行故障排除: pgpool - stracing

1

PGPool-II解决了问题。

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

为了防止主服务器突然重新启动,我将使用两个配置文件(一个用于主服务器,一个用于从服务器)来扩展应用程序服务器,并扩展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正常运行,可以尝试我的PostDock分支版本

带看门狗的Pgpool-II

上述架构的问题在于pgpool是单点故障。因此,我还尝试使用委派虚拟IP启用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,在所有上述情况下都可以正常工作。

您可以在我的GitHub存储库中的看门狗分支找到此项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接