首页 > 技术文章 > heartbeat负载均衡详解

fengzhongzhuzu 2018-05-17 16:50 原文

heartbeat高可用软件
http://www.linux-ha.org/wiki/Main_Page

1 heartbeat作用
通过heartbeat将资源(IP)从一台已经故障的计算机快速转移到另一台正常运行的机器上继续提供服务,
一般称为高可用.实际生产中应用场景,heartbeat功能和另一个高可用开源软件keepalive有相同之处。
在我们生产中实际的业务应用有所区别。

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

以上描述的是Heartbeat主备的模式,Heartbeat还支持主主模式,即两台服务器互为主备,
这时它们之间会相互发送报文来告诉对方自己当前的状态,如果在指定的时间内为收到对方发送的心跳报文,那么久认为对方失效或者宕机了,这时就会启动自身的资源接管模块来接管运行在对方主机上的资源或者服务,继续对用户提供服务。正常情况下,可以较好的实现主机故障后,业务仍不间断的持续运行。
所谓的业务不间断,在故障转移期间也是需要切换时间的,heartbeat切换时间是5-20s
另外,和keepalived一样,heartbeat高可用是服务器级别的,不是服务级别的
切换的常见条件:
1)服务器宕机
2)heartbeat服务本身故障
3)心跳连接线故障(可能是网线,接口)
服务故障不会导致切换,可以通过服务宕机把heartbeat服务停掉
简单来说,一台做主,一台做备,主上有vip,一旦宕机,会在5-20s内vip启动并切换到备上,实现高可用

3 Heartbeat的心跳连接

要部署Heartbeat服务至少需要两台之际来完成。那么这两台主机之间是如何做到互相通信和互相监测的呢?

实际生产中,可以使用1和2,1或2,双保险。
1)串行电缆(首选,缺点是距离不能太远,不需要配ip地址)
2)一根以太网电缆两网卡直连(推荐,生产环境常用方式,缺点网卡ip配错,网卡坏了)
3)以太网电缆,通过交换机等网络设备连接(次选)
次选,增加了交换机故障端,同时,线路不是专用心跳线,容易受其他数据传输的影响。

4 heartbeat裂脑
1) 介绍

比方说:如果两台服务用以太网电缆两网卡直连,但是呢,电缆故障,导致备用的服务器vip启动起来,比方说:如果两台服务用以太网电缆两网卡直连,但是呢,电缆故障,导致备用的服务器vip启动起来,
数据库启动,所以用户同一个ip访问的时候两台服务器上的数据不同,导致不一致或者丢失,这种情况叫脑裂。

由于两台服务器对之间在指定时间内,无法互相检查到对法心跳而各自启动故障转移功能,取得了资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务器在两端同时启动而发生冲突的严重问题,最严重的事故两台主机占用一个IP地址,这样会导致两端的数据不一致或造成数据丢失,这种情况被称为裂脑,也有人称其为分区集群或大脑垂直分割,英文为spilt brain

2)导致裂脑发生的多种原因

一般来说,裂脑的发生,有以下几个原因导致

A 高可用服务器对之间心跳链路故障,导致无法正常通信
  1心跳线坏了(断了,老化)
  2网卡及其相关驱动坏了,ip配置及冲突问题。(网卡直连)
  3交换机故障,心跳线间连接的设备故障(网卡及交换机)
  4仲裁的机器出问题
B 高可用服务器对上开启了防火墙阻挡了心跳消息传输
C 高可用服务器对上心跳网卡抵制等信息配置不正确,导致发送心跳失败
D 其他服务配置不宕机等原因,如心跳方式不同,心跳广播冲突,软件BUG等

3)防止裂脑发生的8种秘籍

A.同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一条还是好的,依然能传送心跳消息(建议使用这个,多年内不会出问题)
B.检测到裂脑时强行关闭一个心跳节点。(这个功能需特殊设备支持,如Stonith,fence)相当于程序上备节点发现心跳线故障,发送关机命令到主节点
  也就是说如果某线路断了,只要心跳没检测到,备用vip启动,强制杀死主vip。人工手动启动主vip
C.做好裂脑的监控报警(如邮件及手机短信等),在问题发生时人为第一时间介入仲裁,降低损失
  百度监控有上行和下行。和人工交互的过程。
  在实施高可用方案时,根据业务实际需求确定是否能容忍这样的损失。
  对于一般的网站常规业务,这个损失是可控的。
