heartbeat的概念
   Linux-HA的全称是High-Availability Linux,它是一个开源项目,这个开源项目的目标是:通过社区开发者的共同努力,提供一个增强linux可靠性(reliability)、可用性(availability)和可服务性(serviceability)(RAS)的群集解决方案。其中Heartbeat就是Linux-HA项目中的一个组件,也是目前开源HA项目中最成功的一个例子,它提供了所有 HA 软件所需要的基本功能,比如心跳检测和资源接管、监测群集中的系统服务、在群集中的节点间转移共享 IP 地址的所有者等,自1999年开始到现在,Heartbeat在行业内得到了广泛的应用,也发行了很多的版本,可以从Linux-HA的官方网站www.linux-ha.org下载到Heartbeat的最新版本。 
HA集群中的相关术语
1.节点(node)
   运行heartbeat进程的一个独立主机,称为节点,节点是HA的核心组成部分,每个节点上运行着操作系统和heartbeat软件服务,在heartbeat集群中,节点有主次之分,分别称为主节点和备用/备份节点,每个节点拥有唯一的主机名,并且拥有属于自己的一组资源,例如,磁盘、文件系统、网络地址和应用服务等。主节点上一般运行着一个或多个应用服务。而备用节点一般处于监控状态。
2.资源(resource)
   资源是一个节点可以控制的实体,并且当节点发生故障时,这些资源能够被其它节点接管,heartbeat中,可以当做资源的实体有:
  磁盘分区、文件系统
  IP地址
  应用程序服务
  NFS文件系统
3.事件(event)
   也就是集群中可能发生的事情,例如节点系统故障、网络连通故障、网卡故障、应用程序故障等。这些事件都会导致节点的资源发生转移,HA的测试也是基于这些事件来进行的。
4.动作(action)
   事件发生时HA的响应方式,动作是由shell脚步控制的,例如,当某个节点发生故障后,备份节点将通过事先设定好的执行脚本进行服务的关闭或启动。进而接管故障节点的资源。

Heartbeat的组成与原理
1.Heartbeat的组成
Heartbeat提供了高可用集群最基本的功能,例如,节点间的内部通信方式、集群合作管理机制、监控工具和失效切换功能等等,目前的最新版本是Heartbeat2.x,这里的讲述也是以Heartbeat2.x为主,下面介绍Heartbeat2.0的内部组成,主要分为以下几大部分:
  heartbeat: 节点间通信检测模块
  ha-logd: 集群事件日志服务
  CCM(Consensus Cluster Membership):集群成员一致性管理模块
  LRM (Local Resource Manager):本地资源管理模块
  Stonith Daemon: 使出现问题的节点从集群环境中脱离
  CRM(Cluster resource management):集群资源管理模块
  Cluster policy engine: 集群策略引擎
  Cluster transition engine:集群转移引擎
图1显示了Heartbeat2.0内部结构组成:

 

Heartbeat仅仅是个HA软件,它仅能完成心跳监控和资源接管,不会监视它控制的资源或应用程序,要监控资源和应用程序是否运行正常,必须使用第三方的插件,例如ipfail、Mon、Ldirector等。Heartbeat自身包含了几个插件,分别是ipfail、Stonith和Ldirectord,介绍如下:
  ipfail的功能直接包含在Heartbeat里面,主要用于检测网络故障,并作出合理的反应,为了实现这个功能,ipfail使用ping节点或者ping节点组来检测网络连接是否出现故障,从而及时的做出转移措施。
  Stonith插件可以在一个没有响应的节点恢复后,合理接管集群服务资源,防止数据冲突,当一个节点失效后,会从集群中删除,如果不使用Stonith插件,那么失效的节点可能会导致集群服务在多于一个节点运行,从而造成数据冲突甚至是系统崩溃。因此,使用Stonith插件可以保证共享存储环境中的数据完整性。
  Ldirector是一个监控集群服务节点运行状态的插件。Ldirector如果监控到集群节点中某个服务出现故障,就屏蔽此节点的对外连接功能,同时将后续请求转移到正常的节点提供服务,这个插件经常用在LVS负载均衡集群中,关于Ldirector插件的使用,将在后续章节详细讲述。
    同样,对于操作系统自身出现的问题,Heartbeat也无法监控,如果主节点操作系统挂起,一方面可能导致服务中断,另一方面由于主节点资源无法释放,而备份节点却接管了主节点的资源,此时就发生了两个节点同时争用一个资源的状况。针对这个问题,就需要在linux内核中启用一个叫watchdog的模块,watchdog是一个Linux内核模块,它通过定时向/dev/watchdog设备文件执行写操作,从而确定系统是否正常运行,如果watchdog认为内核挂起,就会重新启动系统,进而释放节点资源。在linux中完成watchdog功能的软件叫softdog,softdog维护一个内部计时器,此计时器在一个进程写入/dev/watchdog设备文件时更新,如果softdog没有看到进程写入/dev/watchdog文件,就认为内核可能出了故障。watchdog超时周期默认是一分钟,可以通过将watchdog集成到Heartbeat中,从而通过Heartbeat来监控系统是否正常运行。
2.Heartbeat的工作原理
从图18.1可以看出,heartbeat内部结构有三大部分组成。
    集群成员一致性管理模块(CCM)用于管理集群节点成员,同时管理成员之间的关系和节点间资源的分配,heartbeat模块负责检测主次节点的运行状态,以决定节点是否失效。ha-logd模块用于记录集群中所有模块和服务的运行信息。
