在前一篇文章《使用drbd实现数据实时备份》中我们实现了DRBD数据的实时备份。但这只是保证了数据的安全。如果primary发生了故障,虽然slave上有备份的数据,但slave是无法代替primary来提供服务的。

原因有以下几点(都需要手工操作):
1、slave要升级为primary
2、slave升级为primary后需要被mount
3、slave和primary的IP地址不同
4、如何启动依赖数据的服务(比如mysql,需要挂载drbd分区后才能启动mysql,顺序不能颠倒)
5、尽可能缩短以上4个步骤的时间,保证应用的连续性

以上内容就充分说明了我们需要一个“高可用环境”的必要性,Heartbeat就能帮我们解决以上所有的问题(注1)。下面我们就来使用heartbeat来实现DRBD的高可用性。

实验环境:
根据《使用drbd实现数据实时备份》配置好DRBD
本文是是该文章的后续,用的就是原来的2台测试机。

测试机都使用RHEL5.8的光盘制作yum命令的安装源来安装所依赖的软件包,关于如何使用光盘制作yum源,请参考:
http://blog.chinaunix.net/uid-20346344-id-3264166.html

以下软件包需要下载,可以到CentOS网站下载,保存到/home/share/下:

20346344_1361360327Q0Bv.png
一、安装Heartbeat
mount /dev/hdc /mnt/iso/
yum -y install PyXML openssh-clients iptables ipvsadm telnet
yum -y install perl-Crypt-SSLeay perl-LDAP perl-HTML-Parser
yum -y install perl-libwww-perl perl-Digest-HMAC perl-Net-IP perl-Net-DNS perl-TimeDate
yum -y install pygtk2

cd /home/share
rpm -vih heartbeat-pils-2.1.3-3.el5.centos.i386.rpm
rpm -ivh perl-Data-HexDump-0.02-1.el5.centos.noarch.rpm
rpm -ivh perl-Authen-Radius-0.13-1.el5.centos.noarch.rpm
rpm -ivh perl-Net-IMAP-Simple-1.17-1.el5.centos.noarch.rpm
rpm -ivh perl-Net-IMAP-Simple-SSL-1.3-1.el5.centos.noarch.rpm
rpm -ivh perl-Mail-POP3Client-2.17-1.el5.centos.noarch.rpm
rpm -ivh perl-MailTools-1.77-1.el5.centos.noarch.rpm
rpm -ivh heartbeat-ldirectord-2.1.3-3.el5.centos.i386.rpm
rpm -ivh heartbeat-stonith-2.1.3-3.el5.centos.i386.rpm
rpm -ivh heartbeat-2.1.3-3.el5.centos.i386.rpm
rpm -ivh heartbeat-2.1.3-3.el5.centos.i386.rpm
rpm -ivh heartbeat-gui-2.1.3-3.el5.centos.i386.rpm
rpm -ivh heartbeat-devel-2.1.3-3.el5.centos.i386.rpm

二、安装mysql(注2)
yum -y install mysql mysql-server
service mysqld start
chkconfig mysqld on

三、建立Heartbeat主配置文件(注3)
echo 'logfacility  local0
keepalive  2
deadtime  15
warntime  5
initdead  120
udpport  694
bcast  eth0
watchdog  /dev/watchdog
auto_failback  off
node  server1.vicp.net
node  server2.vicp.net
respawn  hacluster  /usr/lib/heartbeat/ipfail' > /etc/ha.d/ha.cf

四、设置2个节点之间的通信密钥
echo 'auth  3
3  md5  Hello!' > /etc/ha.d/authkeys
chmod 600 /etc/ha.d/authkeys

五、定义资源(注4)
echo 'server1.vicp.net  IPaddr::192.168.10.30/24/eth0:0  drbddisk::db  Filesystem::/dev/drbd0::/mnt/drbd::ext3  mysqld' > /etc/ha.d/haresources

六、复制mysql的启动脚本(注5)
cp /etc/init.d/mysqld /etc/ha.d/resource.d/

七、启动Heartbeat
service heartbeat start
2台主机上的配置过程以及所有的配置文件完全一样。

服务启动后server1上会配置有192.168.10.30的IP。

八、测试
将server1上的heartbeat服务停止,或者直接拔掉server1的网线后:
server1上的192.168.10.30的IP被释放,mysql服务会被停止,drbd分区会被unmount掉,并自动变为slave。

server2上的drbd分区会自动变为primary,并mount到指定目录,然后启动mysql服务,并将192.168.10.30的IP地址分配到本机的eth0:0上。

在Server1的heartbeat重新启动,或者接上网线后,Server1会成为Slave,Server2继续承担primary的角色。如果非要Server1成为primary可以在server1上用/usr/share/heartbeat/目录下的命令强制成为primary。


注1:事实上Heartbeat完成其中的一部分,有些功能是heartbeat调用了其他的软件,因为用rpm安装heartbeat时的依赖性已经解决了这个问题,这里就不再赘述了。

注2:mysql似乎和这篇文章无关,其实如果将mysql数据库文件存放在/mnt/drbd/目录下,就和本文有关了。因为要挂载drbd分区后才能启动mysql。

注3:Heartbeat的主配置文件请参考,http://www.mjwdj.com/read.php?1159

注4:Heartbeat的资源配置文件请参考,http://www.mjwdj.com/read.php?1159
也可以写成(这是参考网上文章编辑的,实测是可用的,语法我不是很理解,请参考官方文档):
#echo 'server1.vicp.net drbddisk Filesystem::/dev/drbd0::/mnt/drbd::ext3 192.168.10.30 mysqld' > /etc/ha.d/haresources

注5:请参考Heartbeat的资源配置文件,该文件是资源文件中定义的服务,需要复制到Heartbeat的资源目录下。