什么是 Heartbeat
Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。
Heartbeat 是一个开源的高可用性软件,心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里,由 heartbeat 模块实现了这两个功能。
工作原理
Heartbeat 最核心的两个部分,心跳监测部分和资源接管部分。心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。
工作过程
1. 心跳检测和tcp端口检测。当主节点出现故障时,Heartbeat 能够迅速发现并将请求转移到备用节点。
2. VIP管理。Heartbeat 通过 VIP (Virtual IP)的方式实现集群的负载均衡,当主节点出现故障时,VIP会自动切换到备用节点。
3. 数据同步。将主节点上的数据同步到备用节点上,以保证备用节点的数据与主节点保持一致。
4. 自动故障转移。当主节点出现故障时,Heartbeat 能够自动将请求转移到备用节点,以保证业务的连续性。
Heartbeat 的组成
heartbeat | 节点间通信校验模块 |
CRM | 集群资源管理模块 |
CCM | 维护集群成员的一致性 |
LRM | 本地资源管理模块 |
StonithDaemon | 提供节点重启服务 |
logd | 非阻塞的日志记录 |
apphbd | 提供应用程序级的看门狗计时器 |
Recovery Manager | 应用故障恢复 |
底层结构 | 包括插件接口、进程间通信等 |
CTS | 集群测试系统,集群压力测试 |
术语
1、节点(node):运行Heartbeat进程的一个独立主机。节点有主次之分,分别称为主节点和备用节点,每个节点拥有唯一的主机名,并且拥有属于自己的一组资源(例如,磁盘、文件系统等)
主节点上一般运行着一个或多个应用服务。而备用节点一般处于监控状态。
2、资源(resource):是一个节点可以控制的实体,当节点发生故障时,这些资源能够被其它节点接管。heartbeat中,可以当做资源的实体有:
- 磁盘分区、文件系统。
- IP地址。
- 应用程序服务。
- NFS文件系统。
3、事件(event):集群中可能发生的事情,例如节点系统故障、网络连通故障等。这些事件都会导致节点的资源发生转移。
4、动作(action):事件发生时HA的响应方式,动作是由shell脚步控制的,例如,当某个节点发生故障后,备份节点将通过事先设定好的执行脚本进行服务的关闭或启动,进而接管故障节点的资源。
消息类型
Heartbeat 有三种消息类型:
1、心跳消息:心跳消息为约150字节的数据包,可能为单播,广播或多播的方式,控制心跳频率及出现故障要等待多久进行故障转移。
2、集群转换消息:ip-request和ip-request-resp。
当主服务器恢复在线状态时,通过ip-request消息要求备机释放主服务器失败时备服务器取得的资源,然后备份服务器关闭释放主服务器失败时取得的资源及服务。
备服务器释放主服务器失败时取得的资源及服务后,通过ip-request-resp消息通知主服务器它不在拥有该资源及服务,主服务器收到备节点的ip-request-resp消息通知后,启动失败时释放的资源及服务,并开始提供正常的访问服务。
3、重传请求:rexmit-request控制重传心跳请求,次消息不太重要。
可靠消息通信
Heartbeat通过插件技术实现了集群间的串口、多播、广播和组播通信,在配置的时候可以根据通信媒介选择采用的通信协议,heartbeat启动的时候检查这些媒介是否存在,如果存在则加载相应的通信模块。
对于高可用集群系统,如果集群间的通信不可靠,那么很明显集群本身也不可靠。Heartbeat采用UDP协议和串口进行通信,它们本身是不可靠的,可靠性必须由上层应用来提供。
怎样保证消息传递的可靠性呢?
Heartbeat通过冗余通信通道和消息重传机制来保证通信的可靠性。
Heartbeat检测主通信链路工作状态的同时也检测备用通信链路状态,并把这一状态报告给系统管理员,这样可以大大减少因为多重失效引起的集群故障不能恢复。例如,某个工作人员不小心拨下了一个备份通信链路,一两个月以后主通信链路也失效了,系统就不能再进行通信了。通过报告备份通信链路的工作状态和主通信链路的状态,可以完全避免这种情况。因为这样在主通信链路失效以前,就可以检测到备份工作链路失效,从而在主通信链路失效前修复备份通信链路。
Heartbeat通过实现不同的通信子系统,从而避免了某一通信子系统失效而引起的通信失效。最典型的就是采用以太网和串口相结合的通信方式。
选择采用串口通信的原因
1、IP通信子系统的失效不太可能影响到串口子系统。
2、串口不需要复杂的外部设备和电源。
3、串口设备简单,在实践中非常可靠。
4、串口可以非常容易地专用于集群通信。
5、串口的直连线因为偶然性掉线事件很少。
不管是采用串口还是以太网IP协议进行通信,heartbeat都实现了一套消息重传协议,保证消息包的可靠传递。实现消息包重传有两种协议,一种是发送者发起,另一种是接收者发起。
对于发送者发起协议,一般情况下接收者会发送一个消息包的确认。发送者维护一个计时器,并在计时器到时的时候重传那些还没有收到确认的消息包。这种方法容易引起发送者溢出,因为每一台机器的每一个消息包都需要确认,使得要发送的消息包成倍增长。这种现像被称为发送者(或者ACK)内爆(implosion)。
对于接收者发起协议,采用这种协议通信双方的接收者通过序列号负责进行错误检测。当检测到消息包丢失时,接收者请求发送者重传消息包。采用这种方法,如果消息包没有被送达任何一个接收者,那么发送者容易因NACK溢出,因为每个接收者都会向发送者发送一个重传请求,这会引起发送者的负载过高。这种现像被称为NACK内爆(implosion)。
Heartbeat实现的是接收者发起协议的一个变种,它采用计时器来限制过多的重传,在计时器时间内限制接收者请求重传消息包的次数,这样发送者重传消息包的次数也被相应的限制了,从而严格的限制了NACK内爆。
心跳连接
两台服务器安装heartbeat,两台 heartbeat 主机之间通信的一些常用的方法
1、串行电缆。
2、一根以太网电缆两网卡。
3、以太网电缆,通过交换机等网络设备连接。
缺点:增加了交换机故障点,线路不是专用心跳线,容易受其他数据传输的影响。
Heartbeat 的缺点
1. 单点故障
虽然heartbeat方案可以将请求转移到备用节点,但是它本身也存在单点故障的问题,如果heartbeat节点出现故障,将会影响整个集群的高可用性。
2. 数据同步延迟
由于数据同步需要一定的时间,备用节点的数据可能会存在一定的延迟,当主节点出现故障时,可能会丢失一部分数据。
3. 配置复杂
heartbeat方案的配置比较复杂,需要对系统和网络有一定的了解。
Hearbeat和Keepalived区别
1、协议不同:Keepalived使用的VRRP协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP),Heartbeat是基于主机或网络的服务的高可用方式。
2、目的不同:Keepalived的目的是模拟路由器的双机,Heartbeat的目的是用户Service的双机。
3、使用程度:Keepalived使用更简单,从安装、配置、使用、维护等角度上对比,Keepalived都比Heartbeat要简单。
4、功能不同:Heartbeat虽然复杂,但功能更强大,配套工具更全,适合做大型集群管理,而Keepalived主要用于集群倒换,基本没有管理功能。
脑裂现象
脑裂(split-brain):指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。
脑裂的原因
1、心跳链路故障,导致无法正常通信。
2、开启了防火墙阻挡了心跳信息传输。
3、心跳网卡地址等配置不正确。
4、心跳方式,心跳广播冲突,软件bug。
防止脑裂的措施
1、 同时使用串行电缆和以太网电缆连接,同时使用两条心跳线。
2、 检测到裂脑时,强制关闭一个节点。
3、 做好监控预警。
4、 仲裁机制。
故障转移
Heartbeat 是通过IP地址接管和ARP广播进行故障转移的。
Heartbeat的版本
Heartbeat有三个版本分别为Heartbeat v1.x,Heartbeat v2.x,Heartbeat v3.x。
Heartbeat v1.x和Heartbeat v2.x版本的组成结构十分简单,所有模块都集中在heartbeat中,到了v3版本后,整个heartbeat项目进行了拆分,分为不同的项目来分别进行开发。