本地资源管理器(LRM)负责本地资源的启动,停止和监控,一般由LRM守护进程lrmd和节点监控进程(Stonith Daemon)组成,lrmd守护进程负责节点间的通信,Stonith Daemon通常是一个Fence设备,主要用于监控节点状态,当一个节点出现问题时处于正常状态的节点会通过Fence设备将其重启或关机以释放IP、磁盘等资源,始终保持资源被一个节点拥有,防止资源争用的发生。
    集群资源管理模块(CRM)用于处理节点和资源之间的依赖关系,同时,管理节点对资源的使用,一般由CRM守护进程crmd、集群策略引擎和集群转移引擎三个部分组成,集群策略引擎(Cluster policy engine)具体实施这些管理和依赖,集群转移引擎(Cluster transition engine)监控CRM模块的状态,当一个节点出现故障时,负责协调另一个节点上的进程进行合理的资源接管。
    在Heartbeat集群中,最核心的是heartbeat模块的心跳监测部分和集群资源管理模块的资源接管部分,心跳监测一般由串行接口通过串口线来实现,两个节点之间通过串口线相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未受到对方发送的报文,那么就认为对方失效,这时资源接管模块将启动,用来接管运行在对方主机上的资源或者服务。
图2是一个Heartbeat集群的一般拓扑图,在实际应用中,由于节点的数目、网络结构、磁盘类型配置的不同,拓扑结构可能会有不同。

安装heartbeat前的准备
1.Heartbeat集群必须的硬件
从图18.2可以看出,构建一个Heartbeat集群系统必须的硬件设备有:
  节点服务器
  网络和网卡
  共享磁盘
(1)节点服务器
    安装Heartbeat至少需要两台主机,并且对主机的要求不高,普通的PC 服务器即可满足要求,当然,也可以在虚拟机上安装Heartbeat,现在Heartbeat可以很好的运行在Linux系统下,很多linux发行版本都自带了Heartbeat套件,同时,还可以运行在FreeBSD 和 Solaris操作系统上。
(2)网卡和网络
    Heartbeat集群中的每个主机必须有一块网卡和一个空闲串口,网卡用于连接公用网络,串口可以通过串口线,例如modem电线来实现连接,用于心跳监控节点间的状态,如果没有空闲串口的话,每个主机也可以通过两块网卡来实现HA,其中一块网卡用于连接公用网络,另一块网卡通过以太网交叉线与两个节点相连接。
   需要说明的是:以太网交叉线和串口电线都能用于心跳监控,串口电线传输Heartbeat信号相对较好,如有条件,尽量使用串口线代替以太网交叉线作为节点间的心跳检测设备。
Heartbeat支持三种类型的网络,公用网络(public network)、私用网络(private network)和串行网络(serial network)。
    公用网络连接多个节点,并且允许客户端访问集群中的服务节点,私用网络提供两个节点之间点到点的访问,但是不允许客户端访问,可以通过以太网交叉线构建一个私用网络,以供节点间相互通信,串行网络也是一个点到点的连接,一般使用串行网络来传输控制信息和心跳监控。串行网络可以是一条RS232串口线。
(3)共享磁盘
    共享磁盘是一个数据存储设备,HA集群中的所有节点都需要连接到这个存储设备上,在这个共享的存储设备上一般放置的是公用的、关键的数据和程序,一方面可以共享数据给所有节点使用,另一方面也保证了数据的安全性。
    Heartbeat支持两种对共享磁盘的访问方式:独占访问和共享访问,在独占访问方式下,保持活动的节点独立使用磁盘设备,只有当活动节点释放了磁盘设备,其它节点才能接管磁盘进行使用,在共享访问方式下,集群所有节点都可以同时使用磁盘设备,当某个节点出现故障时,其它节点无需接管磁盘。共享访问方式需要集群文件系统的支持,这一点将在下个章节讲述。
2.操作系统规划
    这里统一采用Red Hat Enterprise Linux Server release 5.1操作系统,每个节点服务器都有两块网卡,一块用作连接公用网络,另一块通过以太网交叉线连接两个节点,作为心跳监控。共享磁盘由一个磁盘阵列设备提供,两个节点共享一个磁盘分区。磁盘分区对应的硬件标识为/dev/sdb5,挂载点为/webdata,文件系统类型为ext3。
网络以及IP地址规划如表18.1所示:
表18.1
节点类型        IP地址规划               主机名        类型
主用节点        eth0:192.168.60.132        node1         Public IP
               eth1:10.1.1.1             priv1         private IP
               eth0:0:192.168.60.200        无         Virtual IP
备用节点        eth0:192.168.60.133        node2         Public IP
               eth1:10.1.1.2             priv1         private IP
    从上表可知,eth0网络设备用于连接公用网络,eth1网络设备用于连接私用网络,而eth0:0网络设备是HA集群虚拟出来的服务IP地址,用于对外提供应用程序服务。基本的拓扑结构如图3所示:

接着配置每个节点的/etc/hosts文件,保证两个节点内容一致,/etc/hosts文件内容如下:
[root@node1 ~]#more /etc/hosts
192.168.60.132         node1
192.168.60.133         node2
10.1.1.1                      priv1
10.1.1.2                   priv1
        一切准备就绪,接下来开始安装heartbeat。
安装heartbeat
1.获取heartbeat
   Heartbeat到目前为止发行了两个主版本,Heartbeat1.x和Heartbeat2.x,Heartbeat1.x仅仅允许创建2个节点的集群,提供基本的高可用性failover服务。Heartbeat2.x提供了增强的特性,允许创建多个节点的集群,又支持模块结构的配置方法-集群资源管理器(Cluster Rescource Manager-CRM),CRM可以支持最多16个节点,这里我们选择heartbeat2.0.8版本进行介绍。
