一、简介
heartbeat最后一个v2版本是2.1.4,可以使用v1版本的haresource和crm,本实验以haresource为crm来讲解WEB的HA,haresource是不支持资源的监控操作,因此当资源出现了挂起,异常问题时不会导致heartbeat资源的转移,就存在问题,因此需要切合其他方式来实现资源的健康控制,这边我使用自己写得脚本的SHELL脚本来实现。
二、拓扑
三、配置
0、 HA前提:
1.时间同步(心跳信息要时刻一致)
utpdate .....
2.主机名通信(ha当中的心跳信息的传递是通过主机名解析得来)
uname -n 与/etc/hosts当中的一致
3.ssh互信 (当heartbeat出现问题的时候,通过ssh来自动完成资源的转移操作)
1、说明:
rhel5当中的heartbeat软件包可以从epel当中下载或者源代码编译,rhel6开始已自带
heartbeat的主要文件如下:
/etc/ha.d/authkeys #心跳信息认证 ha.cf #message line心跳信息的配置参数 haresource #v1版本的crm /usr/share/heartbeat/ #很多可执行的程序 hb_standy #当前节点切换为备份节点 hb_takeover #抢回资源,变为主节点 hb_delnode #删除节点
2、配置authkeys,认证信息
#chmod 600 /etc/ha.d/authkeys #openssl rand -base64 16 >> /etc/ha.d/authkeys # tail -5 /etc/ha.d/authkeys
3.配置ha.cf,心跳参数
.............. #debugfile /var/log/ha-debug #调试日志位置 #logfile /var/log/ha-log #日志记录在本地文件位置 #logfacility local0 #通过syslog记录日志(同上,2选1即可) #keepalive 2 #每2s发送一次心跳包 #deadtime 30 #死亡时间 #warntime 10 #警告时间 #initdead 120 #初始化死亡时间 udpport 694 #进程监听udp 694端口 #baud 19200 #波特率19200,使用com口才使用的配置,一般不用 # serial serialportname ... #serial /dev/ttyS0 # Linux #serial /dev/cuaa0 # FreeBSD #serial /dev/cuad0 # FreeBSD 6.x #serial /dev/cua/a # Solaris #--------------------------------------------------- bcast eth1 # Linux #在eth1口使用广播传递心跳信息 #bcast eth1 eth2 # Linux #bcast le0 # Solaris #bcast le1 le2 # Solaris #mcast eth0 225.0.0.1 694 1 0 # #ucast eth0 192.168.1.2 auto_failback off #node ken3 node node1.yu.com #节点1 node node2.yu.com #节点2 ping 192.168.192.1 #pingnode节点为192.168.192.1 #ping_group group1 10.10.10.254 10.10.10.253 .......
4.配置资源
node1.yu.com 192.168.192.222/24/eth0 httpd #默认在node1节点启动vip和http服务
5.HA测试
6.添加额外脚本实现资源监控
此时,HA即可实现,关闭heartbeat也能实现切换,但是如果vip 或者httpd进程异常,那么heartbeat是不会现在资源转移的,也就是说heartbeat是不会监控vip和httpd的健康状态,因此为了实现httpd异常时,也能保证HA,这边我使用一个简单地脚本来实现,如下:
[root@node1 html]# cat /etc/ha.d/1.sh #!/bin/bash # vip="192.168.192.222"; while true; do ip addr show | grep $vip > /dev/null ip_num=$? nc 127.0.0.1 80 -z > /dev/null port_return=$? if [ $ip_num -eq 0 ] && [ $port_return -eq 0 ] ;then let num=0 elif [ $ip_num -eq 0 ] && [ $port_return -ne 0 ];then let num++ elif [ $ip_num -ne 0 ] && [ $port_return -eq 0 ];then let num++ elif [ $ip_num -ne 0 ] && [ $port_return -ne 0 ];then let num=0 fi sleep 1 if [ $num -gt 2 ]; then service heartbeat stop > /dev/null fi done ###大致的过程如下,判断当前的节点是否有vip或者httpd进程,当一个为0一个非为0即表示存在问题的资源,这个时候休眠2s,然后再执行一次,如果还是一样的问题,则关闭当前节点的heartbeat的服务,实现切换和资源的转移。
将1.sh加入到heartbeat的启动脚本中,随着heartbeat启动和关闭:
编辑/etc/init.d/heartbeat在start和stop处修改为如下:
start) StartLogd RunStartStop pre-start StartHA RC=$? Echo if [ $RC -eq 0 ] then [ ! -d $LOCKDIR ] && mkdir -p $LOCKDIR touch $LOCKDIR/$SUBSYS fi RunStartStop post-start $RC /etc/ha.d/1.sh & ##让1.sh也在后台实时操作 ;; stop) RunStartStop "pre-stop" StopHA RC=$? Echo if [ $RC -eq 0 ] then rm -f $LOCKDIR/$SUBSYS fi RunStartStop post-stop $RC StopLogd pkill 1.sh ##杀掉1.sh的进程 ;; restart) sleeptime=`ha_parameter deadtime` StopHA pkill 1.sh Echo EchoNoNl Waiting to allow resource takeover to complete: sleep $sleeptime sleep 10 # allow resource takeover to complete (hopefully). echo_success Echo StartHA /etc/ha.d/1.sh & Echo ;;
此时vip或者httpd的进程出现问题都可以实现资源的转移。