heartbeat:双机热备实现Web服务的高可用

  • 2017-08-29
  • 39
  • 0
  • 2

1、概述


Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里,由 heartbeat 模块实现了这两个功能。

通过heartbeat,可以将资源从一台已经故障的计算机快速转移到另一台运转的机器上继续提供服务。

官网:http://www.linux-ha.org/wiki/Main_Page

1.1 工作原理

主备模式:通过修改heartbeat软件的配置文件,可以指定哪一台heartbeat服务器为主服务器,则另一台将自动成为热备服务器。然后在热备服务器上配置heartbeat守护进程来监听来自主服务器的心跳消息。如果热备服务器在指定时间内未监听到来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务的所有权,接替主服务器继续不间断地提供服务,从而达到资源及服务高可用性的目的。

1.2 切换条件

触发heartbeat切换的常见条件:

  1. 服务器宕机;
  2. heartbeat服务本身故障;
  3. 心跳连接故障;

:应用服务故障不会导致heartbeat切换。

 

1.3 heartbeat通信的方法

两台heartbeat主机之间通信的可行方法:

  1. 一条串行线直连,缺点是距离不能太远,常用;
  2. 一条网线直连,常用;
  3. 用网线通过交换机等网络设备连接,不推荐用,增加了故障点,容易受链路的其他数据传输影响,导致心跳报文发送问题;

 

1.4 heartbeat目录与文件

/etc/ha.d/resource.d/:资源目录,用来存放脚本,自己开发的脚本也放这里,在haresource文件调用这些脚本。

存放配置文件的目录:/etc/ha.d

配置文件有3个,分别是:

  1. ha.cf ,heartbeat参数配置文件 在这里配置heartbeat的一些基本参数;
  2. authkey,heartbeat认证文件 高可用服务器之间,根据对方的authkey进行认证;
  3. haresource,heartbeat资源配置文件 配置IP资源及脚本程序等;

裂脑:由于两台高可用服务器之间在指定时间内,无法互相检测到对方心跳而各自启动故障转移功能,取得了资源及服务的所有权,但此时这两台高可用服务器还活着,这样会导致同一个VIP在两端同时启用而发生数据冲突或丢失的问题。

 

1.5 关于裂脑

1.5.1 导致裂脑的原因

一般来说,有以下原因导致裂脑:

  • 高可用服务器之间的心跳线链路故障,导致通信异常,例如心跳线坏了、网卡或网卡驱动坏了、IP配置冲突、仲裁的设备出问题;
  • 高可用服务器上开启了防火墙,阻挡了心跳消息传输;
  • 高可用服务器的心跳网卡地址等配置不正确,导致发送心跳失败;
  • 软件BUG等

 

1.5.2 如何防止裂脑

实际生产环境中,可以通过以下的方法防止裂脑:

  1. 同时使用串行线和网线连接,一条线路坏了,另一条依然能传送心跳消息;
  2. 检测到裂脑时,强行关闭其中一台高可用服务器,这个功能需要特殊设备支持,如Stonish、Fence(IPMI,智能电源管理设备,简单的说就是远程管理卡,不同服务器厂商的服务器可能不同,但实现的功能类似)等;
  3. 做好对裂脑的监控报警;
  4. 启用磁盘锁,正在服务的一方锁住共享磁盘,防止在裂脑发生时,对方来抢共享磁盘的资源,但若占用共享盘的一方不主动解锁,则另一方永远得不到共享磁盘,所以正在服务的一方只在发现心跳线全部断开的时候才启用磁盘时,平时则不上锁;
  5. 增加仲裁机制:
    1. 当心跳线完全断开的时候,2个节点都各自ping一个参考IP,若不通则表明断点在本端,不仅心跳线还有对外服务的本地网络链路也终端,ping不通的一方可以设置自动重启以释放占用的资源;
    2. 通过第三方软件仲裁谁该获得资源;

 

2、heartbeat部署