Heartbeat的下载地址为:http://linux-ha.org/download/index.html,找到heartbeat2.0.8版本,下载类似heartbeat-2.0.8.tar.gz的源代码包即可。此外在安装heartbeat时需要同时安装libnet工具包,Libnet是一个高层次的API工具,可以从http://www.packetfactory.net/libnet/下载到,现在的稳定版本是1.1.2.1,下载后的包名为libnet.tar.gz。
2.安装heartbeat
    接下来需要在两个节点安装heartbeat,安装过程很简单,只需解压编译、安装即可,这里不再详述,在两个节点执行相同的操作,下面是在node1上的安装过程:
[root@node1 ~]#tar -zxvf libnet.tar.gz 
[root@node1 ~]#cd libnet
[root@node1 ~/libnet]#./configure
[root@node1 ~/libnet]#make 
[root@node1 ~/libnet]#make install
[root@node1 ~]#tar zxf heartbeat-2.0.8.tar.gz
[root@node1 ~]#cd heartbeat-2.0.8
[root@node1 ~/heartbeat-2.0.8]#./ConfigureMe configure \
> --disable-swig --disable-snmp-subagent
[root@node1 ~/heartbeat-2.0.8]#make
[root@node1 ~/heartbeat-2.0.8]#make install
[root@node1 ~/heartbeat-2.0.8]#cp doc/ha.cf doc/haresources doc/authkeys /etc/ha.d/
[root@node1 ~/heartbeat-2.0.8]#cp ldirectord/ldirectord.cf /etc/ha.d/
[root@node1 ~/heartbeat-2.0.8]#groupadd -g 694 haclient
[root@node1 ~/heartbeat-2.0.8]#useradd -u 694 -g haclient hacluster
配置heartbeat
配置主节点的heartbeat 
    Heartbeat的主要配置文件有ha.cf、haresources、authkeys,在Heartbeat安装后,默认并没有这三个文件,可以从官方网站下载得到,也可以直接从解压的源码目录中找到,在上面的安装过程中,我们已经将这三个文件放到了/etc/ha.d目录下,下面分别详细介绍。
1.主配置文件(/etc/ha.d/ha.cf)
下面对ha.cf文件的每个选项进行详细介绍,其中“#”号后面的内容是对选项的注释说明。
#debugfile /var/log/ha-debug
logfile /var/log/ha-log         #指名heartbeat的日志存放位置
#crm yes                     #是否开启Cluster Resource Manager(集群资源管理)功能
bcast eth1                  #指明心跳方式使用以太广播方式,并且是在eth1接口上进行广播
keepalive 2                 #指定心跳间隔时间为2秒(即每两秒钟在eth1上发送一次广播)
deadtime 30              #指定备用节点在30秒内没有收到主节点的心跳信号后,则立即接管主节点的服务资源
warntime 10              #指定心跳延迟的时间为十秒。当10秒钟内备份节点不能接收到主节点的心跳信号时,就会往日志中写入一个警告日志,但此时不会切换服务。
initdead 120             #在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。 
udpport 694                        #设置广播通信使用的端口,694为默认使用的端口号
baud 19200                         #设置串行通信的波特率。
#serial /dev/ttyS0          #选择串行通信设备,用于双机使用串口线连接的情况。如果双机使用以太网连接,则应该关闭该选项。
auto_failback on        #用来定义当主节点恢复后,是否将服务自动切回,heartbeat的两台主机分别为主节点和备份节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给备份节点并由备份节点运行服务。在该选项设为on的情况下,一旦主节点恢复运行,则自动获取资源并取代备份节点,如果该选项设置为off,那么当主节点恢复后,将变为备份节点,而原来的备份节点成为主节点。
#stonith baytech /etc/ha.d/conf/stonith.baytech          # stonith的主要作用是使出现问题的节点从集群环境中脱离,进而释放集群资源,避免两个节点争用一个资源的情形发生。保证共享数据的安全性和完整性。

#watchdog /dev/watchdog        #该选项是可选配置,是通过Heartbeat来监控系统的运行状态。使用该特性,需要在内核中载入"softdog"内核模块,用来生成实际的设备文件,如果系统中没有这个内核模块,就需要指定此模块,重新编译内核。编译完成输入"insmod softdog"加载该模块。然后输入"grep misc /proc/devices"(应为10),输入"cat /proc/misc |grep watchdog"(应为130)。最后,生成设备文件:"mknod /dev/watchdog c 10 130" 。即可使用此功能。
node node1                          #主节点主机名,可以通过命令“uanme –n”查看。
node node2                          #备用节点主机名。
ping 192.168.60.1            #选择ping的节点,ping 节点选择的越好,HA集群就越强壮,可以选择固定的路由器作为ping节点,但是最好不要选择集群中的成员作为ping节点,ping节点仅仅用来测试网络连接。

respawn hacluster /usr/lib/heartbeat/ipfail        #该选项是可选配置,列出与heartbeat一起启动和关闭的进程,该进程一般是和heartbeat集成的插件,这些进程遇到故障可以自动重新启动。最常用的进程是ipfail,此进程用于检测和处理网络故障,需要配合ping语句指定的ping node来检测网络的连通性。其中hacluster表示启动ipfail进程的身份。
2.资源文件(/etc/ha.d/haresources)
    Haresources文件用于指定双机系统的主节点、集群IP、子网掩码、广播地址以及启动的服务等集群资源,文件每一行可以包含一个或多个资源脚本名,资源之间使用空格隔开,参数之间使用两个冒号隔开,在两个HA节点上该文件必须完全一致,此文件的一般格式为:
