heartbeat 与高可用
HA 即 (high available) 高可用,又被叫做双机热备,用于关键性业务。简单理解就是,有 2
台机器 A 和 B ,正常是 A 提供服务, B 待命闲置,当 A 宕机或服务宕掉,会切换至 B 机器继续提
供服务。常见的实现高可用的开源软件有 heartbeat 和 keepalived 。
这样,一台 web 服务器一天 24 小时提供 web 服务,难免会存在 web 服务挂掉或服务器宕机
宕机的情况,那么用户就访问不了服务了,这当然不是我们期望的。如果这样,有 2 台服务器, A 对外
提供 web 服务, B 作为备用,如果 A 挂掉,那么 B 立刻替代 A 的位置去提供 web 服务,这样对用
户来说是透明的。但是有个问题,服务器 A 的 ip 是 10.0.0.100 ,服务器 B 的 ip 是
10.0.0.101 ,显然向用户提供 A 或 B 的 ip 地址是不可行的,因为用户总不能去切换 ip 来访问的吧。
这时 heartbeat 或 keepalived 可以提供一个虚拟 IP : 10.0.0.102 ,用户只需要访问
10.0.0.102 ,当 A 提供服务时, VIP 会设置在 A 服务器上,当 B 提供服务时, VIP 会设置在 B 服
务器上,这样就可以让用户通过访问 10.0.0.102 来获取 web 服务,即使 A 或 B 服务器切换也不影
响用户的正常访问。
实验环境:
服务器 A :
主机名: server1
操作系统: CentOS6.5 64 位
eth0 网卡地址: 172.25.254.1
eth1 网卡地址: 172.25.1.254
服务器 B :
主机名: server2
操作系统: CentOS6.5 64 位
eth0 网卡地址: 172.25.254.2
eth1 网卡地址: 172.25.2.254
虚拟 VIP :
VIP : 172.25.254.10
设置主机名关闭防火墙与 selinux (两台服务器都需要)
# setenforce 0
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
两台主机均安装 heartbeat
heartbeat 安装:
先配置 yum 源:
[westos]
name=westos
baseurl=http://172.25.254.17/rhel6.5
gpgcheck=0
[HighAvailability]
name=HighAvailabilitybaseurl=http://172.25.254.17/rhel6.5/HighAvailability/
gpgcheck=0
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.254.17/rhel6.5/LoadBalancer/
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.254.17/rhel6.5/ScalableFileSystem/
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.254.17/rhel6.5/ResilientStorage/
gpgcheck=0
安装:
[root@server1 heartbeat]# ls
heartbeat-3.0.4-2.el6.x86_64.rpm
heartbeat-libs-3.0.4-2.el6.x86_64.rpm
heartbeat-devel-3.0.4-2.el6.x86_64.rpm ldirectord-3.9.5-3.1.x86_64.rpm
[root@server1 heartbeat]# yum install * -y
配置:
Heartbeat 的主要配置文件有 ha.cf 、 haresources 、 authkeys ,在 Heartbeat 安装后,默认并没有这三个
文件,可以拷贝示例配置文件然后根据实际情况进行修改
# cd /usr/share/doc/heartbeat-3.0.4/
# cp authkeys ha.cf haresources /etc/ha.d/
# cd /etc/ha.d
修改主配置文件 (vim /etc/ha.d/ha.cf)
以下过滤结果为需要修改的条目:
[root@rhel6-vm3 ha.d]# sed -n ‘/#/!p’ ha.cf
Heartbeat 的主要配置文件有 ha.cf 、 haresources 、 authkeys ,
在 Heartbeat 安装后,默认并没有这三个文件,可以拷贝示例配置文件然后根据实际情况进行修改:
# cd /usr/share/doc/heartbeat-3.0.4/
# ls
apphbd.cf authkeys haresources README
AUTHORS ChangeLog COPYING COPYING.LGPL ha.cf
# cp ha.cf haresources authkeys /etc/ha.d
修改主配置文件 (vim /etc/ha.d/ha.cf)
以下过滤结果为需要修改的条目:
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
auto_failback on
node server1
node server2
ping 172.25.254.17
respawn hacluster /usr/lib64/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
修改认证文件 (vim /etc/ha.d/authkeys)
authkeys 文件用于设定 heartbeat 的认证方式,共有三种可用的认证方式:crc、md5 和 sha1,三种认
证方式的安全性依次提高,但是占用的系统资源也依次增加。如果 heartbeat 集群运行在安全的网络上,可
以使用 crc 方式,如果 HA 每个节点的硬件配置很高,建议使用 sha1,这种认证方式安全级别最高,如果是
处于网络安全和系统资源之间,可以使用 md5 认证方式。这里我们使用 crc 认证方式,配置如下:
auth 1
1 crc
修改完文件之后需要改权限: chmod 600 authkeys
修改资源文件 (vim /etc/ha.d/haresources)
# virtual in any sense of the word.
####################################需配置项如下
server1 IPaddr::172.25.254.10/24/eth0 httpd
启动服务:
/etc/init.d/heartbeat start
然后通过 ip addr 命令查看主节点的网络配置,可以看到,主节点已经自动绑定了集群的 IP 地址,在
HA 集群之外的主机上通过 ping 命令检测集群 IP 地址 172.6.6.99 是否可达,如果可达则配置成功
[root@server2 ha.d]# ip addr
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 forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen
1000
link/ether 52:54:00:e9:1a:97 brd ff:ff:ff:ff:ff:ff
inet 172.25.254.2/24 brd 172.25.254.255 scope global eth0
inet 172.25.254.10/24 brd 172.25.254.255 scope global secondary eth0
inet6 fe80::5054:ff:fee9:1a97/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 52:54:00:c2:38:44 brd ff:ff:ff:ff:ff:ff
inet 172.25.2.254/24 brd 172.25.2.255 scope global eth1
inet6 fe80::5054:ff:fec2:3844/64 scope link
valid_lft forever preferred_lft forever
[root@localhost ~]# ping 172.25.254.10
PING 172.25.254.10 (172.25.254.10) 56(84) bytes of data.
64 bytes from 172.25.254.10: icmp_seq=1 ttl=64 time=0.285 ms
64 bytes from 172.25.254.10: icmp_seq=2 ttl=64 time=0.308 ms
64 bytes from 172.25.254.10: icmp_seq=3 ttl=64 time=0.324 ms
64 bytes from 172.25.254.10: icmp_seq=4 ttl=64 time=0.300 ms
^C
--- 172.25.254.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.285/0.304/0.324/0.018 ms
[root@localhost ~]# curl 172.25.254.10
<h1>www.westos.rog-server2<h1>
[root@localhost ~]# curl 172.25.254.10
<h1>www.westos.rog-server2<h1>
测试:
正常关闭和重启主节点的 heartbeat 来进行测试看集群 IP 是否切换以及 apache 应用是否切换
[root@server2 ha.d]# /etc/init.d/heartbeat stop
Stopping High-Availability services: Done.
在 server1 ip addr 查看可以发现已经自动绑定上了
[root@server1 ha.d]# ip addr
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 52:54:00:6c:95:1a brd ff:ff:ff:ff:ff:ff
inet 172.25.254.1/24 brd 172.25.254.255 scope global eth0
inet 172.25.254.10/24 brd 172.25.254.255 scope global secondary eth0
inet6 fe80::5054:ff:fe6c:951a/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 52:54:00:b2:fd:45 brd ff:ff:ff:ff:ff:ffinet 172.25.1.254/24 brd 172.25.1.255 scope global eth1
inet6 fe80::5054:ff:feb2:fd45/64 scope link
valid_lft forever preferred_lft forever
测试机上看一下:
[root@localhost ~]# curl 172.25.254.10
<h1> server1 <h1>
[root@localhost ~]# curl 172.25.254.10
<h1> server1 <h1>
测试成功!