HA Cluster中的Heartbeat(心跳)介绍
在高可用性(High Availability,简称 HA)集群中,Heartbeat(心跳) 是最核心的机制之一,用于实时监控集群节点(Node)的存活状态,并在节点发生故障时触发资源切换(Failover),从而保障服务的高可用性。
1. 什么是 Heartbeat?
Heartbeat 是一种周期性信号(periodic signal),集群中的每个节点会定期向其他节点发送“我还活着”(I’m alive)的消息。
- 如果在设定的超时时间内(通常几秒到几十秒)没有收到对方的心跳消息,就认为对方节点已失效(dead)。
- 此时集群会自动启动资源接管(Resource Takeover)流程,将原本运行在故障节点上的服务(如 IP 地址、文件系统、数据库、Web 服务等)迁移到正常节点上,实现无缝切换。
2. Heartbeat 的工作原理
典型的两节点(Active/Passive 或 Active/Active)HA 集群工作流程如下:
正常运行时:
- 两个节点(Node1 主节点、Node2 备节点)通过心跳链路持续互相发送心跳报文。
- 心跳报文包含节点状态、资源信息等。
故障检测:
- 如果 Node1 突然宕机或网络中断,Node2 在超时后检测不到心跳。
- Node2 判定 Node1 “死亡”,启动资源接管。
资源切换:
- 接管虚拟 IP(VIP)、挂载共享存储、启动应用服务等。
- 切换时间通常在几秒到几十秒内完成,用户几乎无感知。
避免脑裂(Split-Brain):
- 为了防止两个节点都认为对方已死而同时提供服务(导致数据损坏),常配合 STONITH(Shoot The Other Node In The Head,即隔离故障节点,如断电、重启)或多路径心跳机制。
心跳通信方式(常用冗余设计,避免单点故障):
- 网络心跳(最常见):通过以太网(UDP 多播/单播),端口通常为 694 等。
- 串口心跳(Serial):通过 RS232 串口线直连(早期常用,抗网络故障)。
- 磁盘心跳(Disk Heartbeat):在共享磁盘上写入/读取心跳信息。
- 多路径冗余:同时使用网络 + 串口,或多个网络接口,提高可靠性。
3. Heartbeat 的组成
以经典 Heartbeat 2.x 为例
- heartbeat 模块:核心心跳检测和消息传递。
- CCM(Cluster Consensus Membership):集群成员一致性管理,维护哪些节点在线。
- LRM(Local Resource Manager):本地资源管理,启动/停止资源。
- CRM(Cluster Resource Manager):集群资源管理(后来常被 Pacemaker 取代)。
- ha-logd:日志记录模块。
- 插件:ipfail(网络故障检测)、STONITH(节点隔离)、Ldirectord(负载均衡监控)等。
注意:纯 Heartbeat 功能相对基础,它主要负责心跳和基本资源接管,不擅长复杂资源依赖关系监控。现在主流做法是:
- Corosync + Pacemaker 组合(现代 Linux HA 标准栈)
- Corosync:负责可靠的消息传递和心跳(Totem 协议)。
- Pacemaker:负责资源管理和策略(更强大,支持复杂规则、资源代理 OCF 等)。
4. 应用场景
- 双机热备(Two-Node HA):Web 服务器、数据库(MySQL + DRBD + Heartbeat)、NFS、邮件等。
- 多节点集群:结合 Pacemaker 可实现 Active/Active 或 N+1 模式。
- 常见搭配:Heartbeat/Corosync + DRBD(块设备同步) + 共享存储 或 Pacemaker 资源代理。