node-name network  <resource-group>
node-name表示主节点的主机名,必须和ha.cf文件中指定的节点名一致,network用于设定集群的IP地址、子网掩码、网络设备标识等,需要注意的是,这里指定的IP地址就是集群对外服务的IP地址,resource-group用来指定需要heartbeat托管的服务,也就是这些服务可以由heartbeat来启动和关闭,如果要托管这些服务,必须将服务写成可以通过start/stop来启动和关闭的脚步,然后放到/etc/init.d/或者/etc/ha.d/resource.d/目录下,heartbeat会根据脚本的名称自动去/etc/init.d或者/etc/ha.d/resource.d/目录下找到相应脚步进行启动或关闭操作。
下面对配置方法进行具体说明:
node1 IPaddr::192.168.60.200/24/eth0/  Filesystem::/dev/sdb5::/webdata::ext3  httpd tomcat
其中,node1是HA集群的主节点,IPaddr为heartbeat自带的一个执行脚步,heartbeat首先将执行/etc/ha.d/resource.d/IPaddr 192.168.60.200/24 start的操作,也就是虚拟出一个子网掩码为255.255.255.0,IP为192.168.60.200的地址,此IP为heartbeat对外提供服务的网络地址,同时指定此IP使用的网络接口为eth0,接着,heartbeat将执行共享磁盘分区的挂载操作,“Filesystem::/dev/sdb5::/webdata::ext3”相当于在命令行下执行mount操作,即“mount –t ext3 /dev/sdb5 /webdata”,最后依次启动httpd和tomcat服务。
注意:主节点和备份节点中资源文件haresources要完全一样。 
3.认证文件(/etc/ha.d/authkeys)
    authkeys文件用于设定heartbeat的认证方式,共有三种可用的认证方式:crc、md5和sha1,三种认证方式的安全性依次提高,但是占用的系统资源也依次增加。如果heartbeat集群运行在安全的网络上,可以使用crc方式,如果HA每个节点的硬件配置很高,建议使用sha1,这种认证方式安全级别最高,如果是处于网络安全和系统资源之间,可以使用md5认证方式。这里我们使用crc认证方式,设置如下:
auth 1
1 crc
#2 sha1 sha1_any_password
#3 md5 md5_any_password
需要说明的一点是:无论auth后面指定的是什么数字,在下一行必须作为关键字再次出现,例如指定了“auth 6”,下面一定要有一行“6 认证类型”。
最后确保这个文件的权限是600(即-rw-------)。
配置备份节点的heartbeat
   在备份节点上也需要安装heartbeat,安装方式与在主节点安装过程一模一样,这里不再重述,依次安装libnet和heartbeat源码包,安装完毕,在备份节点上使用scp命令把主节点配置文件传输到备份节点。 
    [root@node2 ~]#scp –r node1:/etc/ha.d/*  /etc/ha.d/
其中,node1是主节点的主机名。
设置主节点和备份节点时间同步
    在双机高可用集群中,主节点和备份节点的系统时间也非常重要,因为节点之间的监控都是通过设定时间来实现的,主备节点之间的系统时间相差在十秒以内是正常的,如果节点之间时间相差太大,就有可能造成HA环境的故障。解决时间同步的办法有两个,一个是找一个时间服务器,两个节点通过ntpdate命令定时与时间服务器进行时间校准,另一个办法是让集群中的主节点作为ntp时间服务器,让备份节点定时去主节点进行时间校验。

