Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里,由 heartbeat 模块实现了这两个功能。下面描述了 heartbeat 模块的可靠消息通信机制,并对其实现原理做了一些介绍。
heartbeat
有这么几个要点:
1、2个网卡,1个用于管理访问用,一个用于做心跳检测。
2、一个额外的IP做第三方仲裁
3、监测脚本。
可能是我只是粗浅的搞了一下这个,认识得不够深,我总觉得heartbeat的浮动IP切换是要整个节点宕掉才能切换,只将服务停掉,浮动IP不会切换,所以要写监测脚本。
开始配置:
H1 :
管理IP:172.16.12.23
心跳检测IP:10.1.1.1
H2 :
管理IP:172.16.12.24
心跳检测IP:10.1.1.2
浮动IP:10.1.1.3
1、 hostname 设置好 一定要写:
主机名:jq-c6-h1,jq-c6-h2
2、 关闭防火墙 iptables -F; 关闭selinux: setenforce 0
3、 hosts文件
[root@jq-c6-h1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.12.24 jq-c6-h2
172.16.12.23 jq-c6-h1
4、 安装epel扩展源:
[root@jq-c6-h1 ~]# yum -y install epel-release
5、 两个机器都安装heartbeat / libnet
[root@jq-c6-h1 ~]# yum install -y heartbeat httpd
准备工作就基本完成了。
主节点上:jq-c6-h1
[root@jq-c6-h1 ~]# cd /usr/share/doc/heartbeat-3.0.4/
//样例文件的目录
[root@jq-c6-h1 heartbeat-3.0.4]# ls
apphbd.cf authkeys AUTHORS ChangeLog COPYING COPYING.LGPL ha.cf haresources README
把这几个文件拷贝到/etc/ha.d目录下。
[root@jq-c6-h1 heartbeat-3.0.4]# cp authkeys ha.cf haresources /etc/ha.d/
修改配置文件:
[root@jq-c6-h1 heartbeat-3.0.4]# cd /etc/ha.d/
authkeys 文件:
这个文件就是认证配置文件
auth 3
#1 crc
#2 sha1 HI!
3 md5 Hello!
该文件主要是用于集群中两个节点的认证,采用的算法和密钥(如果有的话)在集群中节点上必须相同,目前提供了3种算法:md5,sha1和crc。
这里我就用md5了。打开然后这样写就好了。
然后需要改变该文件的权限为600,否则heartbeat启动将失败。
[root@jq-c6-h1 ha.d]# chmod 600 authkeys
haresources 文件:
资源配置文件
#jq-c6-h1 10.1.1.1/24/eth1:0 rpcbind
#jq-c6-h1 10.1.1.1/24/eth1:0 nfs
jq-c6-h1 10.1.1.3/24/eth1:0 httpd
这个配置文件只在最后变加上这1个就好了。
前边是主机名,主节点的主机名,注意是要在主配置文件中node 后有的,并且节点名必须与uname –n
相匹配。
后边的那个 是浮动IP的地址,一定是没被使用的IP。
在后边就是服务了,这里写的服务要在/etc/ha.d/resource.d/
下能找到才行
ha.cf 文件:
heartbeat的主要配置文件
比较好的一点是这里的配置文件都是注释掉的,打开就可以了
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 #启动udp694监听端口(该端口可以修改)
ucast eth1 10.1.1.2 #设定侦听的心跳线的接口和对应的对端接口的IP地址
auto_failback off #不启动抢占模式(主节点死掉,浮动IP切换到从,主节点再启动,浮动IP不切换回主)
node jq-c6-h1 #指定两个节点
node jq-c6-h2
ping 172.16.0.254 #指定一个第三方的仲裁节点
respawn hacluster /usr/lib/heartbeat/ipfail #使用这个脚本去侦听对方是否还活着(使用的是ICMP报文检测)
从节点上:jq-c6-h1
[root@jq-c6-h1 ~]# scp authkeys ha.cf haresources 172.16.12.24:/etc/ha.d/
直接将主节点上的拷贝到从节点上。
修改主配置文件中的,心跳检测IP
[root@jq-c6-h2 ha.d]# vim ha.cf
ucast eth1 10.1.1.1 这个改为主节点的IP
然后启动服务,先主后从。
主
[root@jq-c6-h1 ~]# /etc/init.d/heartbeat start
[root@jq-c6-h1 ~]# chkconfig heartbeat on
从
[root@jq-c6-h2 ~]# /etc/init.d/heartbeat start
[root@jq-c6-h2 ~]# chkconfig heartbeat on
然后主节点上就能出现浮动IP了,就是在haresource里写的那个。
[root@jq-c6-h1 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:47:42:C8
inet addr:172.16.12.23 Bcast:172.16.255.255 Mask:255.255.0.0
eth1 Link encap:Ethernet HWaddr 00:0C:29:47:42:D2
inet addr:10.1.1.1 Bcast:10.1.1.255 Mask:255.255.255.0
eth1:0 Link encap:Ethernet HWaddr 00:0C:29:47:42:D2
inet addr:10.1.1.3 Bcast:10.1.1.255 Mask:255.255.255.0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
然后停掉主:
[root@jq-c6-h1 ~]# /etc/init.d/heartbeat stop
Stopping High-Availability services: Done.
浮动IP跑到从上了。
[root@jq-c6-h2 ha.d]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:DB:7A:22
inet addr:172.16.12.24 Bcast:172.16.255.255 Mask:255.255.0.0
eth1 Link encap:Ethernet HWaddr 00:0C:29:DB:7A:2C
inet addr:10.1.1.2 Bcast:10.1.255.255 Mask:255.255.0.0
eth1:0 Link encap:Ethernet HWaddr 00:0C:29:DB:7A:2C
inet addr:10.1.1.3 Bcast:10.1.255.255 Mask:255.255.255.0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
监测脚本,因为heartbeat不能直接运行脚本,我曾经试过直接在ha.cf中引入我写的脚本但是并不执行。
监测脚本
#!/bin/bash
while true
do
curl 172.16.12.24 &> /dev/null
if [ $? -eq 0 ]
then
exit 0
else
/etc/init.d/heartbeat stop &> /dev/null
exit 1
fi
done
很简单直接写个死循环在后台一直运行,一直检测,健康性。