参考网站:
两台linux服务器,双网卡。
xldwhj(主):eth0:192.168.42.2 (心跳线) eth1:192.168.184.128
xldroot(从):eth0:192.168.42.3(心跳线) eth1:192.168.184.130
虚拟IP:192.168.184.200
1 HeartBeat基本介绍
Heartbeat是High-Availability Linux Project (Linux下的高可用性项目)的产物,是一套提供防止业务主机因不可避免的意外性或计划性宕机问题的高可用性软件。Heartbeat可以从Linux-HA 项目Web 站点免费获得,它提供了所有HA (高可用性)系统所需要的基本功能,如启动和停止资源、监测群集中系统的可用性、在群集中的节点间转移共享IP 地址的所有者等。它通过串行线、以太网接口或同时使用两者来监测特定服务(或多个服务)的运行状况。
Heartbeat实现了HA 功能中的核心功能——心跳,将Heartbeat软件同时安装在两台服务器上,用于监视系统的状态,协调主从服务器的工作,维护系统的可用性。它能侦测服务器应用级系统软件、硬件发生的故障,及时地进行错误隔绝、恢复;通过系统监控、服务监控、IP自动迁移等技术实现在整个应用中无单点故障,简单、经济地确保重要的服务持续高可用性。
Heartbeat采用虚拟IP地址映射技术实现主从服务器的切换对客户端透明的功能。
1.1 HeartBeat的工作原理
通过修改Heartbeat的软件的配置文件,可以制定那一台Heartbeat服务器作为主服务器,则另一台将自动成为热备服务器。然后在热备服务器上配置Heartbeat
守护程序来监听来自主服务器的心跳消息。如果热备服务器在指定时间内为监听到来自主服务器的心跳,就会启动故障转义程序,并取得主服务器上的相关资源服务的所有权,接替主服务器继续不间断的提供服务,从而达到资源以及服务高可用的目的。
以上的描述为heartbeat的主备模式,heartbeat还支持主主模式,即两台服务器互为主备,这是他们之间还会互相发送报文来告诉对方自己的当前的状态,如果在指定的时间内未收到对方发送的心跳报文,那么,一方就会认为对方失效或者是已经宕机了,这时运行正常的主机就会启动自身的资源接管模块来接管运行在对方主机上的资源或者是服务,继续为用户提供服务。一般情况下,可以较好的实现一台主机故障后,企业业务能够不间断的持续的提供服务。注意:所谓的业务不间断,在故障转移期间也是需要切换时间的,heartbeat的切换时间是5-20秒。
切换的常见条件:
1)服务器宕机
2)Heartbeat服务本故障
3)中间的连接线路故障
1.2 HeartBeat的心跳连接
讲过上面的描述,要部署heartbeat服务,至少需要两台主机才能完成。那么,要实现高可用服务,这两台主机之间,是如何做到互相通信互相监控的呢/
下面是两台heartbeat主机之间通信的一些常用的可行的方法:
1)串行电缆,即所谓的串口(首选,缺点是距离不能太远)
2)一根以太网电缆两网卡直连(生产环境中常用的方式)
3)以太网电缆,通过交换机等网络设备连接(次选,原因是增加了故障点,不好排查故障,同时,线路不是专用的心跳线,容易受其他数据传输的影响,导致心跳报文发送问题)
2 HeartBeat的安装与配置
2.1 HeartBeat的安装
因为Centos默认的yum源里没有heartbeat的资源,所以首先需要将fedora的源添加到centos系统中
[root@xldwhj ~]#
Wget http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@xldwhj ~]# rpm –ivf
yum安装HeartBeat
[root@xldwhj ~]# yum –y install heartbeat
安装完成后,需要三个配置文件: ha.cf,haresources,authkeys
[root@xldwhj ~]# cat /etc/ha.d/README.config
You need three configuration files to make heartbeat happy,
and they all go in this directory.
They are:
ha.cf Main configuration file
haresources Resource configuration file
authkeys Authentication information
These first two may be readable by everyone, but the authkeys file
must not be.
The good news is that sample versions of these files may be found in
the documentation directory (providing you installed the documentation).
If you installed heartbeat using rpm packages then
this command will show you where they are on your system:
rpm -q heartbeat -d
If you installed heartbeat using Debian packages then
the documentation should be located in /usr/share/doc/heartbeat
执行上面的命令可以看到相关的目录
[root@xldwhj ~]# rpm -q heartbeat -d
/usr/share/doc/heartbeat-3.0.4/AUTHORS
/usr/share/doc/heartbeat-3.0.4/COPYING
/usr/share/doc/heartbeat-3.0.4/COPYING.LGPL
/usr/share/doc/heartbeat-3.0.4/ChangeLog
/usr/share/doc/heartbeat-3.0.4/README
/usr/share/doc/heartbeat-3.0.4/apphbd.cf
/usr/share/doc/heartbeat-3.0.4/authkeys
/usr/share/doc/heartbeat-3.0.4/ha.cf
/usr/share/doc/heartbeat-3.0.4/haresources
/usr/share/man/man1/cl_status.1.gz
/usr/share/man/man1/hb_addnode.1.gz
/usr/share/man/man1/hb_delnode.1.gz
/usr/share/man/man1/hb_standby.1.gz
/usr/share/man/man1/hb_takeover.1.gz
/usr/share/man/man5/authkeys.5.gz
/usr/share/man/man5/ha.cf.5.gz
/usr/share/man/man8/apphbd.8.gz
/usr/share/man/man8/heartbeat.8.gz
查找到3个配置文件ha.cf,haresources,authkeys的位置在/usr/share/doc/heartbeat-3.0.4/下,将其拷贝到/etc/ha.d目录下
2.2 HeartBeat的配置
ha.cf定义心跳信息层,用于实现心跳信息传输。
xldwhj上ha.cf的配置如下:
[root@xldwhj ~]# vim /etc/ha.d/ha.cf
logfile /var/log/ha-log #ha的日志文件记录位置。如没有该目录,则需要手动添加
logfacility local0
keepalive 2 #设定心跳(监测)时间时间为2秒
deadtime 30 #超出该时间间隔未收到对方节点的心跳,则认为对方已经死亡
warntime 10 #超出该时间间隔未收到对方节点的心跳,则发出警告并记录到日志中
initdead 120 #在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。
udpport 694 #使用udp端口694进行心跳监测(bcast和ucast通信),这是默认的,并且在IANA官方注册的端口号。
ucast eth0 192.168.42.3 #采用网卡eth0的udp单播来通知心跳,ip为对方ip
auto_failback on #heartbeat的两台主机分别为主节点和从节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给从节点并由从节点运行服务。在该选项设为on的情况下,一旦主节点恢复运行,则自动获取所有资源。
watchdog /dev/watchdog
node xldwhj #节点1,必须要与uname -n指令得到的结果一致。
node xldroot #节点2
ping 192.168.184.1 #通过ping网关来监测网络是否正常。
hopfudge 1
deadping 30
xldroot上ha.cf的配置如下:
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
ucast eth0 192.168.42.2
auto_failback on
node xldwhj
node xldroot
ping 192.168.184.1
hopfudge 1
deadping 30
xldwhj与xldroot上的haresources,authkeys配置相同。
authkeys的配置如下:
[root@xldwhj ~]# vim /etc/ha.d/authkeys
auth 1 #指定的认证方式,数字是后面所列的方法的一种,最简单的是crc,最复杂的是sha1,下面的列表必须按顺序来,不能只有2,没有1,而且这里指定的方法必须是下面列表有的
1 crc
在haresources的配置文件中加入如下内容:
[root@xldwhj ~]# vim /etc/ha.d/haresources //决定那一个服务器是主节点
xldwhj IPaddr::192.168.184.200/24/eth1 httpd
或
xldwhj IPaddr::192.168.184.200/24/eth1 mysqld
3 HeartBeat测试
在启动heartbeat之前,在xldwhj与xldroot上首先查看httpd的状态:
[root@xldwhj ~]# netstat -nlp | grep httpd
[root@xldwhj ~]#
可知httpd未启动。
启动两台服务器上的heartbeat:
[root@xldwhj ~]#/etc/init.d/heartbeat start
或者
[root@xldwhj ~]#service heartbeat start
xldwhj(主)上的命令操作:
[root@xldwhj ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ef:76:a8 brd ff:ff:ff:ff:ff:ff
inet 192.168.42.2/24 brd 192.168.42.255 scope global eth0
inet6 fe80::20c:29ff:feef:76a8/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ef:76:b2 brd ff:ff:ff:ff:ff:ff
inet 192.168.184.128/24 brd 192.168.184.255 scope global eth1
inet 192.168.184.200/24 brd 192.168.184.255 scope global secondary eth1
inet6 fe80::20c:29ff:feef:76b2/64 scope link
valid_lft forever preferred_lft forever
虚拟IP已存在。
[root@xldwhj ~]# netstat -nlp | grep httpd
tcp 0 0 :::80 :::* LISTEN 3121/httpd
httpd已启动。
xldroot(从)上的命令操作:
[root@xldroot ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:53:74:85 brd ff:ff:ff:ff:ff:ff
inet 192.168.42.3/24 brd 192.168.42.255 scope global eth0
inet6 fe80::20c:29ff:fe53:7485/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:53:74:8f brd ff:ff:ff:ff:ff:ff
inet 192.168.184.130/24 brd 192.168.184.255 scope global eth1
inet6 fe80::20c:29ff:fe53:748f/64 scope link
valid_lft forever preferred_lft forever
未发现虚拟IP存在
[root@xldroot ~]# netstat -nlp | grep httpd
[root@xldroot ~]#
httpd未启动
打开网页,输入虚拟IP地址:192.168.184.200,出现如下内容:
关闭xidwhj虚拟机:
[root@xldwhj html]# shutdown now
在xldroot上的操作如下:
[root@xldroot html]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:53:74:85 brd ff:ff:ff:ff:ff:ff
inet 192.168.42.3/24 brd 192.168.42.255 scope global eth0
inet6 fe80::20c:29ff:fe53:7485/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:53:74:8f brd ff:ff:ff:ff:ff:ff
inet 192.168.184.130/24 brd 192.168.184.255 scope global eth1
inet 192.168.184.200/24 brd 192.168.184.255 scope global secondary eth1
inet6 fe80::20c:29ff:fe53:748f/64 scope link
valid_lft forever preferred_lft forever
可以看到虚拟IP悬浮于xldroot虚拟机的网卡下:
[root@xldroot html]# netstat -nlp | grep httpd
tcp 0 0 :::80 :::* LISTEN 2330/httpd
打开网页,输入虚拟IP地址,出现如下内容:
此时重启xldwhj服务:
[root@xldwhj ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ef:76:a8 brd ff:ff:ff:ff:ff:ff
inet 192.168.42.2/24 brd 192.168.42.255 scope global eth0
inet6 fe80::20c:29ff:feef:76a8/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ef:76:b2 brd ff:ff:ff:ff:ff:ff
inet 192.168.184.128/24 brd 192.168.184.255 scope global eth1
inet 192.168.184.200/24 brd 192.168.184.255 scope global secondary eth1
inet6 fe80::20c:29ff:feef:76b2/64 scope link
valid_lft forever preferred_lft forever
可以看出,自动抢占虚拟IP地址。
而xldroot上
[root@xldroot html]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:53:74:85 brd ff:ff:ff:ff:ff:ff
inet 192.168.42.3/24 brd 192.168.42.255 scope global eth0
inet6 fe80::20c:29ff:fe53:7485/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:53:74:8f brd ff:ff:ff:ff:ff:ff
inet 192.168.184.130/24 brd 192.168.184.255 scope global eth1
inet6 fe80::20c:29ff:fe53:748f/64 scope link
valid_lft forever preferred_lft forever
虚拟IP地址已不见。
测试完成,HeartBeat安装与配置成功