heartbeat 集群

 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内部结构组成:

        wKiom1ZBaoDz_id-AABUHAAP0aA109.png



           

            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模块的心跳监测部分和集群资源管理模块的资源接管部分,心跳监测一般由串行接口通过串口线来实现,两个节点之间通过串口线相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未受到对方发送的报文,那么就认为对方失效,这时资源接管模块将启动,用来接管运行在对方主机上的资源或者服务。

            

      安装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所示:

          wKiom1ZBaxeAQ_t2AABr65DQeVk362.png    


      接着配置每个节点的/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 �Cn”查看。

      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 

      �Ct 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 �Cr 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 �Cf /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, ,高可用集群)