D.启用磁盘锁。正在服务一方锁住共享磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动解锁,另一方就永远得不到共享磁盘。现实中假如服务器节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了‘智能’锁。即,正在服务的一方只在发现心跳线全部断开时才启用磁盘锁。平时就不上锁
E.报警在服务器接管之前,给人员处理留足够的时间
    1分钟内报警了,但是服务器此时没有接管,而是5分钟接管,接管时间长,数据不会丢,导致用户无法写数据。
F.不直接自动服务器接管,而是由人为人员控制接管‘
G.增加仲裁机制,确定谁该获得资源

例如:设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不同则表明断点就处在本端,不仅心跳线、还有对外服务的本地网络链路断了,这样就主动放弃竞争,让能够ping通参考IP的一段去接管服务。ping不通参考IP的一方可以自我重启,以彻底释放有可能还占用着的那些共享资源。



了解fence和stonith
有关fence设备和仲裁机制

    fence只是HA集群环境下的术语,在硬件领域,fence设备其实就是一个智能电源管理设备(IPMI)或远程管理卡,fence有外部fence和内部fence(插在服务器里),不管是内部还是外部fence,这些设备都是带有以太网口的,用来在HA切换触发时通过网络重启提供资源服务的服务器
    内部fence:
    IBM:RSA,RSAII
    HP:ILO,ILO2
    DELL:iDRAC,iDRAC3
   外部fence设备:

Stonith概述

    stonith是“shoot the other node in the head”的首字母简写,它是Heartbeat软件包的一个组件,它允许使用一个远程或“智能的”连接到健康服务器的电源设备自动重启失效服务器的电源,stonith设备可以关闭电源并响应软件命令,运行Heartbeat的服务器可以通过串口线或网线向stonith设备发送命令,它控制高可用服务器对中其他服务器的电力供应,换句话说,主服务器可以复位备用服务器的电源,备用服务器也可以复位主服务器的电源。
注意:尽管理论上连接到远程或“智能的”循环电源系统的电力设备的数量是没有限制的,但大多数stonith实现只使用两台服务器,因为双服务器stonith配置是最简单的,最容易理解,它能够长时间运行且不会降低系统的可靠性和高可用性

Stonith事件触发工作步骤:

    1)、当备用服务器听不到心跳时Stontih事件开始。
    注意:这并不一定意味着主服务器没有发送心跳,心跳可能有多种原因而没有抵达备用服务器,这就是为什么建议至少需要两条物理路径传输心跳以避免出现假象的原因了。
    2)、备用服务器发出一个Stonith复位命令到Stonith设备。
    3)、Stonith设备关闭主服务器的电力供应。
    4)、一经切断主服务器的电源,它就不能再访问集群资源,也不能再为客户端提供资源,保证客户端计算机不能访问主服务器上的资源,排除可能发生的头脑分裂状态。
    5)、然后备用服务器获得主服务器的资源,Heartbeat用start参数运行资源脚本,并执行ARP欺骗广播以便客户端计算机发送它们的请求到它的网络接口上。

6 heartbeat消息类型
三种:
心跳消息
集群转换消息
重传消息

心跳消息
心跳消息为约150字节的数据包,可能为单播,广播或多播的方式,控制心跳频率及出现故障要等待多久进行故障切换

集群转换消息
ip-request和ip-request-resp
当主服务器恢复在线状态时,通过ip-request消息要求备机释放主服务器失败时备服务器取得的资源,然后备服务器关闭释放主服务器失败时取得的资源及服务
备服务器释放主服务器失败时取得的资源及服务后,就会通过ip-request-resp消息通知主服务器它不再拥有该资源及服务,主服务器收到来自备节点的ip-request-resp消息通知后,启动失败时释放的资源及服务,并开始提供正常的访问服务    

6 Heartbeat IP地址接管和故障转移

    Heartbeat是通过IP地址接管和ARP广播进行故障转移的
ARP广播:在主服务器故障时,备用节点接管资源后,会立即强制更新所有客户端本地的ARP表,(即清除客户端本地缓存的失败服务器的vip地址和mac地址的解析记录)确保客户端和新的主服务器对话。


