PostgreSQL 故障转移 - 我应该使用哪些工具?

win*_*ino 8 postgresql replication failover

这是场景:

有两台机器运行 CentOS 6.2 - machine0 和 machine1

两者都安装了 PostgreSQL 9.1。

其中一个应该是活动的,作为主系统,并通过异步流复制另一台机器,备用系统应该将更改从主系统复制到数据库。

假设开始时machine0是master,machine1是standby。

如果 master(比如 machine0)失败(这里的失败意味着 postgresql 服务器崩溃),standby 应该从 master 接管并成为新的 master。

machine1,新的 master 处理所有数据库操作,当 machine0 中的 postgresql 服务器重新联机时,它应该成为备用服务器,从与 machine1 失去联系的点开始同步,并将所有更改复制到数据库并保持备用模式。

当机器 1 失败时,整个循环重复。

当备用服务器出现故障并重新上线时,它应该开始从主服务器读取数据并同步数据。

我很困惑我需要使用什么工具来设置它,因为我知道 PostgreSQL 默认不带有故障转移。

如果有人可以将我链接到描述如何做我正在尝试的主题/页面,我将非常感激。

Rol*_*DBA 5

如果您对同步数据库复制和故障转移感兴趣,我有一个建议。您可以考虑使用两种工具:

  • DRBD(磁盘复制块设备)在两个不同服务器上的磁盘之间提供磁盘级复制(同步)。磁盘更改通过网络复制。对于使用 192.168.xx netblock 的 NIC,最好在 eth2 上使用交叉电缆。

  • ucarp允许在两个不同的服务器之间进行 DBVIP 管理和故障转移。

您可以按如下方式结合使用它们:

  • DBServer1 有 IP 10.1.2.30
  • DBServer2 有 IP 10.1.2.40
  • 数据库 VIP 为 10.1.2.70

在两个不同的服务器上设置 ucarp,这样每个 ucarp 实例都可以通过虚拟路由器 ID 与另一个实例通信

DBServer1 将有

/usr/local/sbin/ucarp -v 200 -p sometagname --interface=eth2 -a 10.1.2.70 -s 10.1.2.30 -b 3 -r 5 --upscript=/usr/local/sbin/vip-up.sh --downscript=/usr/local/sbin/vip-down.sh --neutral -z -B
Run Code Online (Sandbox Code Playgroud)

DBServer2 将有

/usr/local/sbin/ucarp -v 200 -p sometagname --interface=eth2 -a 10.1.2.70 -s 10.1.2.40 -b 4 -r 5 --upscript=/usr/local/sbin/vip-up.sh --downscript=/usr/local/sbin/vip-down.sh --neutral -z -B
Run Code Online (Sandbox Code Playgroud)

-b(广播)在一台服务器上是 3 而在另一台服务器上是 4 的原因是什么?如果两台服务器都重新启动,则 -b 最低的服务器将首先带来 ucarp。至于-r,那是死比率。因此,DBServer1 将在 15 秒 (3X5) 后启动,DBServer2 将在 20 秒 (4X5) 内启动。

假设 DBServer1 崩溃了。DBServer2 上的 ucarp 将在 20 秒内检查 DBServer1 上的 ucarp 握手。如果未检测到任何内容,则 DBServer2 上的 vip-up.sh 脚本将控制 DBVIP。

好的,所有这些仅用于故障转移和 DBVIP 管理。PostgreSQL 数据库呢?令人惊讶的是,PostgreSQL 一次只在一台服务器上运行。拥有 DBVIP 的人应该拥有处于主要状态的 DRBD。这与 vip-up 脚本有关。你是如何编写脚本的?

这是 /usr/local/sbin/vip-down.sh 脚本(概念)

#! /bin/sh
exec 2> /dev/null
/sbin/drbdadm disconnect drbd0
/sbin/drbdadm  primary drbd0 &&
/bin/mount postgres-data-folder /mnt/drbd0
/sbin/ip addr add 10.1.2.70/24 dev eth2
/sbin/service postgres start &&
/usr/local/sbin/vipmon.sh &
touch /tmp/vip-up
Run Code Online (Sandbox Code Playgroud)

这是 /usr/local/sbin/vip-down.sh 脚本(概念)

#! /bin/sh
exec 2> /dev/null
/sbin/service postgres stop
/bin/umount -l  /dev/drbd0
/sbin/drbdadm secondary drbd0
/sbin/ip addr del 10.1.2.70/24 dev eth2
/bin/rm /tmp/vip-up
/usr/bin/killall -9 ucarp
/usr/local/sbin/vip-down.sh
kill `ps auxww | grep vipmon | awk '{print $2}'`
Run Code Online (Sandbox Code Playgroud)

您需要做的就是设置 pg_hba.conf 以确保所有用户都来自 10.1.2.70

本质上,vip-up 执行此序列

  • 让 DRBD 成为主要
  • 在 /dev/drbd0 上挂载 postgres 数据文件夹
  • 启动 postgres
  • 启动 vipmon 进程

相反,vip-down 执行此序列

  • 关闭 postgres
  • 卸载 /dev/drbd0
  • 让 DRBD 成为二级

vipmon.sh 呢?您可以编写脚本以无限循环地检查 postgres 的状态(它正在运行),检查 DRBD 设备(您仍然可以写入帖子数据文件夹)

通过此设置,您在 DRBD 主服务器上有 postgres,在另一个 DBServer(DRBD 辅助服务器)上有 postgres 数据文件夹的磁盘级副本。postgres 未在 DRBD 辅助节点上运行。

当发生故障转移时,您只需要时间让 ucarp 检测到挂载 postgres 数据、启动 postgres 和激活 vipmon 脚本是否安全。

这种设置的好处在于,在发生故障转移时,成为 DRBD 主服务器的 DBServer 应该拥有您发生故障的服务器的 100% 磁盘级副本。因此,启动 postgres 应该使您处于一致的状态。事务日志(在 pg_xlog 中)应该是完整的(减少由于故障转移引起的间歇性)

我希望这些建议有所帮助。虽然我是 MySQL DBA,但我定期在我雇主的网络托管公司使用 MySQL 和 DRBD。我以上述方式安装了 MySQL/DRBD。我曾为使用 PostgreSQL/DRBD 的客户做过一次。它工作得很好。它是开源的。您只需要在学习 DRBD 和 ucarp 时进行尽职调查。这将包括在故障转移后重新连接 DRBD,处理两个数据库服务器都成为主服务器的裂脑场景,以及诸如此类的事情。