主机名 系统 eth0 eth1
HA-M CentOS release 6.9 (Final) 192.168.10.83 192.168.20.13
HA-S CentOS release 6.9 (Final) 192.168.10.84 192.168.20.14

通过VMware WorkStation来模拟生产环境,每台主机配置双网卡。

heartbeat版本:3.0.4

nginx版本:1.12

eth0:对外服务接口

eth1:心跳线直连

VIP:192.168.10.80

:需关闭iptables和SElinux

wKioL1mlXM_DRl8PAABp2khCMmk316.png-wh_50

 

2.1 修改host

两台主机都配置以下主机名:

1
2
3
4
cat >>/etc/hosts<<eof
192.168.10.83 HA-M
192.168.10.84 HA-S
eof

 

2.1.1 HA-M测试

1
2
3
4
5
6
7
8
[root@HA-M ~]#ping HA-S
PING HA-S (192.168.10.84) 56(84) bytes of data.
64 bytes from HA-S (192.168.10.84): icmp_seq=1 ttl=64 time=0.287 ms
64 bytes from HA-S (192.168.10.84): icmp_seq=2 ttl=64 time=0.420 ms
^C
--- HA-S ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1367ms
rtt min/avg/max/mdev = 0.287/0.353/0.420/0.069 ms

 

2.1.2 HA-S测试

1
2
3
4
5
6
7
8
[root@HA-S ~]#ping HA-S
PING HA-S (192.168.10.84) 56(84) bytes of data.
64 bytes from HA-S (192.168.10.84): icmp_seq=1 ttl=64 time=0.014 ms
64 bytes from HA-S (192.168.10.84): icmp_seq=2 ttl=64 time=0.057 ms
^C
--- HA-S ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1337ms
rtt min/avg/max/mdev = 0.014/0.035/0.057/0.022 ms

 

2.2 配置路由

2.2.1 HA-M配置路由

1
2
route add -host 192.168.20.14 dev eth1
echo 'route add -host 192.168.20.14 dev eth1'>>/etc/rc.local

 

2.2.2 HA-S配置路由

1
2
route add -host 192.168.10.13 dev eth1
echo 'route add -host 192.168.10.13 dev eth1'>>/etc/rc.local

 

2.3 安装heartbeat

:安装heartbeat前需要安装第三方源,这里用的是中科大的epel源。

两台主机均执行以下命令:

1
yum -y install heartbeat*

 

两台均执行,复制模板到/etc/had.d/目录下:

1
2
cd /usr/share/doc/heartbeat-3.0.4/
cp ha.cf haresources authkeys /etc/ha.d/

 

2.4 配置文件说明

2.4.1 ha.cf文件说明

参数 说明
debugfile /var/log/ha-debug 调试日志存放位置。
logfile /var/log/ha-log 日志存放位置。
logfacility local1 在syslog服务中配置通过local1接收日志。
keepalive 2 指定心跳间隔时间为2秒,即每秒发一次广播。
deadtime 30 若备用节点在30秒内无法收到主节点心跳信号,则接管主节点的资源。
warntime 10 当10秒后备份节点未接收到主节点心跳,则会在日志里写入一个告警,此时不会切换服务。
initdead 120 首次运行后,需要等待120秒才能启动主服务器的任何资源,取值至少为deadtime的两倍,单机启动会遇到VIP绑定很慢,这是因为该值设置长。
bcast eth1 指定心跳在eth1接口上广播,如使用多个网卡,则在后面以空格间隔填入网卡名。
mcast eth1 225.0.0.1 694 1 0 采用udp多播来通知心跳,建议在副节点不只一台时使用,694为端口
auto_failback on 用于当主节点恢复后,是否将服务自动切回。
node Ha-01 主节点的主机名。
node Ha-02 备节点的主机名。
crm no 是否开启集群资源管理功能。

2.4.2 authkeys文件说明