7 VIP/IP 别名/辅助IP

    真实IP,又称为管理IP,一般是配置在物理网卡上的实际IP,在负载均衡及高可用环境中,管理IP是不对外提供用户访问服务的,仅是管理服务器用,如ssh可以通过这个管理ip连接服务器
    VIP是虚拟IP,实际上就是heartbeat临时绑定在物理网卡上的别名IP(heartbeat3以上也采用了辅助IP),如eth0:x,x为0-255的任意数字,你可以在一块网卡上绑定多个别名,这个VIP可以看作是你的网名。在实际生产环境中,需要把DNS配置中把网站域名地址解析到这个VIP地址,由VIP对用户提供服务
    这样做的好处就是当提供服务的服务器宕机以后,在接管的服务器上会直接自动配置上同样的VIP提供服务。如果是使用管理IP,来回迁移就难以做到,而且,管理IP迁移走了,我们就只能去机房连接服务器了,VIP的实质就是确保两台服务器各有一个管理IP不动,就是随时可以连上机器,然后,增加绑定其他的IP,这样就算VIP转移走了,也不至于服务器本身连不上,因为管理IP不变    

    手动配置VIP的方法:
    ifconfig eth0:1 172.26.10.50 netmask 255.255.255.224up  (ip别名)
    #==》heartbeat2默认使用这个命令来添加VIP
     ip addr add 10.25.16.30/24 broadcast 10.25.16.255 dev eth1(辅助ip)
    #==>keepalived,heartbeat3采用的方案
    ip add可以查看包括别名和辅助ip,用ifconfig无法查看辅助ip

手动删除VIP的方法:
    ifconfig eth0:1 172.26.10.50 netmask 255.255.255.224 down
    ip addr del 10.25.16.30/24 broadcast 10.25.16.255 dev eth1 

Heartbeat相关目录及文件

启动脚本:/etc/init.d/
重要资源目录:/etc/ha.d/resource.d/  存放控制服务的脚本,开发程序,放到这里,进行调用。
默认配置文件目录:/etc/ha.d/
Heartbeat常用的配置文件有3个,分别是

  

9 Heartbeat发展分支

    Heartbeat3个分支说明:
从2.1.4之后,heartbeat分了3个不同的分支,Heartbeat、Cluster Glue 、Resource Agents,以前CRM功能也独立出一个版本Pacemaker

3.0之后开始有分支,之前纯粹是心跳引擎

本文是heartbeat

10 Heartbeat生产应用场景

   1、WEB高可用双机之间,Heartbeat配合nginx,haproxy较好,LVS+keepalived较好
 2、数据库的主的高可用<最好使用Heartbeat>
 3、存储方面(MFS)使用Heartbeat+Drbd较好

 

 

生产环境下heartbeat的部署

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地址的方法检查测试,看起返回的IPhosts文件对应的是否相同

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


如果不将他们加入到/etc/rc.local/,可以在配置网卡时候,更改为static

 

 

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

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

 hacf文件说明

 

 

 

配置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

picdata-1-2 IPaddr::192.168.1.82/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-1picdata-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 heartbeatkeepalived的应用场景区别

1)对于一般的webdb,负载均衡(nginx,haproxy)等等,heartbeatkeepalived都可以实现。

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是否启动OKURL地址是不是能够打开,这个检查过程可以写成脚本放heartbeat服务启动脚本的参数里等。

2)先修改好一段的配置,然后同步到另一端

/etc/init.d/heartbeat stop

/etc/init.d/heartbeat start

ifconfig | egrep ip1|ip2

wget url

准备好后,拷贝粘贴同时执行上面3条命令,执行完毕后看看ip是否OK,如果5IPOK,则需要回滚配置或者再次推到备节点

3)通过heartbeat自带的如下命令临时增加IP,并修改配置但不重启,然后在流量低谷或者夜里重启服务器

/etc/ha.d/resource.d/IPaddr 192.168.1.200/eth0 start

总结:负载均衡和高可用服务器的位置一般来说都非常重要,因此,操作时一定要谨慎小心,一定要记得事先写好操作步骤及回滚步骤,然后再去实施操作,不要逞匹夫之勇,直接动手操作,那样会极容易导致网站宕机影响用户体验,特别是涉及到数据库和存储高可用的heartbeat的维护更加要小心。

 

要经常查看heartbeat服务日志

cat /var/log/ha.log

配置好从服务器(主从的配置文件除了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的效果差不多),然后看备份机器的接管情况

 

推荐阅读