背景需求:
使用heartbeat来做HA集群,并且把nginx服务作为HA对应的服务。master1为主,另一个是备。
需要在主备上漂移的资源有两个:
VIP和nginx服务
准备两台机器:
master1: 192.168.42.12 10.1.1.1(心跳)
master2: 192.168.42.13 10.1.1.2(心跳)
vip: 192.168.42.14
以下是IP配置:
(上图可以看到没有配置vip:两台机器都不必手动添加vip,交给heartbeat去自动添加即可)
1.以下5步操作在两台机器上完成:
1). /etc/init.d/iptables stop
2). setenforce 0
3). vi /etc/hosts
//增加以下内容
192.168.42.12 master1
192.168.42.13 master2
保存退出
4). 安装epel扩展源:
yum -y install epel-release
5). 安装heartbeat和nginx
yum -y install heartbeat nginx
2.在master1上配置:
cd /usr/share/doc/heartbeat-3.0.4/
cp authkeys ha.cf haresources /etc/ha.d/
cd /etc/ha.d
vi authkeys
auth 3
md5 Hello!
保存退出。
chmod 600 authkeys
vi haresources
//加入如下语句
master1 IPaddr::192.168.42.14/25/eth0:0 nginx
//这里填写需要漂移的资源:VIP和nginx服务。
//设定VIP为192.168.42.14/25,设置在eth0:0接口上,启动VIP时启动NGINX服务,这里的NGINX服务必须是能够直接在/etc/init.d/目录下启动。
保存退出。如下图所示:
vi ha.cf //改为如下内容:
debugfile /var/log/ha-debug
//设定debug文件目录
logfile /var/log/ha-log
//设定日志文件目录
logfacility local0
keepalive 2
//设定检查时间间隔为2s
deadtime 30
//设定死亡时间为30s
warntime 10
//设定告警时间为10s(10s以上没收到对方的回应就报警)
initdead 60
//设定初始化时间为60s
udpport 694
//启动udp监听端口号
ucast eth1 10.1.1.2
//填写对方的心跳网卡及心跳IP
auto_failback on
//启动故障恢复模式(主在恢复正常后会自动接管资源)
node master1
//指定两个节点,主节点必须写在前面
node master2
ping 192.168.42.1
//指定一个第三方的仲裁节点,这里写的是网关
respawn hacluster /usr/lib64/heartbeat/ipfail
//使用这个脚本去侦听对方是否还活着(使用的是ICMP报文检测)
保存退出。如下图所示:
3.把master1上的三个文件复制到master2上:
cd /etc/ha.d
scp authkeys ha.cf haresources root@master2:/etc/ha.d
4.修改master2上的ha.cf文件:
vi /etc/ha.d/ha.cf
ucast eth1 10.1.1.2 ===》 ucast eth1 10.1.1.1
//只改一处即可,填写对方的心跳网卡及心跳IP
保存退出。如下图所示:
5.启动heartbeat:
先主后从。
/etc/init.d/heartbeat start
启动后master1会出现一个eth0:0及VIP,并自动启动nginx;而master2则不会启动eth0:0和nginx。如下图所示:
6.测试:当master1关机后,是否会切换nginx:
可以发现,当master1关机后,master2立即启动了自身的nginx来接管业务。
master1系统重启后,heartbeat恢复工作,自动将nginx开启,如下图所示:
并且VIP已移到master1上:如下图所示:
而此时的master2上的nginx已经被heartbeat关掉了,VIP也没了,如下图所示:
相关日志:
实验操作成功。
另外:当master1上的heartbeat关掉后,master2会自动接管master1上的应用和VIP,而master1的heartbeat恢复工作后,master2上的应用和VIP自动退出,交还给master1。
以手动方式完全释放master1的heartbeart对资源的管理权:
在
master1上执行:
/usr/share/heartbeat/hb_standby
执行后,master1上的资源被释放,master2会立即接管资源。
以手动方式让master1强行接管master2资源管理权:
在
master1上执行:
/usr/share/heartbeat/hb_takeover
执行后,master2上的资源被释放,master1会立即接管资源。
扩展:在主上面的心跳线接口给down掉之后,备上面因为检测不到主还活着,于是自己成为主,启动了虚拟IP接口,接替了主的工作。当把主的心跳线接口up起来之后备主动把虚拟IP交还给主,自己成为备。
然后我将主上面的对外接口给down之后,备因为检测到心跳接口还是正常的,还以为主还活着,于是高可用就失败了。当主把对外接口up之后需要重新启动heartbeat服务才能从备上面把工作接管过来。
由这里可以看出心跳线是至关重要的,心跳线挂了之后将有可能导致脑裂行为的发生(即主和备一起在抢占虚拟IP的控制权),实际环境中最好给心跳线做冗余,使用以太端口捆绑保障心跳线的健壮性。
同时,假如主的对外接口挂了,但是心跳线没有挂,备就无法检测到主挂了,也就无法实现高可用了。