如果您对同步数据库复制和故障转移感兴趣,我有个建议。您可以研究使用两种工具:
您可以将它们结合使用,如下所示:
- 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的裂脑场景,以及类似的事情。