【问题标题】:Postgresql 9.2 failoverPostgresql 9.2 故障转移
【发布时间】:2013-10-27 08:19:28
【问题描述】:

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

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

一些细节:

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

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

问题:

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

【问题讨论】:

  • master出现故障,系统切换到slave后怎么办?如何恢复 master 并使其再次成为 master 或者它只是成为 slave?

标签: postgresql streaming replication failover pgpool


【解决方案1】:

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

如果您遇到 pgpool 的一些问题,我按照这个过程进行故障排除可能会有所帮助 - pgpool - stracing

【讨论】:

    【解决方案2】:

    PGPool-II 成功了。

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

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

    感谢您的提示!

    【讨论】:

      【解决方案3】:

      如果您考虑使用基于 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

      上述架构的一个问题是 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,从而激活。
      • 启动失败的 pgpool:重新启动 pgpool1。虚拟 IP 将与 pgpool2 一起保存,而 pgpool1 现在作为备用服务器工作。

      对于客户端应用程序,这些更改都是透明的。客户端只需指向虚拟 IP,在上述所有场景中都能正常工作。

      你可以在my GitHub repository on the watchdog branch找到这个项目。

      【讨论】:

        猜你喜欢
        • 2011-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        相关资源
        最近更新 更多