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 集群工作流程如下:

  1. 正常运行时

    • 两个节点(Node1 主节点、Node2 备节点)通过心跳链路持续互相发送心跳报文。
    • 心跳报文包含节点状态、资源信息等。
  2. 故障检测

    • 如果 Node1 突然宕机或网络中断,Node2 在超时后检测不到心跳。
    • Node2 判定 Node1 “死亡”,启动资源接管。
  3. 资源切换

    • 接管虚拟 IP(VIP)、挂载共享存储、启动应用服务等。
    • 切换时间通常在几秒到几十秒内完成,用户几乎无感知。
  4. 避免脑裂(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 资源代理。