瑞士美食:安装Heartbeat
来源:百度文库 编辑:偶看新闻 时间:2024/05/06 18:22:28
随着人们对网络应用需求越来越多,对网络服务的可靠性、稳定性和持久性的需求越来越高,大部分网络应用需要提供每天24小时,每星期7天的连续服务。任何服务的中断和数据的丢失都会造成商业上的损失,如何构建高可用的网络应用成为一个迫在眉睫的话题。本章讲述开源高可用软件heartbeat的应用。
Heartbeat的概念
Linux-HA的全称是High-Availability Linux,它是一个开源项目。这个开源项目的目标是:通过社区开发者的共同努力,提供一个增强Linux可靠性(reliability)、可用性(availability)和可服务性(serviceability)(RAS)的群集解决方案。其中Heartbeat就是Linux-HA项目中的一个组件,也是目前开源HA项目中最成功的一个例子,它提供了所有HA软件所需要的基本功能,比如心跳检测和资源接管、监测群集中的系统服务、在群集中的节点间转移共享IP地址的所有者等。自1999年开始到现在,Heartbeat在行业内得到了广泛的应用,也发行了很多的版本,可以从Linux-HA的官方网站http://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提供了高可用集群最基本的功能,例如,节点间的内部通信方式、集群合作管理机制、监控工具和失效切换功能等。目前的最新版本是Heartbeat 2.x,这里的讲述也是以Heartbeat 2.x为主。下面介绍Heartbeat 2.0的内部组成,主要分为以下几大部分。
heartbeat:节点间通信检测模块。
ha-logd:集群事件日志服务。
CCM(Consensus Cluster Membership):集群成员一致性管理模块。
LRM(Local Resource Manager):本地资源管理模块。
Stonith Daemon:使出现问题的节点从集群环境中脱离。
CRM(Cluster Resource Management):集群资源管理模块。
Cluster policy engine:集群策略引擎。
Cluster transition engine:集群转移引擎。
图18.1显示了Heartbeat 2.0内部结构组成。
(点击查看大图)图18.1 Heartbeat 2.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内部结构由三大部分组成。
(1)集群成员一致性管理模块(CCM)
CCM用于管理集群节点成员,同时管理成员之间的关系和节点间资源的分配。Heartbeat模块负责检测主次节点的运行状态,以决定节点是否失效。ha-logd模块用于记录集群中所有模块和服务的运行信息。
(2)本地资源管理器(LRM)
LRM负责本地资源的启动、停止和监控,一般由LRM守护进程lrmd和节点监控进程Stonith Daemon组成。lrmd守护进程负责节点间的通信;Stonith Daemon通常是一个Fence设备,主要用于监控节点状态,当一个节点出现问题时处于正常状态的节点会通过Fence设备将其重启或关机以释放IP、磁盘等资源,始终保持资源被一个节点拥有,防止资源争用的发生。
(3)集群资源管理模块(CRM)
CRM用于处理节点和资源之间的依赖关系,同时,管理节点对资源的使用,一般由CRM守护进程crmd、集群策略引擎和集群转移引擎3个部分组成。集群策略引擎(Cluster policy engine)具体实施这些管理和依赖;集群转移引擎(Cluster transition engine)监控CRM模块的状态,当一个节点出现故障时,负责协调另一个节点上的进程进行合理的资源接管。
在Heartbeat集群中,最核心的是Heartbeat模块的心跳监测部分和集群资源管理模块的资源接管部分。心跳监测一般由串行接口通过串口线来实现,两个节点之间通过串口线相互发送报文来告诉对方自己当前的状态。如果在指定的时间内未受到对方发送的报文,就认为对方失效,这时资源接管模块将启动,用来接管运行在对方主机上的资源或者服务。
图18.2是一个Heartbeat集群的一般拓扑图。在实际应用中,由于节点的数目、网络结构和磁盘类型配置的不同,拓扑结构可能会有不同。
(点击查看大图)图18.2 Heartbeat集群的一般拓扑图
安装Heartbeat前的准备
1.Heartbeat集群必须的硬件
从图18.2可以看出,构建一个Heartbeat集群系统必须的硬件设备有:
节点服务器;
网络和网卡;
共享磁盘。
(1)节点服务器
安装Heartbeat至少需要两台主机,并且对主机的要求不高,普通的PC服务器即可满足要求。当然,也可以在虚拟机上安装Heartbeat,现在Heartbeat可以很好地运行在Linux系统下,很多Linux发行版本都自带了Heartbeat套件,同时,还可以运行在FreeBSD和Solaris操作系统上。
(2)网卡和网络
Heartbeat集群中的每个主机必须有一块网卡和一个空闲串口。网卡用于连接公用网络,串口可以通过串口线。例如modem电线来实现连接,用于心跳监控节点间的状态。如果没有空闲串口的话,每个主机也可以通过两块网卡来实现HA,其中一块网卡用于连接公用网络,另一块网卡通过以太网交叉线与两个节点相连接。
注意 以太网交叉线和串口电线都能用于心跳监控,串口电线传输Heartbeat信号相对较好,如有条件,尽量使用串口线代替以太网交叉线作为节点间的心跳检测设备。
Heartbeat支持3种类型的网络,即公用网络(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地址规划
节 点 类 型
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地址,用于对外提供应用程序服务。基本的拓扑结构如图18.3所示。
(点击查看大图)图18.3 HA集群实例拓扑
接着配置每个节点的/etc/hosts文件,保证两个节点内容一致。/etc/hosts文件内容如下:
1. [root@node1 ~]#more /etc/hosts
2. 192.168.60.132
3. node1
4. 192.168.60.133
5. node2
6. 10.1.1.1
7. priv1
8. 10.1.1.2
9. priv1
一切准备就绪,接下来开始安装Heartbeat。
安装Heartbeat
1.获取Heartbeat
Heartbeat到目前为止发行了两个主版本,即Heartbeat 1.x和Heartbeat 2.x。Heartbeat 1.x仅仅允许创建两个节点的集群,提供基本的高可用性failover服务。Heartbeat 2.x提供了增强的特性,允许创建多个节点的集群,又支持模块结构的配置方法-集群资源管理器(Cluster Rescource Manager-CRM),CRM可以支持最多16个节点。这里我们选择Heartbeat 2.0.8版本进行介绍。
Heartbeat的下载地址为http://linux-ha.org/download/index.html,找到Heartbeat 2.0.8版本,下载类似heartbeat-2.0.8.tar.gz的源代码包即可。此外在安装Heartbeat时需要同时安装Libnet工具包。Libnet是一个高层次的API工具,可以从http://www.packetfactory.net/libnet/下载到,现在的稳定版本是1.1.2.1,下载后的包名为libnet.tar.gz。
注:在安装Heartbeat包时有以下报错,是libnet的版本不对(在AS4上安装没有报错)
2.安装Heartbeat
接下来需要在两个节点安装Heartbeat,安装过程很简单,只需解压编译、安装即可,这里不再详述。在两个节点执行相同的操作,下面是在node1上的安装过程:
1. [root@node1 ~]#tar -zxvf libnet.tar.gz
2. [root@node1 ~]#cd libnet
3. [root@node1 ~/libnet]#./configure
4. [root@node1 ~/libnet]#make
5. [root@node1 ~/libnet]#make install
6. [root@node1 ~]#tar zxf heartbeat-2.0.8.tar.gz
7. [root@node1 ~]#cd heartbeat-2.0.8
8. [root@node1 ~/heartbeat-2.0.8]#./ConfigureMe configure \
9. > --disable-swig --disable-snmp-subagent
10. [root@node1 ~/heartbeat-2.0.8]#make
11. [root@node1 ~/heartbeat-2.0.8]#make install
12. [root@node1 ~/heartbeat-2.0.8]#cp doc/ha.cf doc/haresources doc/authkeys /etc/ha.d/
13. [root@node1 ~/heartbeat-2.0.8]#cp ldirectord/ldirectord.cf /etc/ha.d/
14. [root@node1 ~/heartbeat-2.0.8]#groupadd -g 694 haclient
15. [root@node1 ~/heartbeat-2.0.8]#useradd -u 694 -g haclient hacluster
配置Heartbeat
配置主节点的Heartbeat
Heartbeat的主要配置文件有ha.cf、haresources和authkeys。在Heartbeat安装后,默认并没有这3个文件,可以从官方网站下载得到,也可以直接从解压的源码目录中找到。在上面的安装过程中,我们已经将这3个文件放到了/etc/ha.d目录下,下面分别详细介绍。
1.主配置文件(/etc/ha.d/ha.cf)
下面对ha.cf文件的每个选项进行详细介绍,其中"#"号后面的内容是对选项的注释说明。
1. #debugfile /var/log/ha-debug
2. logfile /var/log/ha-log #指名heartbeat的日志存放位置。
3. #crm yes #是否开启Cluster Resource Manager(集群资源管理)功能。
4. bcast eth1 #指明心跳使用以太网广播方式,并且是在eth1接口上进行广播。
5. keepalive 2 #指定心跳间隔时间为2秒(即每2秒钟在eth1上发送一次广播)。
6. deadtime 30 #指定若备用节点在30秒内没有收到主节点的心跳信号,则立即接管主节点的服务资源。
7. warntime 10 #指定心跳延迟的时间为10秒。当10秒钟内备份节点不能接收到主节点的
心跳信号时,就会往日志中写入一个警告日志,但此时不会切换服务。
8. initdead 120 #在某些系统上,系统启动或重启之后需要经过一段时间网络才
能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。
9. udpport 694 #设置广播通信使用的端口,694为默认使用的端口号。
10. baud 19200 #设置串行通信的波特率。
11. #serial /dev/ttyS0 #选择串行通信设备,用于双机使用串口线连接的情况。
如果双机使用以太网连接,则应该关闭该选项。
12. #ucast eth0 192.168.1.2 #采用网卡eth0的udp单播来组织心跳,后面跟的
IP地址应为双机对方的IP地址。
13. #mcast eth0 225.0.0.1 694 1 0 #采用网卡eth0的Udp多播来组织心跳,
一般在备用节点不止一台时使用。Bcast、ucast和mcast分别代表广播、单播
和多播,是组织心跳的三种方式,任选其一即可。
14. auto_failback on #用来定义当主节点恢复后,是否将服务自动切回。
heartbeat的两台主机分别为主节点和备份节点。主节点在正常情况下占用资源
并运行所有的服务,遇到故障时把资源交给备份节点并由备份节点运行服务。在该
选项设为on的情况下,一旦主节点恢复运行,则自动获取资源并取代备份节点;
如果该选项设置为off,那么当主节点恢复后,将变为备份节点,而原来的备份节点成为主节点。
15. #stonith baytech /etc/ha.d/conf/stonith.baytech # stonith的主
要作用是使出现问题的节点从集群环境中脱离,进而释放集群资源,避免两个节点争
用一个资源的情形发生。保证共享数据的安全性和完整性。
16. #watchdog /dev/watchdog #该选项是可选配置,是通过Heartbeat来监控系统的运
行状态。使用该特性,需要在内核中载入"softdog"内核模块,用来生成实际的设备文件,
如果系统中没有这个内核模块,就需要指定此模块,重新编译内核。编译完成输入
"insmod softdog"加载该模块。然后输入"grep misc /proc/devices"(应为10),
输入"cat /proc/misc |grep watchdog"(应为130)。最后,生成设备文件:
"mknod /dev/watchdog c 10 130" 。即可使用此功能。
17. node node1 #主节点主机名,可以通过命令"uanme -n"查看。
18. node node2 #备用节点主机名。
19. ping 192.168.60.1 #选择ping的节点,ping节点选择的越好,HA集群就越强壮,
可以选择固定的路由器作为ping节点,但是最好不要选择集群中的成员作为ping节点,
ping节点仅仅用来测试网络连接。
20. respawn hacluster /usr/lib/heartbeat/ipfail #该选项是可选配置,列出与
heartbeat一起启动和关闭的进程,该进程一般是和heartbeat集成的插件,这些进程
遇到故障可以自动重新启动。最常用的进程是ipfail,此进程用于检测和处理网络故障,
需要配合ping语句指定的ping node来检测网络的连通性。其中hacluster表示启动ipfail进程的身份。
2.资源文件(/etc/ha.d/haresources)
Haresources文件用于指定双机系统的主节点、集群IP、子网掩码、广播地址以及启动的服务等集群资源,文件每一行可以包含一个或多个资源脚本名,资源之间使用空格隔开,参数之间使用两个冒号隔开,在两个HA节点上该文件必须完全一致,此文件的一般格式为:
1. node-name network
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/目录下找到相应脚步进行启动或关闭操作。
下面对配置方法进行具体说明:
1. 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的认证方式,共有3种可用的认证方式,即crc、md5和sha1。3种认证方式的安全性依次提高,但是占用的系统资源也依次增加。如果Heartbeat集群运行在安全的网络上,可以使用crc方式;如果HA每个节点的硬件配置很高,建议使用sha1,这种认证方式安全级别最高;如果是处于网络安全和系统资源之间,可以使用md5认证方式。这里我们使用crc认证方式,设置如下:
1. auth 1
2. 1 crc
3. #2 sha1 sha1_any_password
4. #3 md5 md5_any_password
需要说明的一点是:无论auth后面指定的是什么数字,在下一行必须作为关键字再次出现,例如指定了"auth 6",下面一定要有一行"6 认证类型"。
最后确保这个文件的权限是600(即-rw-------)。
配置备份节点的Heartbeat
在备份节点上也需要安装Heartbeat,安装方式与在主节点安装过程一样,这里不再重述。依次安装libnet和heartbeat源码包,安装完毕,在备份节点上使用scp命令把主节点配置文件传输到备份节点。
1. [root@node2 ~]#scp -r node1:/etc/ha.d/* /etc/ha.d/
其中,node1是主节点的主机名。
设置主节点和备份节点时间同步
在双机高可用集群中,主节点和备份节点的系统时间也非常重要,因为节点之间的监控都是通过设定时间来实现的。主备节点之间的系统时间相差在10秒以内是正常的,如果节点之间时间相差太大,就有可能造成HA环境的故障。解决时间同步的办法有两个:一个办法是找一个时间服务器,两个节点通过ntpdate命令定时与时间服务器进行时间校准;另一个办法是让集群中的主节点作为ntp时间服务器,让备份节点定时去主节点进行时间校验。
启动Heartbeat
1.启动主节点的Heartbeat
Heartbeat安装完成后,自动在/etc/init.d目录下生成了启动脚步文件Heartbeat,直接输入/etc/init.d/heartbeat可以看到Heartbeat脚本的用法,如下所示:
1. [root@node1 ~]# /etc/init.d/heartbeat
2. Usage: /etc/init.d/heartbeat {start|stop|status|restart|reload|force-reload}
因而启动Heartbeat可以通过如下命令进行:
1. [root@node1 ~]#service heartbeat start
或者通过:
1. [root@node1 ~]#/etc/init.d/heartbeat start
这样就启动了主节点的Heartbeat服务,为了让Heartbeat能在开机自动运行以及关机自动关闭,可以手动创建以下软连接:
1. [root@node1 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc0.d/K05heartbeat
2. [root@node1 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc3.d/S75heartbeat
3. [root@node1 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc5.d/S75heartbeat
4. [root@node1 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc6.d/K05heartbeat
Heartbeat启动时,通过"tail -f /var/log/ messages"查看主节点系统日志信息,输出如下:
1. [root@node1 ~]# tail -f /var/log/messages
2. Nov 26 07:52:21 node1 heartbeat: [3688]: info:
Configuration validated. Starting heartbeat 2.0.8
3. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
heartbeat: version 2.0.8
4. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
Heartbeat generation: 3
5. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
G_main_add_TriggerHandler: Added signal manual handler
6. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
G_main_add_TriggerHandler: Added signal manual handler
7. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
glib: UDP Broadcast heartbeat started on port 694 (694) interface eth1
8. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
glib: UDP Broadcast heartbeat closed on port 694 interface eth1 - Status: 1
9. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
glib: ping heartbeat started.
10. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
G_main_add_SignalHandler: Added signal handler for signal 17
11. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
Local status now set to: 'up'
12. Nov 26 07:52:22 node1 heartbeat: [3689]: info:
Link node1:eth1 up.
13. Nov 26 07:52:23 node1 heartbeat: [3689]: info:
Link 192.168.60.1:192.168.60.1 up.
14. 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的输出信息如下:
1. Nov 26 07:54:22 node1 heartbeat: [3689]: WARN: node node2: is dead
2. Nov 26 07:54:22 node1 heartbeat: [3689]: info:
Comm_now_up(): updating status to active
3. Nov 26 07:54:22 node1 heartbeat: [3689]: info:
Local status now set to: 'active'
4. Nov 26 07:54:22 node1 heartbeat: [3689]: info:
Starting child client "/usr/lib/heartbeat/ipfail" (694,694)
5. Nov 26 07:54:22 node1 heartbeat: [3689]: WARN:
No STONITH device configured.
6. Nov 26 07:54:22 node1 heartbeat: [3689]: WARN:
Shared disks are not protected.
7. Nov 26 07:54:22 node1 heartbeat: [3689]: info:
Resources being acquired from node2.
8. 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"的警告提示。
继续看下面的日志:
1. Nov 26 07:54:23 node1 harc[3713]: info: Running /etc/ha.d/rc.d/status status
2. Nov 26 07:54:23 node1 mach_down[3735]: info: /usr/lib/
heartbeat/mach_down: nice_failback: foreign resources acquired
3. Nov 26 07:54:23 node1 mach_down[3735]: info: mach_down
takeover complete for node node2.
4. Nov 26 07:54:23 node1 heartbeat: [3689]: info: mach_down takeover complete.
5. Nov 26 07:54:23 node1 heartbeat: [3689]: info: Initial
resource acquisition complete (mach_down)
6. Nov 26 07:54:24 node1 IPaddr[3768]: INFO: Resource is stopped
7. Nov 26 07:54:24 node1 heartbeat: [3714]: info: Local Resource
acquisition completed.
8. Nov 26 07:54:24 node1 harc[3815]: info: Running /etc/ha.
d/rc.d/ip-request-resp ip-request-resp
9. Nov 26 07:54:24 node1 ip-request-resp[3815]: received ip-
request-resp 192.168.60.200/24/eth0 OK yes
10. Nov 26 07:54:24 node1 ResourceManager[3830]: info: Acquiring
resource group: node1 192.168.60.200/24/eth0 Filesystem:
:/dev/sdb5::/webdata::ext3
11. Nov 26 07:54:24 node1 IPaddr[3854]: INFO: Resource is stopped
12. Nov 26 07:54:25 node1 ResourceManager[3830]: info: Running
/etc/ha.d/resource.d/IPaddr 192.168.60.200/24/eth0 start
13. Nov 26 07:54:25 node1 IPaddr[3932]: INFO: Using calculated
netmask for 192.168.60.200: 255.255.255.0
14. Nov 26 07:54:25 node1 IPaddr[3932]: DEBUG: Using calculated
broadcast for 192.168.60.200: 192.168.60.255
15. 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
16. Nov 26 07:54:25 node1 avahi-daemon[1854]: Registering new
address record for 192.168.60.200 on eth0.
17. Nov 26 07:54:25 node1 IPaddr[3932]: DEBUG: Sending Gratuitous
Arp for 192.168.60.200 on eth0:0 [eth0]
18. Nov 26 07:54:26 node1 IPaddr[3911]: INFO: Success
19. Nov 26 07:54:26 node1 Filesystem[4021]: INFO: Resource is stopped
20. Nov 26 07:54:26 node1 ResourceManager[3830]: info: Running
/etc/ha.d/resource.d/ Filesystem/dev/sdb5 /webdata ext3 start
21. Nov 26 07:54:26 node1 Filesystem[4062]: INFO: Running start
for /dev/sdb5 on /webdata
22. Nov 26 07:54:26 node1 kernel: kjournald starting. Commit interval 5 seconds
23. Nov 26 07:54:26 node1 kernel: EXT3 FS on sdb5, internal journal
24. Nov 26 07:54:26 node1 kernel: EXT3-fs: mounted
filesystem with ordered data mode.
25. Nov 26 07:54:26 node1 Filesystem[4059]: INFO:
Success
26. Nov 26 07:54:33 node1 heartbeat: [3689]: info:
Local Resource acquisition completed. (none)
27. 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,与主节点方法一样,使用如下命令:
1. [root@node2 ~]#/etc/init.d/heartbeat start
或者执行:
1. [root@node2 ~]#service heartbeat start
这样就启动了备用节点的Heartbeat服务。为了让Heartbeat能在开机自动运行以及关机自动关闭,创建以下软连接:
1. [root@node2 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc0.d/K05heartbeat
2. [root@node2 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc3.d/S75heartbeat
3. [root@node2 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc5.d/S75heartbeat
4. [root@node2 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc6.d/K05heartbeat
备用节点的Heartbeat日志输出信息与主节点相对应,通过"tail -f /var/log/messages"可以看到如下输出:
1. Nov 26 07:57:15 node2 heartbeat: [2110]: info: Link node1:eth1 up.
2. Nov 26 07:57:15 node2 heartbeat: [2110]: info: Status update
for node node1: status active
3. Nov 26 07:57:15 node2 heartbeat: [2110]: info: Link node1:eth0 up.
4. Nov 26 07:57:15 node2 harc[2123]: info: Running /etc/ha.d/rc.d/status status
5. Nov 26 07:57:15 node2 heartbeat: [2110]: info: Comm_now_up():
updating status to active
6. Nov 26 07:57:15 node2 heartbeat: [2110]: info: Local
status now set to: 'active'
7. Nov 26 07:57:15 node2 heartbeat: [2110]: info: Starting
child client "/usr/lib/heartbeat/ipfail" (694,694)
8. 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)
9. 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高可用性集群放到生产环境中之前,需要做如下5个步骤的测试,从而确定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"选项,集群资源将自动从备用节点切会主节点。
在主节点拔去网线后日志信息如下,注意日志中的斜体部分:
1. Nov 26 09:04:09 node1 heartbeat: [3689]: info: Link node2:eth0 dead.
2. Nov 26 09:04:09 node1 heartbeat: [3689]: info:
Link 192.168.60.1:192.168.60.1 dead.
3. Nov 26 09:04:09 node1 ipfail: [3712]: info: Status update:
Node 192.168.60.1 now has status dead
4. Nov 26 09:04:09 node1 harc[4279]: info: Running /etc/ha.d/rc.d/status status
5. Nov 26 09:04:10 node1 ipfail: [3712]: info: NS: We are dead. :<
6. Nov 26 09:04:10 node1 ipfail: [3712]: info: Link Status
update: Link node2/eth0 now has status dead
7. …… 中间部分省略 ……
8. Nov 26 09:04:20 node1 heartbeat: [3689]: info: node1 wants to go standby [all]
9. Nov 26 09:04:20 node1 heartbeat: [3689]: info: standby:
node2 can take our all resources
10. Nov 26 09:04:20 node1 heartbeat: [4295]: info: give up all
HA resources (standby).
11. Nov 26 09:04:21 node1 ResourceManager[4305]: info: Releasing
resource group: node1 192.168.60.200/24/eth0 Filesystem::/dev/sdb5::/webdata::ext3
12. Nov 26 09:04:21 node1 ResourceManager[4305]: info: Running
/etc/ha.d/resource.d/ Filesystem/dev/sdb5 /webdata ext3 stop
13. Nov 26 09:04:21 node1 Filesystem[4343]: INFO: Running stop for /dev/sdb5 on /webdata
14. Nov 26 09:04:21 node1 Filesystem[4343]: INFO: Trying to unmount /webdata
15. Nov 26 09:04:21 node1 Filesystem[4343]: INFO: unmounted /webdata successfully
16. Nov 26 09:04:21 node1 Filesystem[4340]: INFO: Success
17. Nov 26 09:04:22 node1 ResourceManager[4305]: info: Running
/etc/ha.d/resource.d/IPaddr 192.168.60.200/24/eth0 stop
18. Nov 26 09:04:22 node1 IPaddr[4428]: INFO: /sbin/ifconfig eth0:0 192.168.60.200 down
19. Nov 26 09:04:22 node1 avahi-daemon[1854]: Withdrawing
address record for 192.168.60.200 on eth0.
20. Nov 26 09:04:22 node1 IPaddr[4407]: INFO: Success
备用节点在接管主节点资源时的日志信息如下:
1. Nov 26 09:02:58 node2 heartbeat: [2110]: info: Link node1:eth0 dead.
2. Nov 26 09:02:58 node2 ipfail: [2134]: info: Link Status
update: Link node1/eth0 now has status dead
3. Nov 26 09:02:59 node2 ipfail: [2134]: info: Asking
other side for ping node count.
4. Nov 26 09:02:59 node2 ipfail: [2134]: info: Checking remote count of ping nodes.
5. Nov 26 09:03:02 node2 ipfail: [2134]: info: Telling other
node that we have more visible ping nodes.
6. Nov 26 09:03:09 node2 heartbeat: [2110]: info: node1
wants to go standby [all]
7. Nov 26 09:03:10 node2 heartbeat: [2110]: info: standby:
acquire [all] resources from node1
8. Nov 26 09:03:10 node2 heartbeat: [2281]: info: acquire all HA resources (standby).
9. Nov 26 09:03:10 node2 ResourceManager[2291]: info: Acquiring
resource group: node1 192.168.60.200/24/eth0 Filesystem::/dev/sdb5::/webdata::ext3
10. Nov 26 09:03:10 node2 IPaddr[2315]: INFO: Resource is stopped
11. Nov 26 09:03:11 node2 ResourceManager[2291]: info: Running
/etc/ha.d/resource.d/IPaddr 192.168.60.200/24/eth0 start
12. Nov 26 09:03:11 node2 IPaddr[2393]: INFO: Using calculated
netmask for 192.168.60.200: 255.255.255.0
13. Nov 26 09:03:11 node2 IPaddr[2393]: DEBUG: Using calculated
broadcast for 192.168.60.200: 192.168.60.255
14. 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
15. Nov 26 09:03:12 node2 avahi-daemon[1844]: Registering new
address record for 192.168.60.200 on eth0.
16. Nov 26 09:03:12 node2 IPaddr[2393]: DEBUG: Sending Gratuitous
Arp for 192.168.60.200 on eth0:0 [eth0]
17. Nov 26 09:03:12 node2 IPaddr[2372]: INFO: Success
18. Nov 26 09:03:12 node2 Filesystem[2482]: INFO: Resource is stopped
19. Nov 26 09:03:12 node2 ResourceManager[2291]: info: Running
/etc/ha.d/resource.d/ Filesystem/dev/sdb5 /webdata ext3 start
20. Nov 26 09:03:13 node2 Filesystem[2523]: INFO: Running start for /dev/sdb5 on /webdata
21. Nov 26 09:03:13 node2 kernel: kjournald starting. Commit interval 5 seconds
22. Nov 26 09:03:13 node2 kernel: EXT3 FS on sdb5, internal journal
23. Nov 26 09:03:13 node2 kernel: EXT3-fs: mounted filesystem with ordered data mode.
24. Nov 26 09:03:13 node2 Filesystem[2520]: INFO: Success
3.在主节点上拔去电源线
在主节点拔去电源后,备用节点的Heartbeat进程会立刻收到主节点已经shutdown的消息。如果在集群上配置了Stonith设备,那么备用节点将会把电源关闭或者复位到主节点。当Stonith设备完成所有操作时,备份节点才能拿到接管主节点资源的所有权,从而接管主节点的资源。
在主节点拔去电源后,备份节点有类似如下的日志输出:
1. Nov 26 09:24:54 node2 heartbeat: [2110]: info:
Received shutdown notice from 'node1'.
2. Nov 26 09:24:54 node2 heartbeat: [2110]: info:
Resources being acquired from node1.
3. Nov 26 09:24:54 node2 heartbeat: [2712]: info:
acquire local HA resources (standby).
4. Nov 26 09:24:55 node2 ResourceManager[2762]:
info: Running /etc/ha.d/resource.d/IPaddr 192.168.60.200/24/eth0 start
5. 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中看到如下信息:
1. Softdog: WDT device closed unexpectedly. WDT will not stop!
这个错误告诉我们,系统出现问题,将重新启动。
配置watchdog,
Red Hat提供的标准模块内核(或如果你刚刚编译完你自己的内核,并启用了software watchdog支持),输入lsmod命令确定该模块是否载入了当前运行的内核,如果没有加载可执行如下命令:根据filename提示的路径加载softdog.ko模块
你应该看到列出了softdog,正常情况下,如果你在/etc/ha.d/ha.cf中启用了watchdog支持,Heartbeat开关(init)脚本将为你插入这个模块,开启watchdog如下:
#vi /etc/ha.d/ha.cf
取消下面这一行的注释符号:
watchdog /dev/watchdog
再次执行"killall -9 heartbeat"时,会在/var/log/messages中看到如下信息:
2. Softdog: WDT device closed unexpectedly. WDT will not stop!
这个错误告诉我们,系统出现问题,将重新启动。默认时间1分钟
本章小结
本章主要讲述了Linux-HA开源项目中Heartbeat的详细使用流程,通过概念与实例相结合的方式,对Heartbeat的原理、组成、安装和配置进行了完整阐述。熟练运用Heartbeat构建HA集群的难点在于对Heartbeat的运行原理、心跳监控方式、资源接管的深刻了解,这些都可以通过测试HA集群而得到。本章最后一节特意讲述了对Heartbeat集群的测试方式和测试流程,读者可以根据这个测试方式来测试自己构建的Heartbeat集群是否正常。
构建HA集群的软件还有很多,例如商业HA软件ROSE,IBM的HACMP,等等,这些集群软件的运行原理与Heartbeat基本相同,在安装配置方面可能略有不同,读者可以根据对Heartbeat运行方式的理解去学习其他HA集群软件。
2.本章练习
(1)简述Heartbeat集群内部几个关键的构成模块,并说明每个模块的作用。
(2)监控节点间心跳的方式有几种,每种都可以通过什么方式实现,它们之间的优劣是什么?
(3)Watchdog和Stonith应该怎么理解,它们在构建HA集群中的作用是什么?
Heartbeat的概念
Linux-HA的全称是High-Availability Linux,它是一个开源项目。这个开源项目的目标是:通过社区开发者的共同努力,提供一个增强Linux可靠性(reliability)、可用性(availability)和可服务性(serviceability)(RAS)的群集解决方案。其中Heartbeat就是Linux-HA项目中的一个组件,也是目前开源HA项目中最成功的一个例子,它提供了所有HA软件所需要的基本功能,比如心跳检测和资源接管、监测群集中的系统服务、在群集中的节点间转移共享IP地址的所有者等。自1999年开始到现在,Heartbeat在行业内得到了广泛的应用,也发行了很多的版本,可以从Linux-HA的官方网站http://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提供了高可用集群最基本的功能,例如,节点间的内部通信方式、集群合作管理机制、监控工具和失效切换功能等。目前的最新版本是Heartbeat 2.x,这里的讲述也是以Heartbeat 2.x为主。下面介绍Heartbeat 2.0的内部组成,主要分为以下几大部分。
heartbeat:节点间通信检测模块。
ha-logd:集群事件日志服务。
CCM(Consensus Cluster Membership):集群成员一致性管理模块。
LRM(Local Resource Manager):本地资源管理模块。
Stonith Daemon:使出现问题的节点从集群环境中脱离。
CRM(Cluster Resource Management):集群资源管理模块。
Cluster policy engine:集群策略引擎。
Cluster transition engine:集群转移引擎。
图18.1显示了Heartbeat 2.0内部结构组成。
(点击查看大图)图18.1 Heartbeat 2.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内部结构由三大部分组成。
(1)集群成员一致性管理模块(CCM)
CCM用于管理集群节点成员,同时管理成员之间的关系和节点间资源的分配。Heartbeat模块负责检测主次节点的运行状态,以决定节点是否失效。ha-logd模块用于记录集群中所有模块和服务的运行信息。
(2)本地资源管理器(LRM)
LRM负责本地资源的启动、停止和监控,一般由LRM守护进程lrmd和节点监控进程Stonith Daemon组成。lrmd守护进程负责节点间的通信;Stonith Daemon通常是一个Fence设备,主要用于监控节点状态,当一个节点出现问题时处于正常状态的节点会通过Fence设备将其重启或关机以释放IP、磁盘等资源,始终保持资源被一个节点拥有,防止资源争用的发生。
(3)集群资源管理模块(CRM)
CRM用于处理节点和资源之间的依赖关系,同时,管理节点对资源的使用,一般由CRM守护进程crmd、集群策略引擎和集群转移引擎3个部分组成。集群策略引擎(Cluster policy engine)具体实施这些管理和依赖;集群转移引擎(Cluster transition engine)监控CRM模块的状态,当一个节点出现故障时,负责协调另一个节点上的进程进行合理的资源接管。
在Heartbeat集群中,最核心的是Heartbeat模块的心跳监测部分和集群资源管理模块的资源接管部分。心跳监测一般由串行接口通过串口线来实现,两个节点之间通过串口线相互发送报文来告诉对方自己当前的状态。如果在指定的时间内未受到对方发送的报文,就认为对方失效,这时资源接管模块将启动,用来接管运行在对方主机上的资源或者服务。
图18.2是一个Heartbeat集群的一般拓扑图。在实际应用中,由于节点的数目、网络结构和磁盘类型配置的不同,拓扑结构可能会有不同。
(点击查看大图)图18.2 Heartbeat集群的一般拓扑图
安装Heartbeat前的准备
1.Heartbeat集群必须的硬件
从图18.2可以看出,构建一个Heartbeat集群系统必须的硬件设备有:
节点服务器;
网络和网卡;
共享磁盘。
(1)节点服务器
安装Heartbeat至少需要两台主机,并且对主机的要求不高,普通的PC服务器即可满足要求。当然,也可以在虚拟机上安装Heartbeat,现在Heartbeat可以很好地运行在Linux系统下,很多Linux发行版本都自带了Heartbeat套件,同时,还可以运行在FreeBSD和Solaris操作系统上。
(2)网卡和网络
Heartbeat集群中的每个主机必须有一块网卡和一个空闲串口。网卡用于连接公用网络,串口可以通过串口线。例如modem电线来实现连接,用于心跳监控节点间的状态。如果没有空闲串口的话,每个主机也可以通过两块网卡来实现HA,其中一块网卡用于连接公用网络,另一块网卡通过以太网交叉线与两个节点相连接。
注意 以太网交叉线和串口电线都能用于心跳监控,串口电线传输Heartbeat信号相对较好,如有条件,尽量使用串口线代替以太网交叉线作为节点间的心跳检测设备。
Heartbeat支持3种类型的网络,即公用网络(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地址规划
节 点 类 型
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地址,用于对外提供应用程序服务。基本的拓扑结构如图18.3所示。
(点击查看大图)图18.3 HA集群实例拓扑
接着配置每个节点的/etc/hosts文件,保证两个节点内容一致。/etc/hosts文件内容如下:
1. [root@node1 ~]#more /etc/hosts
2. 192.168.60.132
3. node1
4. 192.168.60.133
5. node2
6. 10.1.1.1
7. priv1
8. 10.1.1.2
9. priv1
一切准备就绪,接下来开始安装Heartbeat。
安装Heartbeat
1.获取Heartbeat
Heartbeat到目前为止发行了两个主版本,即Heartbeat 1.x和Heartbeat 2.x。Heartbeat 1.x仅仅允许创建两个节点的集群,提供基本的高可用性failover服务。Heartbeat 2.x提供了增强的特性,允许创建多个节点的集群,又支持模块结构的配置方法-集群资源管理器(Cluster Rescource Manager-CRM),CRM可以支持最多16个节点。这里我们选择Heartbeat 2.0.8版本进行介绍。
Heartbeat的下载地址为http://linux-ha.org/download/index.html,找到Heartbeat 2.0.8版本,下载类似heartbeat-2.0.8.tar.gz的源代码包即可。此外在安装Heartbeat时需要同时安装Libnet工具包。Libnet是一个高层次的API工具,可以从http://www.packetfactory.net/libnet/下载到,现在的稳定版本是1.1.2.1,下载后的包名为libnet.tar.gz。
注:在安装Heartbeat包时有以下报错,是libnet的版本不对(在AS4上安装没有报错)
2.安装Heartbeat
接下来需要在两个节点安装Heartbeat,安装过程很简单,只需解压编译、安装即可,这里不再详述。在两个节点执行相同的操作,下面是在node1上的安装过程:
1. [root@node1 ~]#tar -zxvf libnet.tar.gz
2. [root@node1 ~]#cd libnet
3. [root@node1 ~/libnet]#./configure
4. [root@node1 ~/libnet]#make
5. [root@node1 ~/libnet]#make install
6. [root@node1 ~]#tar zxf heartbeat-2.0.8.tar.gz
7. [root@node1 ~]#cd heartbeat-2.0.8
8. [root@node1 ~/heartbeat-2.0.8]#./ConfigureMe configure \
9. > --disable-swig --disable-snmp-subagent
10. [root@node1 ~/heartbeat-2.0.8]#make
11. [root@node1 ~/heartbeat-2.0.8]#make install
12. [root@node1 ~/heartbeat-2.0.8]#cp doc/ha.cf doc/haresources doc/authkeys /etc/ha.d/
13. [root@node1 ~/heartbeat-2.0.8]#cp ldirectord/ldirectord.cf /etc/ha.d/
14. [root@node1 ~/heartbeat-2.0.8]#groupadd -g 694 haclient
15. [root@node1 ~/heartbeat-2.0.8]#useradd -u 694 -g haclient hacluster
配置Heartbeat
配置主节点的Heartbeat
Heartbeat的主要配置文件有ha.cf、haresources和authkeys。在Heartbeat安装后,默认并没有这3个文件,可以从官方网站下载得到,也可以直接从解压的源码目录中找到。在上面的安装过程中,我们已经将这3个文件放到了/etc/ha.d目录下,下面分别详细介绍。
1.主配置文件(/etc/ha.d/ha.cf)
下面对ha.cf文件的每个选项进行详细介绍,其中"#"号后面的内容是对选项的注释说明。
1. #debugfile /var/log/ha-debug
2. logfile /var/log/ha-log #指名heartbeat的日志存放位置。
3. #crm yes #是否开启Cluster Resource Manager(集群资源管理)功能。
4. bcast eth1 #指明心跳使用以太网广播方式,并且是在eth1接口上进行广播。
5. keepalive 2 #指定心跳间隔时间为2秒(即每2秒钟在eth1上发送一次广播)。
6. deadtime 30 #指定若备用节点在30秒内没有收到主节点的心跳信号,则立即接管主节点的服务资源。
7. warntime 10 #指定心跳延迟的时间为10秒。当10秒钟内备份节点不能接收到主节点的
心跳信号时,就会往日志中写入一个警告日志,但此时不会切换服务。
8. initdead 120 #在某些系统上,系统启动或重启之后需要经过一段时间网络才
能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。
9. udpport 694 #设置广播通信使用的端口,694为默认使用的端口号。
10. baud 19200 #设置串行通信的波特率。
11. #serial /dev/ttyS0 #选择串行通信设备,用于双机使用串口线连接的情况。
如果双机使用以太网连接,则应该关闭该选项。
12. #ucast eth0 192.168.1.2 #采用网卡eth0的udp单播来组织心跳,后面跟的
IP地址应为双机对方的IP地址。
13. #mcast eth0 225.0.0.1 694 1 0 #采用网卡eth0的Udp多播来组织心跳,
一般在备用节点不止一台时使用。Bcast、ucast和mcast分别代表广播、单播
和多播,是组织心跳的三种方式,任选其一即可。
14. auto_failback on #用来定义当主节点恢复后,是否将服务自动切回。
heartbeat的两台主机分别为主节点和备份节点。主节点在正常情况下占用资源
并运行所有的服务,遇到故障时把资源交给备份节点并由备份节点运行服务。在该
选项设为on的情况下,一旦主节点恢复运行,则自动获取资源并取代备份节点;
如果该选项设置为off,那么当主节点恢复后,将变为备份节点,而原来的备份节点成为主节点。
15. #stonith baytech /etc/ha.d/conf/stonith.baytech # stonith的主
要作用是使出现问题的节点从集群环境中脱离,进而释放集群资源,避免两个节点争
用一个资源的情形发生。保证共享数据的安全性和完整性。
16. #watchdog /dev/watchdog #该选项是可选配置,是通过Heartbeat来监控系统的运
行状态。使用该特性,需要在内核中载入"softdog"内核模块,用来生成实际的设备文件,
如果系统中没有这个内核模块,就需要指定此模块,重新编译内核。编译完成输入
"insmod softdog"加载该模块。然后输入"grep misc /proc/devices"(应为10),
输入"cat /proc/misc |grep watchdog"(应为130)。最后,生成设备文件:
"mknod /dev/watchdog c 10 130" 。即可使用此功能。
17. node node1 #主节点主机名,可以通过命令"uanme -n"查看。
18. node node2 #备用节点主机名。
19. ping 192.168.60.1 #选择ping的节点,ping节点选择的越好,HA集群就越强壮,
可以选择固定的路由器作为ping节点,但是最好不要选择集群中的成员作为ping节点,
ping节点仅仅用来测试网络连接。
20. respawn hacluster /usr/lib/heartbeat/ipfail #该选项是可选配置,列出与
heartbeat一起启动和关闭的进程,该进程一般是和heartbeat集成的插件,这些进程
遇到故障可以自动重新启动。最常用的进程是ipfail,此进程用于检测和处理网络故障,
需要配合ping语句指定的ping node来检测网络的连通性。其中hacluster表示启动ipfail进程的身份。
2.资源文件(/etc/ha.d/haresources)
Haresources文件用于指定双机系统的主节点、集群IP、子网掩码、广播地址以及启动的服务等集群资源,文件每一行可以包含一个或多个资源脚本名,资源之间使用空格隔开,参数之间使用两个冒号隔开,在两个HA节点上该文件必须完全一致,此文件的一般格式为:
1. node-name network
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/目录下找到相应脚步进行启动或关闭操作。
下面对配置方法进行具体说明:
1. 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的认证方式,共有3种可用的认证方式,即crc、md5和sha1。3种认证方式的安全性依次提高,但是占用的系统资源也依次增加。如果Heartbeat集群运行在安全的网络上,可以使用crc方式;如果HA每个节点的硬件配置很高,建议使用sha1,这种认证方式安全级别最高;如果是处于网络安全和系统资源之间,可以使用md5认证方式。这里我们使用crc认证方式,设置如下:
1. auth 1
2. 1 crc
3. #2 sha1 sha1_any_password
4. #3 md5 md5_any_password
需要说明的一点是:无论auth后面指定的是什么数字,在下一行必须作为关键字再次出现,例如指定了"auth 6",下面一定要有一行"6 认证类型"。
最后确保这个文件的权限是600(即-rw-------)。
配置备份节点的Heartbeat
在备份节点上也需要安装Heartbeat,安装方式与在主节点安装过程一样,这里不再重述。依次安装libnet和heartbeat源码包,安装完毕,在备份节点上使用scp命令把主节点配置文件传输到备份节点。
1. [root@node2 ~]#scp -r node1:/etc/ha.d/* /etc/ha.d/
其中,node1是主节点的主机名。
设置主节点和备份节点时间同步
在双机高可用集群中,主节点和备份节点的系统时间也非常重要,因为节点之间的监控都是通过设定时间来实现的。主备节点之间的系统时间相差在10秒以内是正常的,如果节点之间时间相差太大,就有可能造成HA环境的故障。解决时间同步的办法有两个:一个办法是找一个时间服务器,两个节点通过ntpdate命令定时与时间服务器进行时间校准;另一个办法是让集群中的主节点作为ntp时间服务器,让备份节点定时去主节点进行时间校验。
启动Heartbeat
1.启动主节点的Heartbeat
Heartbeat安装完成后,自动在/etc/init.d目录下生成了启动脚步文件Heartbeat,直接输入/etc/init.d/heartbeat可以看到Heartbeat脚本的用法,如下所示:
1. [root@node1 ~]# /etc/init.d/heartbeat
2. Usage: /etc/init.d/heartbeat {start|stop|status|restart|reload|force-reload}
因而启动Heartbeat可以通过如下命令进行:
1. [root@node1 ~]#service heartbeat start
或者通过:
1. [root@node1 ~]#/etc/init.d/heartbeat start
这样就启动了主节点的Heartbeat服务,为了让Heartbeat能在开机自动运行以及关机自动关闭,可以手动创建以下软连接:
1. [root@node1 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc0.d/K05heartbeat
2. [root@node1 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc3.d/S75heartbeat
3. [root@node1 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc5.d/S75heartbeat
4. [root@node1 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc6.d/K05heartbeat
Heartbeat启动时,通过"tail -f /var/log/ messages"查看主节点系统日志信息,输出如下:
1. [root@node1 ~]# tail -f /var/log/messages
2. Nov 26 07:52:21 node1 heartbeat: [3688]: info:
Configuration validated. Starting heartbeat 2.0.8
3. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
heartbeat: version 2.0.8
4. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
Heartbeat generation: 3
5. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
G_main_add_TriggerHandler: Added signal manual handler
6. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
G_main_add_TriggerHandler: Added signal manual handler
7. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
glib: UDP Broadcast heartbeat started on port 694 (694) interface eth1
8. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
glib: UDP Broadcast heartbeat closed on port 694 interface eth1 - Status: 1
9. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
glib: ping heartbeat started.
10. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
G_main_add_SignalHandler: Added signal handler for signal 17
11. Nov 26 07:52:21 node1 heartbeat: [3689]: info:
Local status now set to: 'up'
12. Nov 26 07:52:22 node1 heartbeat: [3689]: info:
Link node1:eth1 up.
13. Nov 26 07:52:23 node1 heartbeat: [3689]: info:
Link 192.168.60.1:192.168.60.1 up.
14. 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的输出信息如下:
1. Nov 26 07:54:22 node1 heartbeat: [3689]: WARN: node node2: is dead
2. Nov 26 07:54:22 node1 heartbeat: [3689]: info:
Comm_now_up(): updating status to active
3. Nov 26 07:54:22 node1 heartbeat: [3689]: info:
Local status now set to: 'active'
4. Nov 26 07:54:22 node1 heartbeat: [3689]: info:
Starting child client "/usr/lib/heartbeat/ipfail" (694,694)
5. Nov 26 07:54:22 node1 heartbeat: [3689]: WARN:
No STONITH device configured.
6. Nov 26 07:54:22 node1 heartbeat: [3689]: WARN:
Shared disks are not protected.
7. Nov 26 07:54:22 node1 heartbeat: [3689]: info:
Resources being acquired from node2.
8. 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"的警告提示。
继续看下面的日志:
1. Nov 26 07:54:23 node1 harc[3713]: info: Running /etc/ha.d/rc.d/status status
2. Nov 26 07:54:23 node1 mach_down[3735]: info: /usr/lib/
heartbeat/mach_down: nice_failback: foreign resources acquired
3. Nov 26 07:54:23 node1 mach_down[3735]: info: mach_down
takeover complete for node node2.
4. Nov 26 07:54:23 node1 heartbeat: [3689]: info: mach_down takeover complete.
5. Nov 26 07:54:23 node1 heartbeat: [3689]: info: Initial
resource acquisition complete (mach_down)
6. Nov 26 07:54:24 node1 IPaddr[3768]: INFO: Resource is stopped
7. Nov 26 07:54:24 node1 heartbeat: [3714]: info: Local Resource
acquisition completed.
8. Nov 26 07:54:24 node1 harc[3815]: info: Running /etc/ha.
d/rc.d/ip-request-resp ip-request-resp
9. Nov 26 07:54:24 node1 ip-request-resp[3815]: received ip-
request-resp 192.168.60.200/24/eth0 OK yes
10. Nov 26 07:54:24 node1 ResourceManager[3830]: info: Acquiring
resource group: node1 192.168.60.200/24/eth0 Filesystem:
:/dev/sdb5::/webdata::ext3
11. Nov 26 07:54:24 node1 IPaddr[3854]: INFO: Resource is stopped
12. Nov 26 07:54:25 node1 ResourceManager[3830]: info: Running
/etc/ha.d/resource.d/IPaddr 192.168.60.200/24/eth0 start
13. Nov 26 07:54:25 node1 IPaddr[3932]: INFO: Using calculated
netmask for 192.168.60.200: 255.255.255.0
14. Nov 26 07:54:25 node1 IPaddr[3932]: DEBUG: Using calculated
broadcast for 192.168.60.200: 192.168.60.255
15. 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
16. Nov 26 07:54:25 node1 avahi-daemon[1854]: Registering new
address record for 192.168.60.200 on eth0.
17. Nov 26 07:54:25 node1 IPaddr[3932]: DEBUG: Sending Gratuitous
Arp for 192.168.60.200 on eth0:0 [eth0]
18. Nov 26 07:54:26 node1 IPaddr[3911]: INFO: Success
19. Nov 26 07:54:26 node1 Filesystem[4021]: INFO: Resource is stopped
20. Nov 26 07:54:26 node1 ResourceManager[3830]: info: Running
/etc/ha.d/resource.d/ Filesystem/dev/sdb5 /webdata ext3 start
21. Nov 26 07:54:26 node1 Filesystem[4062]: INFO: Running start
for /dev/sdb5 on /webdata
22. Nov 26 07:54:26 node1 kernel: kjournald starting. Commit interval 5 seconds
23. Nov 26 07:54:26 node1 kernel: EXT3 FS on sdb5, internal journal
24. Nov 26 07:54:26 node1 kernel: EXT3-fs: mounted
filesystem with ordered data mode.
25. Nov 26 07:54:26 node1 Filesystem[4059]: INFO:
Success
26. Nov 26 07:54:33 node1 heartbeat: [3689]: info:
Local Resource acquisition completed. (none)
27. 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,与主节点方法一样,使用如下命令:
1. [root@node2 ~]#/etc/init.d/heartbeat start
或者执行:
1. [root@node2 ~]#service heartbeat start
这样就启动了备用节点的Heartbeat服务。为了让Heartbeat能在开机自动运行以及关机自动关闭,创建以下软连接:
1. [root@node2 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc0.d/K05heartbeat
2. [root@node2 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc3.d/S75heartbeat
3. [root@node2 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc5.d/S75heartbeat
4. [root@node2 ~]#ln -s /etc/init.d/heartbeat /etc/rc.d/rc6.d/K05heartbeat
备用节点的Heartbeat日志输出信息与主节点相对应,通过"tail -f /var/log/messages"可以看到如下输出:
1. Nov 26 07:57:15 node2 heartbeat: [2110]: info: Link node1:eth1 up.
2. Nov 26 07:57:15 node2 heartbeat: [2110]: info: Status update
for node node1: status active
3. Nov 26 07:57:15 node2 heartbeat: [2110]: info: Link node1:eth0 up.
4. Nov 26 07:57:15 node2 harc[2123]: info: Running /etc/ha.d/rc.d/status status
5. Nov 26 07:57:15 node2 heartbeat: [2110]: info: Comm_now_up():
updating status to active
6. Nov 26 07:57:15 node2 heartbeat: [2110]: info: Local
status now set to: 'active'
7. Nov 26 07:57:15 node2 heartbeat: [2110]: info: Starting
child client "/usr/lib/heartbeat/ipfail" (694,694)
8. 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)
9. 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高可用性集群放到生产环境中之前,需要做如下5个步骤的测试,从而确定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"选项,集群资源将自动从备用节点切会主节点。
在主节点拔去网线后日志信息如下,注意日志中的斜体部分:
1. Nov 26 09:04:09 node1 heartbeat: [3689]: info: Link node2:eth0 dead.
2. Nov 26 09:04:09 node1 heartbeat: [3689]: info:
Link 192.168.60.1:192.168.60.1 dead.
3. Nov 26 09:04:09 node1 ipfail: [3712]: info: Status update:
Node 192.168.60.1 now has status dead
4. Nov 26 09:04:09 node1 harc[4279]: info: Running /etc/ha.d/rc.d/status status
5. Nov 26 09:04:10 node1 ipfail: [3712]: info: NS: We are dead. :<
6. Nov 26 09:04:10 node1 ipfail: [3712]: info: Link Status
update: Link node2/eth0 now has status dead
7. …… 中间部分省略 ……
8. Nov 26 09:04:20 node1 heartbeat: [3689]: info: node1 wants to go standby [all]
9. Nov 26 09:04:20 node1 heartbeat: [3689]: info: standby:
node2 can take our all resources
10. Nov 26 09:04:20 node1 heartbeat: [4295]: info: give up all
HA resources (standby).
11. Nov 26 09:04:21 node1 ResourceManager[4305]: info: Releasing
resource group: node1 192.168.60.200/24/eth0 Filesystem::/dev/sdb5::/webdata::ext3
12. Nov 26 09:04:21 node1 ResourceManager[4305]: info: Running
/etc/ha.d/resource.d/ Filesystem/dev/sdb5 /webdata ext3 stop
13. Nov 26 09:04:21 node1 Filesystem[4343]: INFO: Running stop for /dev/sdb5 on /webdata
14. Nov 26 09:04:21 node1 Filesystem[4343]: INFO: Trying to unmount /webdata
15. Nov 26 09:04:21 node1 Filesystem[4343]: INFO: unmounted /webdata successfully
16. Nov 26 09:04:21 node1 Filesystem[4340]: INFO: Success
17. Nov 26 09:04:22 node1 ResourceManager[4305]: info: Running
/etc/ha.d/resource.d/IPaddr 192.168.60.200/24/eth0 stop
18. Nov 26 09:04:22 node1 IPaddr[4428]: INFO: /sbin/ifconfig eth0:0 192.168.60.200 down
19. Nov 26 09:04:22 node1 avahi-daemon[1854]: Withdrawing
address record for 192.168.60.200 on eth0.
20. Nov 26 09:04:22 node1 IPaddr[4407]: INFO: Success
备用节点在接管主节点资源时的日志信息如下:
1. Nov 26 09:02:58 node2 heartbeat: [2110]: info: Link node1:eth0 dead.
2. Nov 26 09:02:58 node2 ipfail: [2134]: info: Link Status
update: Link node1/eth0 now has status dead
3. Nov 26 09:02:59 node2 ipfail: [2134]: info: Asking
other side for ping node count.
4. Nov 26 09:02:59 node2 ipfail: [2134]: info: Checking remote count of ping nodes.
5. Nov 26 09:03:02 node2 ipfail: [2134]: info: Telling other
node that we have more visible ping nodes.
6. Nov 26 09:03:09 node2 heartbeat: [2110]: info: node1
wants to go standby [all]
7. Nov 26 09:03:10 node2 heartbeat: [2110]: info: standby:
acquire [all] resources from node1
8. Nov 26 09:03:10 node2 heartbeat: [2281]: info: acquire all HA resources (standby).
9. Nov 26 09:03:10 node2 ResourceManager[2291]: info: Acquiring
resource group: node1 192.168.60.200/24/eth0 Filesystem::/dev/sdb5::/webdata::ext3
10. Nov 26 09:03:10 node2 IPaddr[2315]: INFO: Resource is stopped
11. Nov 26 09:03:11 node2 ResourceManager[2291]: info: Running
/etc/ha.d/resource.d/IPaddr 192.168.60.200/24/eth0 start
12. Nov 26 09:03:11 node2 IPaddr[2393]: INFO: Using calculated
netmask for 192.168.60.200: 255.255.255.0
13. Nov 26 09:03:11 node2 IPaddr[2393]: DEBUG: Using calculated
broadcast for 192.168.60.200: 192.168.60.255
14. 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
15. Nov 26 09:03:12 node2 avahi-daemon[1844]: Registering new
address record for 192.168.60.200 on eth0.
16. Nov 26 09:03:12 node2 IPaddr[2393]: DEBUG: Sending Gratuitous
Arp for 192.168.60.200 on eth0:0 [eth0]
17. Nov 26 09:03:12 node2 IPaddr[2372]: INFO: Success
18. Nov 26 09:03:12 node2 Filesystem[2482]: INFO: Resource is stopped
19. Nov 26 09:03:12 node2 ResourceManager[2291]: info: Running
/etc/ha.d/resource.d/ Filesystem/dev/sdb5 /webdata ext3 start
20. Nov 26 09:03:13 node2 Filesystem[2523]: INFO: Running start for /dev/sdb5 on /webdata
21. Nov 26 09:03:13 node2 kernel: kjournald starting. Commit interval 5 seconds
22. Nov 26 09:03:13 node2 kernel: EXT3 FS on sdb5, internal journal
23. Nov 26 09:03:13 node2 kernel: EXT3-fs: mounted filesystem with ordered data mode.
24. Nov 26 09:03:13 node2 Filesystem[2520]: INFO: Success
3.在主节点上拔去电源线
在主节点拔去电源后,备用节点的Heartbeat进程会立刻收到主节点已经shutdown的消息。如果在集群上配置了Stonith设备,那么备用节点将会把电源关闭或者复位到主节点。当Stonith设备完成所有操作时,备份节点才能拿到接管主节点资源的所有权,从而接管主节点的资源。
在主节点拔去电源后,备份节点有类似如下的日志输出:
1. Nov 26 09:24:54 node2 heartbeat: [2110]: info:
Received shutdown notice from 'node1'.
2. Nov 26 09:24:54 node2 heartbeat: [2110]: info:
Resources being acquired from node1.
3. Nov 26 09:24:54 node2 heartbeat: [2712]: info:
acquire local HA resources (standby).
4. Nov 26 09:24:55 node2 ResourceManager[2762]:
info: Running /etc/ha.d/resource.d/IPaddr 192.168.60.200/24/eth0 start
5. 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中看到如下信息:
1. Softdog: WDT device closed unexpectedly. WDT will not stop!
这个错误告诉我们,系统出现问题,将重新启动。
配置watchdog,
Red Hat提供的标准模块内核(或如果你刚刚编译完你自己的内核,并启用了software watchdog支持),输入lsmod命令确定该模块是否载入了当前运行的内核,如果没有加载可执行如下命令:根据filename提示的路径加载softdog.ko模块
你应该看到列出了softdog,正常情况下,如果你在/etc/ha.d/ha.cf中启用了watchdog支持,Heartbeat开关(init)脚本将为你插入这个模块,开启watchdog如下:
#vi /etc/ha.d/ha.cf
取消下面这一行的注释符号:
watchdog /dev/watchdog
再次执行"killall -9 heartbeat"时,会在/var/log/messages中看到如下信息:
2. Softdog: WDT device closed unexpectedly. WDT will not stop!
这个错误告诉我们,系统出现问题,将重新启动。默认时间1分钟
本章小结
本章主要讲述了Linux-HA开源项目中Heartbeat的详细使用流程,通过概念与实例相结合的方式,对Heartbeat的原理、组成、安装和配置进行了完整阐述。熟练运用Heartbeat构建HA集群的难点在于对Heartbeat的运行原理、心跳监控方式、资源接管的深刻了解,这些都可以通过测试HA集群而得到。本章最后一节特意讲述了对Heartbeat集群的测试方式和测试流程,读者可以根据这个测试方式来测试自己构建的Heartbeat集群是否正常。
构建HA集群的软件还有很多,例如商业HA软件ROSE,IBM的HACMP,等等,这些集群软件的运行原理与Heartbeat基本相同,在安装配置方面可能略有不同,读者可以根据对Heartbeat运行方式的理解去学习其他HA集群软件。
2.本章练习
(1)简述Heartbeat集群内部几个关键的构成模块,并说明每个模块的作用。
(2)监控节点间心跳的方式有几种,每种都可以通过什么方式实现,它们之间的优劣是什么?
(3)Watchdog和Stonith应该怎么理解,它们在构建HA集群中的作用是什么?
《miss you in a heartbeat》
求def leppard的 miss you in a heartbeat歌词
I love that you grovel on me listening to my heartbeat.什么意思?
安装!安装!安装!安装!!!
安装安装
安装安装安装
安装安装安装(2)
安装安装安装(4)
安装包无法安装
安装程序无法安装
安装程序无法安装
安装金山毒霸安装不了
安装程序安装不到
【安装】安装microsoft office2003,怎么安装啊?
coreldraw安装
程序安装
安装LINUX
安装杀毒软件
摄像头 安装
win2000sever安装
交换机安装
操作系统安装
游戏安装
安装字体