学习heartbeat-04 原理及部署
1. Heartbeat介绍
1.1 Heartbeat作用
通过它可以将资源(IP及程序服务等资源)从一台故障计算机快速转移到另一台运转正常的机器继续提供服务,在实际生产应用场景中,heartbeat的功能和另一个高可用开源软件keepalived有很多相同之处
1.2 Heartbeat工作原理
通过修改配置文件,指定哪一台Heartbeat服务器作为主服务器,则另一台将自动成为备份服务器。然后在指定备份服务器上配置Heartbeat守护进程来监听来自主服务器的心跳。如果备份服务器在指定时间内未监听到来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务所有权,接替主服务器继续不间断的提供服务,从而达到资源服务高可用性的目的
以上描述的是Heartbeat主备的模式,Heartbeat还支持主主模式,即两台服务器互为主备,这时它们之间会相互发送报文来告诉对方自己当前的状态,如果在指定的时间内为收到对方发送的心跳报文,那么久认为对方失效或者宕机了,这时就会启动自身的资源接管模块来接管运行在对方主机上的资源或者服务,继续对用户提供服务。正常情况下,可以较好的实现主机故障后,业务仍不间断的持续运行。
1.3 Heartbeat的心跳连接
要部署Heartbeat服务至少需要两台之际来完成。那么这两台主机之间是如何做到互相通信和互相监测的呢?
1)串行电缆(首选,缺点是距离不能太远)
2)一根以太网电缆两网卡(推荐)
3)以太网电缆,通过交换机等网络设备连接(次选)
次选,增加了交换机故障端,同时,线路不是专用心跳线,容易受其他数据传输的 影响。
1.4 Heartbeat裂脑
1)什么是裂脑?
由于两台搞科研服务器对之间在指定时间内,无法互相检查到对法心跳而各自启动故障转移功能,取得了资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务器在两端同时启动而发生冲突的严重问题,最严重的事故两台主机占用一个IP地址,这样会导致两端的数据不一致或造成数据丢失,这种情况被称为裂脑,也有人称其为分区集群或大脑垂直分割,英文为spilt brain
2)导致裂脑发生的多种原因
一般来说,裂脑的发生,有以下几个原因导致
A 高可用服务器对之间心跳链路故障,导致无法正常通信
B 高可用服务器对上开启了防火墙阻挡了心跳消息传输
C 高可用服务器对上心跳网卡抵制等信息配置不正确,导致发送心跳失败
D 其他服务配置不宕机等原因,如心跳方式不同,心跳广播冲突,软件BUG等
3)防止裂脑发生的8种秘籍
A.同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一条还是好的,依然能传送心跳消息
B.检测到裂脑时强行关闭一个心跳节点。相当于程序上备节点发现心跳线故障,发送关机命令到主节点
C.做好裂脑的监控报警(如邮件及手机短信等),在问题发生时人为第一时间介入仲裁,降低损失
D.启用磁盘锁。正在服务一方锁住共享磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动解锁,另一方就永远得不到共享磁盘。现实中假如服务器节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了‘智能’锁。即,正在服务的一方只在发现心跳线全部断开时才启用磁盘锁。平时就不上锁
E.报警在服务器接管之前,给人员处理留足够的时间
F.不直接自动服务器接管,而是由人为人员控制接管‘
G.增加仲裁机制,确定谁该获得资源
例如:设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不同则表明断点就处在本端,不仅心跳线、还有对外服务的本地网络链路断了,这样就主动放弃竞争,让能够ping通参考IP的一段去接管服务。ping不通参考IP的一方可以自我重启,以彻底释放有可能还占用着的那些共享资源。
1.5 Heartbeat消息类型
Heartbeat软件在工作过程中,一般来说,有三种消息类型,具体为
1)心跳消息
心跳消息为约150字节的数据包,可能为单播、广播或多播的方式,控制心跳频率及出现故障要等待多久进行故障转换
2)集群转换消息
ip-request和ip-request-resp
当主服务器恢复在线状态时,通过ip-request消息要求备机释放主服务器失败时备服务器取得的资源,然后备份服务器关闭释放主服务器失败时取得的资源及服务
备服务器释放主服务器失败时取得的资源及服务后,就会通过ip-request-resp消息通知主服务器它不在拥有该资源及服务,主服务器收到来自备节点的ip-request-resp消息通知后,启动失败时释放的资源及服务,并开始提供正常的访问服务
3)重传请求
1.6 Heartbeat IP地址接管和故障转移
Heartbeat是通过IP地址接管和ARP广播进行故障转移的
ARP广播:在主服务器故障时,备用节点接管资源后,会立即强制更新所有客户端本地的ARP表(即清除客户端本地缓存的失败服务器的vip地址和mac地址的解析记录)。确保客户端和新的主服务器对话。
ifconfig eth0:1 192.168.1.181 netmask 255.255.255.224 up (ip alias)
====>heartbeat软件默认是使用这个命令来添加VIP的
ip addr add 192.168.1.181/24 broadcast 192.168.1.255 dev eth1 (辅助ip)
====>keepalived软件默认使用这个命令来添加VIP
1.7 Heartbeat脚本的默认目录
/etc/init.d/
/etc/ha.d/resource.d/
1.8 Heartbeat配置文件
Heartbeat的默认配置文件目录为/etc/ha.d。Heartbeat常用的配置文件有三个,ha.cf、authkey、haresource
配置名称 |
作用 |
备注 |
ha.cf |
heartbeat参数配置文件 |
在这里配置heartbeat的一些基本参数 |
authkey |
heartbeat认证文件 |
高可用服务器对之间根据对端的authkey,对对端进行认证 |
haresource |
heartbeat资源配置文件 |
如配置IP资源及脚本程序等 |
2. Heartbeat部署
2.1逻辑架构图
2.3 Heartbeat服务主机资源规划
名称 |
接口 |
IP |
用途 |
MASTER |
eth0 |
192.168.1.81 |
外网管理IP,用于WAN数据转发 |
eth1 |
192.168.2.81 |
内网管理IP,用于LAN数据转发 |
|
eth2 |
192.168.3.81 |
用于服务器间心跳连接(直连) |
|
vip |
192.168.1.181 |
用于提供应用程序A挂载服务 |
|
BACKUP |
eth0 |
192.168.1.82 |
外网管理IP,用于WAN数据转发 |
eth1 |
192.168.2.82 |
内网管理IP,用于LAN数据转发 |
|
eth2 |
192.168.3.82 |
用于服务器间心跳连接(直连) |
|
vip |
192.168.1.182 |
用于提供应用程序B挂载服务 |
2.4 分别配置hosts文件
MASTER:
echo ‘192.168.2.82 picdata-1-2’ >> /etc/hosts
BACKUP:
echo '192.168.2.81 picdata-1-1' >> /etc/hosts
通过ping ip地址的方法检查测试,看起返回的IP和hosts文件对应的是否相同
2.5 配置服务器间心跳链接
eth2 192.168.3.81 和eth2 192.168.3.82两块网卡之间是通过普通网线直连的,即不通过交换机,直接将两块网卡通过网线连接在一起,用于做心跳检测
在两台机器分别增加一条主机路由,来实现两台机器检查对端时通过通过这个心跳线路检查。
picdata-1-1 Server上增加如下路由
route add -host 192.168.3.82 dev eth2
#这个命令的意思是,从picdata-1-1 Server上访问192.168.3.82,走eth2网卡出去,即使用心跳线路。
echo 'route add -host 192.168.3.82 dev eth2' >> /etc/rc.local
picdata-1-2 Server上增加如下路由:
route add -host 192.168.3.81 dev eth2
#这个命令的意思是,从picdata-1-2 Server上访问192.168.3.81,走eth2网卡出去,即使用心跳线路。
echo 'route add -host 192.168.3.81 dev eth2' >> /etc/rc.local
3. 开始实施部署
3.1 安装heartbeat软件(配置163源)
安装epel扩展源:yum -y install epel-release
yum -y install heartbeat
3.2 配置ha.cf文件
cd /usr/share/doc/heartbeat-3.0.4/
cp authkeys ha.cf haresources /etc/ha.d/
cat ha.cf
#the start by oldboy
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local1
keepalive 2
deadtime 30
warntime 10
initdead 120
#以上四行为一些基础参数,在你配置是一般不需要改动
#bcast eth1
mcast eth2 225.0.0.81 694 1 0 #eth2网卡上用这个频率在694端口上广播,频率必须改,否则会出问题,建议用IP地址最后一位
#此行表示使用多播的方式,需要改动的仅有eth2,改成你的心跳线的那块网卡
auto_failback on #控制失败修复后是否自动回来
node picdata-1-1 #两台存储server的主机名
node picdata-1-2 #两台存储server的主机名
crm no
#the end by oldboy
ha.cf文件详细说明
参数 |
说明 |
debugfile /var/log/ha-debug |
heartbeat的调试日志存放位置 |
logfile /var/log/ha-log |
heartbeat的日志存放位置 |
logfacility local1 |
在syslog服务中配置通过local1设备接收日志 |
keepalive 2 |
指定心跳间隔为2秒 |
deadtime 30 |
指定若备用节点在30 秒内没有收到主节点的心跳信号,则立即接管主节点的服务资源 |
warntime 10 |
指定心跳延迟的时间为10秒。当秒钟内备份节点不能接收到主节点的心跳信号时,就会往日志中写入一个警告日志,但此时不会切换服务 |
initdead 120 |
指定在HEARTBEAT首次运行后需要等待120秒才启动主服务器的任何资源。该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。单机启动时会遇到vip绑定很慢,为正常现象 |
#bcast eth1 |
指定心跳使用以太网广播方式在eth1接口上进行广播。如使用两个实际网络来传送心跳则#bcast eth0 eth1 |
mcast eth2 225.0.0.181 694 1 0 |
设置广播通信使用的端口,694为默认使用的端口号 |
auto_failback on |
用来定义当主节点恢复后,是否将服务自动切回 |
node picdata-1-1 |
主节点名,可以通过命令uname -n 查看 |
node picdata-1-2 |
备节点名,可以通过命令uname -n 查看 |
crm no |
是否开启Cluster Resource Manager(集群资源管理)功能 |
3.3 配置authkey文件
cat authkey
auth 1
1 sha1 47e9336850f1db6fa58bc470bc9b7810eb397f04
chmod 600 /etc/ha.d/authkey
注:两台机器都需要配置
3.4 配置haresource文件
cat /etc/ha.d/haresource
picdata-1-1 IPaddr::192.168.1.81/24/eth0
配置好从服务器(主从的配置文件除了ha.cf中的mcast eth2 225.0.0.181 694 1 0,其余的都一样)
启动heartbeat服务
/etc/init.d/heartbeat start
此时在MASTER主机上ifconfig命令查看会有eth0:0,当MASTER挂掉后备服务器上会有eth0:0
此时在主heartbeat服务器上执行hb_standby脚本把本地设置成为standy,即模拟heartbeat服务器宕机(和停止heartbeat的效果差不多),然后看备份机器的接管情况
4. heartbeat实现web服务高可用案例
4.1 部署准备
目的:通过一个web服务高可用案例带领大家进一步熟悉heartbeat软件的使用
资源:延用上面的两台机器,机器名分别为picdata-1-1和picdata-1-2
4.2 安装配置http服务
在两台机器上分别安装http服务
yum -y install httpd
4.3 修改heartbeat配置(主备两台都需要修改)
vim /etc/ha.d/haresources
picdata-1-1 IPaddr::192.168.1.81/24/eth0 httpd
/etc/init.d/heartbeat stop
/etc/init.d/heartbeat start
此时会httpd也会随之heartbeat启动而启动(netstat -lnt 检查80端口已经开启)
4.4 有关heartbeat调用httpd脚本的说明
1)httpd命令需要放在/etc/init.d/下或者/etc/ha.d/resource.d下
2)httpd命令需要具备可执行权限(x)
3)httpd必须支持如下启动方式
/etc/init.d/httpd
Usage: httpd {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}
4.5 有关heartbeat调用资源的生产场景应用
在实际工作中有两种常见方法实现高可用问题:
1)heartbeat可以仅控制vip资源的漂移,不负责服务资源的启动及停止
2)heartbeat即控制vip资源的漂移,同时又控制服务器资源启动及停止
VIP正常,httpd服务宕了,这个时候不会做高可用切换,写个简单的脚本定时或守护进程判断httpd服务,如果有问题,则停止heartbeat,主动使其上的业务到另一台
4.6 扩展,配置mysql高可用
Mysql的高可用实现方式和httpd基本是一样的,只是httpd后端用了共享存储,所以,这里不需要做数据同步了。而mysql后端没有用存储,所以,在做高可用之前,要把两台机器做成主从同步或者主主同步。
vim /etc/ha.d/haresources (数据库是内容,所有绑定到eth1网卡)
picdata-1-1 IPaddr::192.168.2.181/24/eth1 mysqld
4.7 heartbeat和keepalived的应用场景区别
1)对于一般的web,db,负载均衡(nginx,haproxy)等等,heartbeat和keepalived都可以实现。
2)lvs负载均衡最好和keepalived结合(heartbeat调用带有ipvsadm命令的脚本启动停止lvs,并且heartbeat没有对rs的健康检查功能,但是可以通过ldircetord来补足健康检查的功能)
3)需要数据同步的高可用业务最好用heartbeat,例如:mysql双主多从,NFS/MFS存储,他们的特点是选哦数据同步,这样的业务最好用heartbeat。因为heartbeat自带了drdb的脚本。如果解决了数据同步不要drdb,例如:共享存储或者inotify+rsync,就可以考虑keepalived。
4)运维人员对那个更熟悉就用哪个,其实,就是你要能控制维护你搭建的服务
4.8 heartbeat服务生产环境选维护要点
在我们每天的实战运维工作中,当有新项目上线或者VIP更改需求是,可能会进行添加修改服务VIP的操作。
1)在修改配置前执行/etc/init.d/heartbeat stop或/usr/lib64/heartbeat/hb_standby(此命令最好),把本机业务推到备节点工作,当query备节点工作正常后,开始修改本地的配置,修改好后可以执行/etc/init.d/heartbeat start把资源服务接管回来。记得在把业务推到备节点时及修改配置接管回服务是都要立即服务是否正常工作,特别是所有的VIP是否启动OK,URL地址是不是能够打开,这个检查过程可以写成脚本放heartbeat服务启动脚本的参数里等。
2)先修改好一段的配置,然后同步到另一端
/etc/init.d/heartbeat stop
/etc/init.d/heartbeat start
ifconfig | egrep “ip1|ip2”
wget url
准备好后,拷贝粘贴同时执行上面3条命令,执行完毕后看看ip是否OK,如果5秒IP不OK,则需要回滚配置或者再次推到备节点
3)通过heartbeat自带的如下命令临时增加IP,并修改配置但不重启,然后在流量低谷或者夜里重启服务器
/etc/ha.d/resource.d/IPaddr 192.168.1.200/eth0 start
总结:负载均衡和高可用服务器的位置一般来说都非常重要,因此,操作时一定要谨慎小心,一定要记得事先写好操作步骤及回滚步骤,然后再去实施操作,不要逞匹夫之勇,直接动手操作,那样会极容易导致网站宕机影响用户体验,特别是涉及到数据库和存储高可用的heartbeat的维护更加要小心。
要经常查看heartbeat服务日志
cat /var/log/ha.log