设为首页 收藏本站
查看: 1359|回复: 0

[经验分享] heartbeat双机热备实现Web服务的高可用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-9-1 13:39:47 | 显示全部楼层 |阅读模式
1、概述
Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里,由 heartbeat 模块实现了这两个功能。
通过heartbeat,可以将资源从一台已经故障的计算机快速转移到另一台运转的机器上继续提供服务。
官网:http://www.linux-ha.org/wiki/Main_Page
1.1 工作原理
主备模式:通过修改heartbeat软件的配置文件,可以指定哪一台heartbeat服务器为主服务器,则另一台将自动成为热备服务器。然后在热备服务器上配置heartbeat守护进程来监听来自主服务器的心跳消息。如果热备服务器在指定时间内未监听到来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务的所有权,接替主服务器继续不间断地提供服务,从而达到资源及服务高可用性的目的。
1.2 切换条件
触发heartbeat切换的常见条件:
  • 服务器宕机;
  • heartbeat服务本身故障;
  • 心跳连接故障;

注:应用服务故障不会导致heartbeat切换。
1.3 heartbeat通信的方法
两台heartbeat主机之间通信的可行方法:
  • 一条串行线直连,缺点是距离不能太远,常用;
  • 一条网线直连,常用;
  • 用网线通过交换机等网络设备连接,不推荐用,增加了故障点,容易受链路的其他数据传输影响,导致心跳报文发送问题;

1.4 heartbeat目录与文件
/etc/ha.d/resource.d/:资源目录,用来存放脚本,自己开发的脚本也放这里,在haresource文件调用这些脚本。
存放配置文件的目录:/etc/ha.d
配置文件有3个,分别是:
配置文件名
作用
说明
ha.cf
heartbeat参数配置文件
在这里配置heartbeat的一些基本参数
authkey
heartbeat认证文件
高可用服务器之间,根据对方的authkey进行认证
haresource
heartbeat资源配置文件
配置IP资源及脚本程序等
1.5 关于裂脑
裂脑:由于两台高可用服务器之间在指定时间内,无法互相检测到对方心跳而各自启动故障转移功能,取得了资源及服务的所有权,但此时这两台高可用服务器还活着,这样会导致同一个VIP在两端同时启用而发生数据冲突或丢失的问题。
1.5.1 导致裂脑的原因
一般来说,有以下原因导致裂脑:
1. 高可用服务器之间的心跳线链路故障,导致通信异常,例如心跳线坏了、网卡或网卡驱动坏了、IP配置冲突、仲裁的设备出问题;
2. 高可用服务器上开启了防火墙,阻挡了心跳消息传输;
3. 高可用服务器的心跳网卡地址等配置不正确,导致发送心跳失败;
4. 软件BUG等
1.5.2 如何防止裂脑
实际生产环境中,可以通过以下的方法防止裂脑:
  • 同时使用串行线和网线连接,一条线路坏了,另一条依然能传送心跳消息;
  • 检测到裂脑时,强行关闭其中一台高可用服务器,这个功能需要特殊设备支持,如Stonish、Fence(IPMI,智能电源管理设备,简单的说就是远程管理卡,不同服务器厂商的服务器可能不同,但实现的功能类似)等;
  • 做好对裂脑的监控报警;
  • 启用磁盘锁,正在服务的一方锁住共享磁盘,防止在裂脑发生时,对方来抢共享磁盘的资源,但若占用共享盘的一方不主动解锁,则另一方永远得不到共享磁盘,所以正在服务的一方只在发现心跳线全部断开的时候才启用磁盘时,平时则不上锁;
  • 增加仲裁机制:

    • 当心跳线完全断开的时候,2个节点都各自ping一个参考IP,若不通则表明断点在本端,不仅心跳线还有对外服务的本地网络链路也终端,ping不通的一方可以设置自动重启以释放占用的资源;
    • 通过第三方软件仲裁谁该获得资源;

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
QQ截图20170901133636.png

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
[iyunv@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
[iyunv@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
[iyunv@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
[iyunv@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
[iyunv@HA-M ha.d]#ip add|grep 192.168.10
inet 192.168.10.83/24 brd 192.168.10.255 scope global eth0
[iyunv@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
[iyunv@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
[iyunv@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
QQ截图20170901133645.png

3.3 验证
关闭HA-M的heartbeat服务:
1
/etc/init.d/heartbeat stop



刷新网页,已经成功切换到备服务器:
QQ截图20170901133651.png

重启HA-M的heartbeat服务:
1
/etc/init.d/heartbeat start



刷新网页,已切换到主服务器:
QQ截图20170901133658.png


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-403819-1-1.html 上篇帖子: 第二个节点老是dead状态 下篇帖子: heartbeat v2版CRM的高可用web集群的实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表