1
2
Authentication file.  Must be mode 600。   # 权限必须为600
Available methods: crc sha1, md5.  Crc doesn't need/want a key.   # 可以用的认证方式

 

2.5 参数配置

2.5.1 authkeys配置

两台均执行权限设置:

1
2
cd /etc/ha.d/
chmod 600 authkeys

修改authkeys文件:

1
2
3
4
cat >>authkeys<<eof
auth 1
1 sha1 hello
eof

 

2.5.2 haresources配置

两台均执行以下命令:

1
echo 'HA-M IPaddr::192.168.10.80/24/eth0:0' >>haresources

 

2.5.3 ha.cf配置

配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local1
keepalive 2
deadtime 30
warntime 10
initdead 120
#bcast  eth1
mcast eth1 225.0.0.10 694 1 0
auto_failback on
node    HA-M
node    HA-S
crm no

 

2.6 启动并测试heartbeat

分别启动主备服务器的heartbeat服务:

1
/etc/init.d/heartbeat start

 

可以观察HA-M主机上的VIP已经启动:

1
2
3
4
5
[root@HA-M ha.d]#ip add|grep 192.168.10
inet 192.168.10.83/24 brd 192.168.10.255 scope global eth0
inet 192.168.10.80/24 brd 192.168.10.255 scope global secondary eth0:0
[root@HA-S ha.d]#ip add|grep 192.168.10
inet 192.168.10.84/24 brd 192.168.10.255 scope global eth0

 

关闭HA-M的heartbeat服务:

1
/etc/init.d/heartbeat stop

 

观察到HA-M的VIP已关闭,并在HA-S上起来:

1
2
3
4
5
[root@HA-M ha.d]#ip add|grep 192.168.10
inet 192.168.10.83/24 brd 192.168.10.255 scope global eth0
[root@HA-S ha.d]#ip add|grep 192.168.10
inet 192.168.10.84/24 brd 192.168.10.255 scope global eth0
inet 192.168.10.80/24 brd 192.168.10.255 scope global secondary eth0:0

 

HA-M再次启动heartbeat服务:

1
2
3
4
5
[root@HA-M ha.d]#ip add|grep 192.168.10
inet 192.168.10.83/24 brd 192.168.10.255 scope global eth0
inet 192.168.10.80/24 brd 192.168.10.255 scope global secondary eth0:0
[root@HA-S ha.d]#ip add|grep 192.168.10
inet 192.168.10.84/24 brd 192.168.10.255 scope global eth0

 

3、应用服务的高可用性测试


3.1 Nginx安装

两台均安装nginx,执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
yum install -y pcre-devel openssl-devel
useradd nginx -s /sbin/nologin -M
wget http://nginx.org/download/nginx-1.12.0.tar.gz
tar zxf nginx-1.12.0.tar.gz
cd nginx-1.12.0
./configure --user=nginx --prefix=/app/nginx-1.12.0/ --with-http_stub_status_module --with-http_ssl_module
make && make install
ln -s /app/nginx-1.12.0 /app/nginx
/app/nginx/sbin/nginx -t
/app/nginx/sbin/nginx
lsof -i :80
netstat -lnt|grep 80

 

3.2 创建测试网页

HA-M:

1
echo '192.168.10.83'>>/app/nginx-1.12.0/html/index.html

HA-S:

1
echo '192.168.10.84'>> /app/nginx-1.12.0/html/index.html

打开http://192.168.10.80

wKiom1mlX0_ATANtAABLE5Z1PVk770.png-wh_50

 

3.3 验证

关闭HA-M的heartbeat服务:

1
/etc/init.d/heartbeat stop

刷新网页,已经成功切换到备服务器:

wKiom1mlX4PAbxI_AABOIIfDf0w839.png-wh_50

重启HA-M的heartbeat服务:

1
/etc/init.d/heartbeat start

刷新网页,已切换到主服务器:

wKioL1mlX6fwZe5vAABFs5F_Gbo486.png-wh_50

评论

还没有任何评论,你来说两句吧