启动Heartbeat
1.启动主节点的Heartbeat
Heartbeat安装完成后,自动在/etc/init.d目录下生成了启动脚步文件heartbeat,直接输入/etc/init.d/heartbeat可以看到heartbeat脚本的用法,如下所示:
[root@node1 ~]# /etc/init.d/heartbeat  
Usage: /etc/init.d/heartbeat {start|stop|status|restart|reload|force-reload}
因而启动heartbeat可以通过如下命令进行:
[root@node1 ~]#service heartbeat start
或者通过
[root@node1 ~]#/etc/init.d/heartbeat start
这样就启动了主节点的heartbeat服务,为了让heartbeat能在开机自动运行以及关机自动关闭,可以手动创建以下软连接:
[root@node1 ~]#ln -s  /etc/init.d/heartbeat  /etc/rc.d/rc0.d/K05heartbeat
[root@node1 ~]#ln -s  /etc/init.d/heartbeat  /etc/rc.d/rc3.d/S75heartbeat
[root@node1 ~]#ln -s  /etc/init.d/heartbeat  /etc/rc.d/rc5.d/S75heartbeat
[root@node1 ~]#ln -s  /etc/init.d/heartbeat  /etc/rc.d/rc6.d/K05heartbeat
Heartbeat启动时,通过“tail –f /var/log/ messages”查看主节点系统日志信息,输出如下:
[root@node1 ~]# tail -f /var/log/messages
Nov 26 07:52:21 node1 heartbeat: [3688]: info: Configuration validated. Starting heartbeat 2.0.8
Nov 26 07:52:21 node1 heartbeat: [3689]: info: heartbeat: version 2.0.8
Nov 26 07:52:21 node1 heartbeat: [3689]: info: Heartbeat generation: 3
Nov 26 07:52:21 node1 heartbeat: [3689]: info: G_main_add_TriggerHandler: Added signal manual handler
Nov 26 07:52:21 node1 heartbeat: [3689]: info: G_main_add_TriggerHandler: Added signal manual handler
Nov 26 07:52:21 node1 heartbeat: [3689]: info: glib: UDP Broadcast heartbeat started on port 694 (694) interface eth1
Nov 26 07:52:21 node1 heartbeat: [3689]: info: glib: UDP Broadcast heartbeat closed on port 694 interface eth1 - Status: 1
Nov 26 07:52:21 node1 heartbeat: [3689]: info: glib: ping heartbeat started.
Nov 26 07:52:21 node1 heartbeat: [3689]: info: G_main_add_SignalHandler: Added signal handler for signal 17
Nov 26 07:52:21 node1 heartbeat: [3689]: info: Local status now set to: 'up'
Nov 26 07:52:22 node1 heartbeat: [3689]: info: Link node1:eth1 up.
Nov 26 07:52:23 node1 heartbeat: [3689]: info: Link 192.168.60.1:192.168.60.1 up.
Nov 26 07:52:23 node1 heartbeat: [3689]: info: Status update for node 192.168.60.1: status ping
此段日志是Heartbeat在进行初始化配置,例如,heartbeat的心跳时间间隔、UDP广播端口、ping节点的运行状态等,日志信息到这里会暂停,等待120秒之后,heartbeat会继续输出日志,而这个120秒刚好是ha.cf中“initdead”选项的设定时间。此时heartbeat的输出信息如下:
Nov 26 07:54:22 node1 heartbeat: [3689]: WARN: node node2: is dead
Nov 26 07:54:22 node1 heartbeat: [3689]: info: Comm_now_up(): updating status to active
Nov 26 07:54:22 node1 heartbeat: [3689]: info: Local status now set to: 'active'
Nov 26 07:54:22 node1 heartbeat: [3689]: info: Starting child client "/usr/lib/heartbeat/ipfail" (694,694)
Nov 26 07:54:22 node1 heartbeat: [3689]: WARN: No STONITH device configured.
Nov 26 07:54:22 node1 heartbeat: [3689]: WARN: Shared disks are not protected.
Nov 26 07:54:22 node1 heartbeat: [3689]: info: Resources being acquired from node2.
Nov 26 07:54:22 node1 heartbeat: [3712]: info: Starting "/usr/lib/heartbeat/ipfail" as uid 694  gid 694 (pid 3712)
在上面这段日志中,由于node2还没有启动,所以会给出“node2: is dead”的警告信息,接下来启动了heartbeat插件ipfail,由于我们在ha.cf文件中没有配置STONITH,所以日志里也给出了“No STONITH device configured”的警告提示。
继续看下面的日志:
Nov 26 07:54:23 node1 harc[3713]: info: Running /etc/ha.d/rc.d/status status
Nov 26 07:54:23 node1 mach_down[3735]: info: /usr/lib/heartbeat/mach_down: nice_failback: foreign resources acquired
Nov 26 07:54:23 node1 mach_down[3735]: info: mach_down takeover complete for node node2.
Nov 26 07:54:23 node1 heartbeat: [3689]: info: mach_down takeover complete.
Nov 26 07:54:23 node1 heartbeat: [3689]: info: Initial resource acquisition complete (mach_down)
Nov 26 07:54:24 node1 IPaddr[3768]: INFO:  Resource is stopped
Nov 26 07:54:24 node1 heartbeat: [3714]: info: Local Resource acquisition completed.
Nov 26 07:54:24 node1 harc[3815]: info: Running /etc/ha.d/rc.d/ip-request-resp ip-request-resp
Nov 26 07:54:24 node1 ip-request-resp[3815]: received ip-request-resp 192.168.60.200/24/eth0 OK yes
Nov 26 07:54:24 node1 ResourceManager[3830]: info: Acquiring resource group: node1 192.168.60.200/24/eth0 Filesystem::/dev/sdb5::/webdata::ext3
Nov 26 07:54:24 node1 IPaddr[3854]: INFO:  Resource is stopped
Nov 26 07:54:25 node1 ResourceManager[3830]: info: Running /etc/ha.d/resource.d/IPaddr 192.168.60.200/24/eth0 start
Nov 26 07:54:25 node1 IPaddr[3932]: INFO: Using calculated netmask for 192.168.60.200: 255.255.255.0
Nov 26 07:54:25 node1 IPaddr[3932]: DEBUG: Using calculated broadcast for 192.168.60.200: 192.168.60.255
Nov 26 07:54:25 node1 IPaddr[3932]: INFO: eval /sbin/ifconfig eth0:0 192.168.60.200 netmask 255.255.255.0 broadcast 192.168.60.255
Nov 26 07:54:25 node1 avahi-daemon[1854]: Registering new address record for 192.168.60.200 on eth0.
Nov 26 07:54:25 node1 IPaddr[3932]: DEBUG: Sending Gratuitous Arp for 192.168.60.200 on eth0:0 [eth0]
Nov 26 07:54:26 node1 IPaddr[3911]: INFO:  Success
Nov 26 07:54:26 node1 Filesystem[4021]: INFO:  Resource is stopped
Nov 26 07:54:26 node1 ResourceManager[3830]: info: Running /etc/ha.d/resource.d/Filesystem /dev/sdb5 /webdata ext3 start
Nov 26 07:54:26 node1 Filesystem[4062]: INFO: Running start for /dev/sdb5 on /webdata
Nov 26 07:54:26 node1 kernel: kjournald starting.  Commit interval 5 seconds
Nov 26 07:54:26 node1 kernel: EXT3 FS on sdb5, internal journal
Nov 26 07:54:26 node1 kernel: EXT3-fs: mounted filesystem with ordered data mode.
Nov 26 07:54:26 node1 Filesystem[4059]: INFO:  Success
Nov 26 07:54:33 node1 heartbeat: [3689]: info: Local Resource acquisition completed. (none)
Nov 26 07:54:33 node1 heartbeat: [3689]: info: local resource transition completed
上面这段日志是进行资源的监控和接管,主要完成haresources文件中的设置,在这里是启用集群虚拟IP和挂载磁盘分区。
此时,通过ifconfig命令查看主节点的网络配置,可以看到,主节点将自动绑定集群IP地址,在HA集群之外的主机上通过ping命令检测集群IP地址192.168.60.200,已经处于可通状态,也就是该地址变得可用。
同时查看磁盘分区的挂载情况,共享磁盘分区/dev/sdb5已经被自动挂载。
2.启动备份节点的Heartbeat 
启动备份节点的Heartbeat,与主节点方法一样,使用如下命令: 
  [root@node2 ~]#/etc/init.d/heartbeat start 
   或者执行
  [root@node2 ~]#service heartbeat start 
   这样就启动了备用节点的heartbeat服务,为了让heartbeat能在开机自动运行以及关机自动关闭, 创建以下软连接:
[root@node2 ~]#ln -s  /etc/init.d/heartbeat  /etc/rc.d/rc0.d/K05heartbeat
[root@node2 ~]#ln -s  /etc/init.d/heartbeat  /etc/rc.d/rc3.d/S75heartbeat
[root@node2 ~]#ln -s  /etc/init.d/heartbeat  /etc/rc.d/rc5.d/S75heartbeat
[root@node2 ~]#ln -s  /etc/init.d/heartbeat  /etc/rc.d/rc6.d/K05heartbeat
备用节点的heartbeat日志输出信息与主节点相对应,通过“tail -f /var/log/messages”可以看到如下输出:
Nov 26 07:57:15 node2 heartbeat: [2110]: info: Link node1:eth1 up.
Nov 26 07:57:15 node2 heartbeat: [2110]: info: Status update for node node1: status active
Nov 26 07:57:15 node2 heartbeat: [2110]: info: Link node1:eth0 up.
Nov 26 07:57:15 node2 harc[2123]: info: Running /etc/ha.d/rc.d/status status
Nov 26 07:57:15 node2 heartbeat: [2110]: info: Comm_now_up(): updating status to active
Nov 26 07:57:15 node2 heartbeat: [2110]: info: Local status now set to: 'active'
Nov 26 07:57:15 node2 heartbeat: [2110]: info: Starting child client "/usr/lib/heartbeat/ipfail" (694,694)
Nov 26 07:57:15 node2 heartbeat: [2110]: WARN: G_CH_dispatch_int: Dispatch function for read child took too long to execute: 70 ms (> 50 ms) (GSource: 0x8f62080)
Nov 26 07:57:15 node2 heartbeat: [2134]: info: Starting "/usr/lib/heartbeat/ipfail" as uid 694  gid 694 (pid 2134)    
备份节点检测到node1处于活动状态,没有可以接管的资源,因此,仅仅启动了网络监听插件ipfail,监控主节点的心跳。
测试heartbeat
如何才能得知HA集群是否正常工作,测试是个不错的方法,在把Heartbeat高可用性集群放到生产环境中之前,需要做如下五个步骤的测试,从而确定HA是否正常工作。
1.正常关闭和重启主节点的heartbeat
   首先在主节点node1上执行“service heartbeat stop”正常关闭主节点的Heartbeat进程,此时通过ifconfig命令查看主节点网卡信息,可以看到主节点已经释放了集群的服务IP地址,同时也释放了挂载的共享磁盘分区,然后查看备份节点,现在备份节点已经接管了集群的服务IP,同时也自动挂载上了共享的磁盘分区。
   在这个过程中,使用ping命令对集群服务IP进行测试,可以看到,集群IP一致处于可通状态,并没有任何延时和阻塞,也就是说在正常关闭主节点的情况下,主备节点的切换是无缝的,HA对外提供的服务也可以不间断运行。
   接着,将主节点heartbeat正常启动,heartbeat启动后,备份节点将自动释放集群服务IP,同时卸载共享磁盘分区,而主节点将再次接管集群服务IP和挂载共享磁盘分区,其实备份节点释放资源与主节点绑定资源是同步进行的。因而,这个过程也是一个无缝切换。
2.在主节点上拔去网线
   拔去主节点连接公共网络的网线后,heartbeat插件ipfail通过ping测试可以立刻检测到网络连接失败,接着自动释放资源,而就在此时,备用节点的ipfail插件也会检测到主节点出现网络故障,在等待主节点释放资源完毕后,备用节点马上接管了集群资源,从而保证了网络服务不间断持续运行。
   同理,当主节点网络恢复正常时,由于设置了“auto_failback on”选项,集群资源将自动从备用节点切会主节点。
   在主节点拔去网线后日志信息如下,注意日志中的斜体部分:
Nov 26 09:04:09 node1 heartbeat: [3689]: info: Link node2:eth0 dead.
Nov 26 09:04:09 node1 heartbeat: [3689]: info: Link 192.168.60.1:192.168.60.1 dead.
Nov 26 09:04:09 node1 ipfail: [3712]: info: Status update: Node 192.168.60.1 now has status dead
Nov 26 09:04:09 node1 harc[4279]: info: Running /etc/ha.d/rc.d/status status
Nov 26 09:04:10 node1 ipfail: [3712]: info: NS: We are dead. :<
Nov 26 09:04:10 node1 ipfail: [3712]: info: Link Status update: Link node2/eth0 now has status dead
…… 中间部分省略  ……
Nov 26 09:04:20 node1 heartbeat: [3689]: info: node1 wants to go standby [all]
Nov 26 09:04:20 node1 heartbeat: [3689]: info: standby: node2 can take our all resources
Nov 26 09:04:20 node1 heartbeat: [4295]: info: give up all HA resources (standby).
Nov 26 09:04:21 node1 ResourceManager[4305]: info: Releasing resource group: node1 192.168.60.200/24/eth0 Filesystem::/dev/sdb5::/webdata::ext3
Nov 26 09:04:21 node1 ResourceManager[4305]: info: Running /etc/ha.d/resource.d/Filesystem /dev/sdb5 /webdata ext3 stop
Nov 26 09:04:21 node1 Filesystem[4343]: INFO: Running stop for /dev/sdb5 on /webdata
Nov 26 09:04:21 node1 Filesystem[4343]: INFO: Trying to unmount /webdata
Nov 26 09:04:21 node1 Filesystem[4343]: INFO: unmounted /webdata successfully
Nov 26 09:04:21 node1 Filesystem[4340]: INFO:  Success
Nov 26 09:04:22 node1 ResourceManager[4305]: info: Running /etc/ha.d/resource.d/IPaddr 192.168.60.200/24/eth0 stop
Nov 26 09:04:22 node1 IPaddr[4428]: INFO: /sbin/ifconfig eth0:0 192.168.60.200 down
Nov 26 09:04:22 node1 avahi-daemon[1854]: Withdrawing address record for 192.168.60.200 on eth0.
Nov 26 09:04:22 node1 IPaddr[4407]: INFO:  Success
备用节点在接管主节点资源时的日志信息如下:
Nov 26 09:02:58 node2 heartbeat: [2110]: info: Link node1:eth0 dead.
Nov 26 09:02:58 node2 ipfail: [2134]: info: Link Status update: Link node1/eth0 now has status dead
Nov 26 09:02:59 node2 ipfail: [2134]: info: Asking other side for ping node count.
Nov 26 09:02:59 node2 ipfail: [2134]: info: Checking remote count of ping nodes.
Nov 26 09:03:02 node2 ipfail: [2134]: info: Telling other node that we have more visible ping nodes.
Nov 26 09:03:09 node2 heartbeat: [2110]: info: node1 wants to go standby [all]
Nov 26 09:03:10 node2 heartbeat: [2110]: info: standby: acquire [all] resources from node1
Nov 26 09:03:10 node2 heartbeat: [2281]: info: acquire all HA resources (standby).
Nov 26 09:03:10 node2 ResourceManager[2291]: info: Acquiring resource group: node1 192.168.60.200/24/eth0 Filesystem::/dev/sdb5::/webdata::ext3
Nov 26 09:03:10 node2 IPaddr[2315]: INFO:  Resource is stopped
Nov 26 09:03:11 node2 ResourceManager[2291]: info: Running /etc/ha.d/resource.d/IPaddr 192.168.60.200/24/eth0 start
Nov 26 09:03:11 node2 IPaddr[2393]: INFO: Using calculated netmask for 192.168.60.200: 255.255.255.0
Nov 26 09:03:11 node2 IPaddr[2393]: DEBUG: Using calculated broadcast for 192.168.60.200: 192.168.60.255
Nov 26 09:03:11 node2 IPaddr[2393]: INFO: eval /sbin/ifconfig eth0:0 192.168.60.200 netmask 255.255.255.0 broadcast 192.168.60.255
Nov 26 09:03:12 node2 avahi-daemon[1844]: Registering new address record for 192.168.60.200 on eth0.
Nov 26 09:03:12 node2 IPaddr[2393]: DEBUG: Sending Gratuitous Arp for 192.168.60.200 on eth0:0 [eth0]
Nov 26 09:03:12 node2 IPaddr[2372]: INFO:  Success
Nov 26 09:03:12 node2 Filesystem[2482]: INFO:  Resource is stopped
Nov 26 09:03:12 node2 ResourceManager[2291]: info: Running /etc/ha.d/resource.d/Filesystem /dev/sdb5 /webdata ext3 start
Nov 26 09:03:13 node2 Filesystem[2523]: INFO: Running start for /dev/sdb5 on /webdata
Nov 26 09:03:13 node2 kernel: kjournald starting.  Commit interval 5 seconds
Nov 26 09:03:13 node2 kernel: EXT3 FS on sdb5, internal journal
Nov 26 09:03:13 node2 kernel: EXT3-fs: mounted filesystem with ordered data mode.
Nov 26 09:03:13 node2 Filesystem[2520]: INFO:  Success
3.在主节点上拔去电源线
在主节点拔去电源后,备用节点的heartbeat进程会立刻收到主节点已经shutdown的消息,如果在集群上配置了Stonith设备,那么备用节点将会把电源关闭或者复位到主节点,当Stonith设备完成所有操作时,备份节点才拿到接管主节点资源的所有权,从而接管主节点的资源。
在主节点拔去电源后,备份节点有类似如下的日志输出:
Nov 26 09:24:54 node2 heartbeat: [2110]: info: Received shutdown notice from 'node1'.
Nov 26 09:24:54 node2 heartbeat: [2110]: info: Resources being acquired from node1.
Nov 26 09:24:54 node2 heartbeat: [2712]: info: acquire local HA resources (standby).
Nov 26 09:24:55 node2 ResourceManager[2762]: info: Running /etc/ha.d/resource.d/IPaddr 192.168.60.200/24/eth0 start
Nov 26 09:24:57 node2 ResourceManager[2762]: info: Running /etc/ha.d/resource.d/Filesystem /dev/sdb5 /webdata ext3 start

4.切断主节点的所有网络连接
   在主节点上断开心跳线后,主备节点都会在日志中输出“eth1 dead”的信息,但是不会引起节点间的资源切换,如果再次拔掉主节点连接公共网络的网线,那么就会发生主备节点资源切换,资源从主节点转移到备用节点,此时,连上主节点的心跳线,观察系统日志,可以看到,备用节点的heartbeat进程将会重新启动,进而再次控制集群资源,最后,连上主节点的对外网线,集群资源再次从备用节点转移到主节点,这就是整个的切换过程。
