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


8

这是场景:

有两台运行CentOS 6.2的计算机-machine0和machine1

两者都安装了PostgreSQL 9.1。

其中一个应处于活动状态,作为主系统,并且通过异步流复制另一台计算机,备用数据库应将更改从主系统复制到数据库。

假设机器0是主服务器,机器1是备用服务器。

如果主服务器(例如machine0)发生故障(此处的失败表示Postgresql服务器崩溃),则备用服务器应从主服务器接管并成为新的主服务器。

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

当machine1发生故障时,整个循环将重复。

当备用数据库发生故障并重新联机时,它应该开始从主数据库读取数据并同步数据。

我对需要使用哪些工具进行设置感到困惑,因为我了解PostgreSQL默认情况下没有故障转移。

如果有人可以将我链接到描述如何做我想做的事情的线程/页面,我将非常感激。


我无法ping VIP时遇到UCARP问题

您是否有使用CentO配置UCARP的解决方案

不知道你是否成功,你想要什么,但这里有你想要的东西了几步步的HOWTO:howtoforge.com/... library.linode.com/linux-ha/...希望这有助于。
Dragan Matic

Answers:


5

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

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

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

您可以将它们结合使用,如下所示:

  • DBServer1具有IP 10.1.2.30
  • DBServer2具有IP 10.1.2.40
  • DB 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

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

-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

这是/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}'`

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

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

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

相反,vip-down执行此序列

  • 关闭postgres
  • unount / dev / drbd0
  • 让DRBD成为辅助

那vipmon.sh呢?您可以编写脚本来无限期地检查postgres的状态(它正在运行),检查DRBD设备(您是否仍可以写入posts数据文件夹)

使用此设置,您在DRBD Primary上具有postgres,而在另一个DBServer(DRBD Secondary)上具有postgres数据文件夹的磁盘级副本。postgres不在DRBD Secondary上运行。

当发生故障转移时,您只需要时间ucarp就可以安全地安装postgres数据,启动postgres并启用vipmon脚本。

此设置的优点在于,在发生故障转移的情况下,成为DRBD主服务器的DBServer应该具有100%磁盘级别的故障服务器副本。因此,启动postgres应该使您处于一致状态。事务日志(在pg_xlog中)应该完好无损(由于故障转移而导致的间歇性)

希望这些建议对您有所帮助。尽管我是MySQL DBA,但我经常在雇主的网络托管公司使用MySQL和DRBD。我以上述方式安装了MySQL / DRBD。我曾经为使用PostgreSQL / DRBD的客户端执行此操作。效果很好。它是开源的。您只需要在学习DRBD和ucarp中进行尽职调查即可。这将包括在故障转移后重新连接DRBD,处理两个DB Server都成为Primary的裂脑场景,以及类似的事情。


更新:快速访问DRBD的网站并进行一些阅读已经回答了我的上述问题。您提到的设置似乎是完美的工具。如果您将我链接到上面的一些不错的课程/教程,我仍然会很感激,因为我打算在周末学习:)
wingedrhino 2012年

嗨,如果只有postgres服务器(服务)发生故障,这不会考虑在内。该计算机仍处于运行状态并具有虚拟IP,但是该服务未在该计算机上运行。
GypsyCosmonaut
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.