5.在主节点上非正常关闭heartbeat守护进程
   在主节点上通过“killall -9 heartbeat”命令关闭heartbeat进程,由于是非法关闭heartbeat进程,因此heartbeat所控制的资源并没有释放,备份节点在很短一段时间没有收到主节点的响应后,就会认为主节点出现故障,进而接管主节点资源,在这种情况下,就出现了资源争用情况,两个节点都占用一个资源,造成数据冲突。针对这个情况,可以通过linux提供的内核监控模块watchdog来解决这个问题,将watchdog集成到heartbeat中,如果heartbeat异常终止,或者系统出现故障,watchdog都会自动重启系统,从而释放集群资源,避免了数据冲突的发生。
   本章节我们没有配置watchdog到集群中,如果配置了watchdog,在执行“killall -9 heartbeat”时,会在/var/log/messages中看到如下信息:
   Softdog: WDT device closed unexpectedly. WDT will not stop!
这个错误告诉我们,系统出现问题,将重新启动。

高可用集群heartbeat全攻略的更多相关文章

  1. centos HA高可用集群 heartbeat搭建 heartbeat测试 主上停止heartbeat服务 测试脑裂 两边都禁用ping仲裁 第三十二节课

    centos   HA高可用集群  heartbeat搭建 heartbeat测试  主上停止heartbeat服务  测试脑裂  两边都禁用ping仲裁  第三十二节课 heartbeat是Linu ...

  2. Ambari HDP集群搭建全攻略

    世界上最快的捷径,就是脚踏实地,本文已收录[架构技术专栏]关注这个喜欢分享的地方. 最近因为工作上需要重新用Ambari搭了一套Hadoop集群,就把搭建的过程记录了下来,也希望给有同样需求的小伙伴们 ...

  3. LVS+Heartbeat 高可用集群方案操作记录

    之前分别介绍了LVS基础知识和Heartbeat基础知识, 今天这里简单说下LVS+Heartbeat实现高可用web集群方案的操作说明. Heartbeat 项目是 Linux-HA 工程的一个组成 ...

  4. Linux下"负载均衡+高可用"集群的考虑点 以及 高可用方案说明(Keepalive/Heartbeat)

    当下Linux运维技术越来越受到企业的关注和追捧, 在某些企业, 尤其是牵涉到电子商务和电子广告类的网站,通常会要求作负载均衡和高可用的Linux集群方案.那么如何实施Llinux集群架构,才能既有效 ...

  5. CentOS 6.5环境下heartbeat高可用集群的实现及工作原理详解

    Linux HA Cluster高可用服务器集群,所谓的高可用不是主机的高可用,而是服务的高可用. 什么叫高可用:一个服务器down掉的可能性多种多样,任何一个可能坏了都有可能带来风险,而服务器离线通 ...

  6. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  7. corosync+pacemaker and drbd实现mysql高可用集群

    DRBD:Distributed Replicated Block Device 分布式复制块设备,原理图如下 DRBD 有主双架构和双主架构的,当处于主从架构时,这个设备一定只有一个节点是可以读写的 ...

  8. Mycat节点扩缩容及高可用集群方案

    数据迁移与扩容实践: 工具目前从 mycat1.6,准备工作:1.mycat 所在环境安装 mysql 客户端程序. 2.mycat 的 lib 目录下添加 mysql 的 jdbc 驱动包. 3.对 ...

  9. MongoDB 3.4 高可用集群搭建(二)replica set 副本集

    转自:http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html 在上一篇文章<MongoDB 3.4 高可用集群搭建(一):主从模式&g ...

随机推荐

  1. xunsearch增量索引改进版

    最近测试了xunserach全文索引程序.xunsearch只有LINUX版,所以想用windows服务器请使用其它全文索引程序.xunsearch本身不像coreseek那样自带增量索引的功能,所以 ...

  2. Android TextView内容过长加省略号,点击显示全部内容

    在Android TextView中有个内容过长加省略号的属性,即ellipsize,用法如下: 在xml中:android:ellipsize="end"    省略号在结尾an ...

  3. wikioi 1201 最小数和最大数

    /*==================================================== 1201 最小数和最大数 题目描述 Description 输入n个数,n<=100 ...

  4. 【转】HTML - embed 与 object 之争

    在 HTML 里嵌入文本和图片之外的事物,就会用到嵌入标签,而嵌入标签在各浏览器之间的不统一,一直是让开发人员很头痛的问题.一切都要从嵌入 SUN 公司的 Applet Java 小程序开始. 当时, ...

  5. js列表分页

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. sqlplus将查询结果重定向到文件,不输出到屏幕

    --每行的字符数目 --该参数设置每页输出的行数.n=0表示不产生新页 --显示和拷贝long类型值的最大宽度的设置,最大值2G --sqlplus检索long类型值的增量大小.由于内存的限制 可按增 ...

  7. 关于SQLServer2005的学习笔记—异常捕获及处理

    转自:http://blog.csdn.net/baoqiangwang/article/details/5395874 SQLServer2005 提供了类似于 C# 和 C++ 语言中的异常处理的 ...

  8. openstack命令行

    openstack的每一个子项目(project)都有自己对应的命令行API,所有的这些API都是基于RESTful的,python代码实现的API.也就是说,这些API都是基于HTTP实现的,所以A ...

  9. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(四)

    http://www.cnblogs.com/StoneGarden/archive/2012/02/08/2343294.html MS CRM 2011的自定义和开发(11)——插件(plugin ...

  10. 【jmeter】测试报告优化<一>

    具体问题如下: 1.Date report这里的时间没有正确显示出来 2.Summary里的字段Min Time和Max Time显示的是NaN,没有显示正确的时间. 本文主要解决上述两个问题,具体报 ...