Heartbeat 高可用集群完全指南

想象两个心脏跳动,如果一颗心脏停止了,另一颗立即接管维持生命。这就是 Heartbeat 集群的核心思想------通过心跳信号监测对方状态,确保服务永不停止!


📑 目录

  1. [什么是 Heartbeat?](#什么是 Heartbeat?)
  2. 名词解释(命令与术语)
  3. [Heartbeat 架构与组件](#Heartbeat 架构与组件)
  4. [Heartbeat 配置详解](#Heartbeat 配置详解)
  5. 安装与配置
  6. [基于 CRM 的资源管理](#基于 CRM 的资源管理)
  7. [Heartbeat 状态监控](#Heartbeat 状态监控)
  8. 故障排查
  9. [Heartbeat vs Corosync 对比](#Heartbeat vs Corosync 对比)
  10. 最佳实践
  11. 总结
  12. 官方文档与参考

🎯 什么是 Heartbeat?

核心概念

Heartbeat 是 Linux 平台上最早的高可用集群软件之一,通过节点间定期发送"心跳"信号来监测对方状态,当检测到对方故障时自动接管资源。

官方/社区定义简述 (来源:Linux-HA):Heartbeat 是 Linux-HA 项目中的集群基础设施守护进程,负责在节点间传递心跳、在节点上下线时执行脚本、并通过免费 ARP 实现 IP 接管。支持双节点并可扩展至更多节点;通信方式包括 UDP 广播/组播/单播及串口(串口已不推荐)。v2 起可搭配 CRM(后独立为 Pacemaker)做资源管理。项目最终版本为 3.0.6(2015),新项目推荐使用 Corosync + Pacemaker。
故障切换
无法通信
节点A

💔 心跳停止
节点B

💓 检测到故障
服务迁移到B
正常状态
心跳信号
节点A

💓 心跳正常
节点B

💓 心跳正常
服务运行在A

生活类比

  • 心跳信号 = 两个保安对讲机,每隔几秒说"我还在"
  • 故障检测 = 长时间没听到对方说话,可能出事了
  • 资源接管 = 另一个保安马上接替他的岗位

Heartbeat 的历史


📖 名词解释(命令与术语)

以下对文档中出现的命令、配置文件、概念做简要解释,并配上生活例子与「为什么」,便于记忆与理解。

常用命令

命令/名称 含义 说明 生活例子 为什么?
cl_status Cluster Status 查看 Heartbeat 集群当前状态(节点、资源等) 像「看考勤板」:谁在岗、当前谁在干活 为什么常用?快速确认集群是否正常、资源在哪个节点,排障第一步
crm_mon -1 CRM Monitor,单次输出 查看 Pacemaker 集群状态(节点、资源、约束),输出一次后退出 像「打印一份当前排班表」 为什么用 -1?不加 -1 会持续刷新;-1 适合脚本或一次性查看
crm configure CRM 配置 进入或执行集群配置(show/primitive/group/colocation/order/commit) 像「改排班表」:加人、编组、规定谁和谁一起 为什么改完要 commit?配置在内存中,commit 才真正生效并同步到各节点
crm_resource --move 迁移资源 将指定资源迁移到某节点(常用于测试切换) 像「临时把某人的岗位调到另一人」 为什么测试时用?验证故障切换是否正常,不真关节点也能看到资源迁移
ucast / mcast / serial 心跳传输方式 ha.cf 中配置:单播、组播、串口 像「单播=单独打电话、组播=群发、串口=专用对讲线」 为什么推荐 ucast?单播不依赖交换机组播、跨网段简单,每台填对端 IP 即可

配置文件与概念

名词 含义 生活例子 为什么?
ha.cf Heartbeat 主配置文件 像「公司考勤与通讯制度」:谁算成员、多久报一次到、多久没报到算缺勤 为什么节点要写两边的 hostname?两边都要知道「集群里有哪些人」,才能判断谁掉了
authkeys 心跳认证密钥 像「对暗号」:只有知道密钥的包才认,防伪造心跳 为什么必须 chmod 600?密钥泄露别人可伪造心跳把资源抢走,只能 root 读
haresources 脚本方式资源列表 像「任务清单」:主节点负责按顺序启动 VIP、挂盘、MySQL 等 为什么只写一个节点名?表示「这份清单默认由该节点执行」,该节点挂了对方接管整份清单
keepalive 心跳发送间隔(秒) 像「每隔几秒喊一声我还活着」 为什么常用 2 秒?太短网络抖一下就误判;太长故障发现慢,2 秒是经验折中
deadtime 判定对方死亡的时间(秒) 像「连续多久没回应就当他出事了」 为什么要比 keepalive 大很多?要留出丢包、网络抖动的余量,通常 30 秒左右
auto_failback 主节点恢复后是否自动切回 像「主人回来了,要不要把岗位还给他」 为什么生产常关?避免主节点恢复后资源又切回去,造成二次抖动;若主节点更强可开
CRM Cluster Resource Manager 像「调度中心」:决定资源在谁上、启停顺序、约束 为什么 v2 引入?haresource 只能简单「一份清单」,CRM 能做约束、组、粘性等复杂策略

心跳方式对比(为什么选哪种?)

方式 配置关键字 优点 缺点 为什么选/不选?
单播 ucast ucast 接口 对端IP 不依赖组播、跨网段简单 每台要对端 IP 不同 跨网段、交换机不支持组播时首选
组播 mcast mcast 接口 组地址 端口 配置一致、多节点方便 需交换机支持组播、同网段 多节点、同网段且网络可控时可用
串口 serial serial 设备 baud 与网络隔离,防网络分区误判 需物理线、已不推荐 仅作第二心跳路径时可选,主路径用网络

🏗️ Heartbeat 架构与组件

系统架构

通信层
消息传递层
资源管理层
应用层
🖥️ 应用程序

MySQL/Apache
📜 haresource

脚本方式
🧠 CRM

Pacemaker
💓 Heartbeat

心跳传递
📡 UDP 广播/组播/单播

核心组件

组件 说明 生活类比
heartbeat 核心守护进程,负责心跳传递 通讯系统
haresources 资源列表文件(脚本方式) 工作清单
ha.cf 主配置文件 公司规章制度
authkeys 认证密钥文件 门禁卡密码
crm 集群资源管理器(v2+) 调度中心
ccm 集群一致性成员服务 人事考勤系统

两种资源管理方式

CRM方式
🧠 复杂但强大
📋 XML/命令行配置
🎯 智能调度
haresource方式
📜 简单
📄 配置文件定义
▶️ 自动启动资源

特性 haresource CRM (Pacemaker)
配置方式 简单文本文件 XML + 命令行
灵活性
复杂度 简单 复杂
适用场景 简单双机热备 复杂多节点集群
生活类比 手写清单 智能调度系统

⚙️ Heartbeat 配置详解

主配置文件 ha.cf

⚙️ ha.cf 配置项
👥 节点定义
💓 心跳方式
⏱️ 超时设置
📋 日志配置
🔄 自动故障恢复

配置示例

bash 复制代码
# /etc/ha.d/ha.cf

# 日志文件位置
logfacility     local0
logfile         /var/log/ha-log
keepalive       2       # 心跳间隔(秒)
deadtime        30      # 超时时间(秒)
warntime        10      # 警告时间(秒)
initdead        120     # 启动时的超时时间

# 节点定义
node    node1.magedu.com
node    node2.magedu.com

# 心跳传递方式
# 方式1:串口心跳
serial  /dev/ttyS0
baud    115200

# 方式2:多播心跳
mcast   eth0 225.0.0.1 694 1 0
#        接口  多播地址    端口 TTL 回环

# 方式3:单播心跳(推荐)
ucast   eth0 192.168.1.11
#        接口  对端IP

# 自动故障恢复
auto_failback on    # 主节点恢复后自动切回
auto_failback off   # 主节点恢复后不切回(推荐)

# 资源管理方式
# 使用 haresource(旧方式)
#use_logd     yes  # 使用 logd 守护进程

# 使用 CRM(新方式)
crm    respawn     # 使用 Pacemaker

配置参数详解

参数 说明 推荐值 生活类比
keepalive 心跳发送间隔 2秒 每几秒说一次"我还活着"
deadtime 判定死亡的时间 30秒 多久没反应认为挂了
warntime 发出警告的时间 10秒 开始担心的时间点
initdead 启动时的超时时间 120秒 刚开机时多等一会
auto_failback 自动切回 on/off 主人回来了让不让位

心跳间隔选择原则

  • 太短:网络抖动就误判故障
  • 太长:故障发现延迟太长
  • 推荐:2秒心跳,30秒超时

为什么 deadtime 要远大于 keepalive? 例如 keepalive=2、deadtime=30 表示「每 2 秒发一次,连续 30 秒收不到才判死」。中间可以丢多包或短暂断网而不误判;若 deadtime 只比 keepalive 大一点,一次丢包就可能触发故障转移。

认证配置 authkeys

bash 复制代码
# /etc/ha.d/authkeys
# 文件权限必须是 600 (root only)

auth 1
1 sha1 my-secret-key-here

# 或使用 md5
auth 2
2 md5 another-secret-key

设置正确权限

bash 复制代码
chmod 600 /etc/ha.d/authkeys
ls -l /etc/ha.d/authkeys
# -rw------- 1 root root ...

资源配置 haresource

bash 复制代码
# /etc/ha.d/haresources
# 格式:节点名 资源1 资源2 资源3...

# 示例1:简单 VIP + Apache
node1.magedu.com 192.168.1.100/24/eth0 httpd

# 示例2:VIP + Filesystem + MySQL
node1.magedu.com \
    192.168.1.100/24/eth0 \
    Filesystem::/dev/sdb1::/data::ext4 \
    mysqld

# 示例3:指定资源启动脚本
node1.magedu.com \
    IPaddr::192.168.1.100/24/eth0 \
    httpd

资源配置语法

资源类型 语法 说明
IPaddr IPaddr::IP/NETMASK/INTERFACE VIP 地址
Filesystem Filesystem::DEVICE::MOUNTPOINT::FSTYPE 文件系统挂载
服务 直接写服务名 系统服务脚本

生活类比

  • haresources = 任务清单,按顺序执行
  • 优先级 = 清单上的顺序,先来后到
  • 节点指定 = 指定谁负责这份清单

🚀 Heartbeat 安装与配置

环境准备

📋 环境准备
🖥️ 两台服务器
🖥️ 节点1: 192.168.1.10
🖥️ 节点2: 192.168.1.11
📛 主机名解析
📄 /etc/hosts 配置
⏰ 时间同步

准备工作

bash 复制代码
# 1. 配置主机名(两台都执行)
hostnamectl set-hostname node1.magedu.com  # 节点1
hostnamectl set-hostname node2.magedu.com  # 节点2

# 2. 配置 hosts 文件(两台都执行)
cat >> /etc/hosts << EOF
192.168.1.10 node1.magedu.com node1
192.168.1.11 node2.magedu.com node2
EOF

# 3. 时间同步(两台都执行)
yum install ntpdate -y
ntpdate time.nist.gov

# 4. 测试连通性(节点1执行)
ping -c 3 node2
ssh node2 hostname

安装 Heartbeat

bash 复制代码
# 1. 安装 EPEL 源(两台都执行)
yum install epel-release -y

# 2. 安装 Heartbeat(两台都执行)
yum install heartbeat -y

# 3. 创建配置目录(两台都执行)
mkdir -p /etc/ha.d
cd /etc/ha.d

配置示例(简单双机热备)

bash 复制代码
# /etc/ha.d/ha.cf(两台都相同配置)
cat > /etc/ha.d/ha.cf << 'EOF'
# 日志配置
logfacility     local0
logfile         /var/log/ha-log
debugfile       /var/log/ha-debug

# 时间配置
keepalive       2
deadtime        30
warntime        10
initdead        120

# 节点配置
node    node1.magedu.com
node    node2.magedu.com

# 单播心跳
ucast   eth0 192.168.1.11   # 节点1填写对端IP
# ucast eth0 192.168.1.10   # 节点2填写对端IP

# 自动故障恢复
auto_failback off

# 使用 Pacemaker
crm    respawn
EOF

# 节点2修改 ucast 为对端IP
sed -i 's/192.168.1.11/192.168.1.10/' /etc/ha.d/ha.cf

认证配置

bash 复制代码
# /etc/ha.d/authkeys(两台都相同配置)
cat > /etc/ha.d/authkeys << 'EOF'
auth 1
1 sha1 heartbeat-key-2025
EOF

# 设置权限(重要!)
chmod 600 /etc/ha.d/authkeys
chown root:root /etc/ha.d/authkeys

配置资源文件

bash 复制代码
# /etc/ha.d/haresources(两台都相同配置)
cat > /etc/ha.d/haresources << 'EOF'
# VIP + Apache 示例
node1.magedu.com IPaddr::192.168.1.100/24/eth0 httpd
EOF

# 或者使用更复杂的配置
cat > /etc/ha.d/haresources << 'EOF'
# VIP + 文件系统 + MySQL
node1.magedu.com \
    IPaddr::192.168.1.100/24/eth0 \
    Filesystem::/dev/drbd0::/data::ext4 \
    mysqld
EOF

启动 Heartbeat

bash 复制代码
# 1. 配置防火墙(两台都执行)
firewall-cmd --permanent --add-port=694/udp
firewall-cmd --reload

# 或者使用 iptables
iptables -I INPUT -p udp --dport 694 -j ACCEPT
service iptables save

# 2. 启动服务(两台都执行)
systemctl enable heartbeat
systemctl start heartbeat

# 3. 查看状态
cl_status

为什么心跳用 UDP 694 端口? Heartbeat 约定默认使用 UDP 694,便于防火墙统一放行;心跳包小、无需可靠传输,UDP 足够,且 694 为 IANA 分配给 Linux-HA 的端口。


🔄 基于 CRM 的资源管理

CRM 配置方式

💓 Heartbeat v2+
🧠 集成 Pacemaker
⌨️ crm 命令行工具
🖥️ crm_gui 图形界面
📦 配置资源
🔗 配置约束
📊 查看状态

常用 CRM 命令

bash 复制代码
# 查看集群状态
crm_mon -1

# 配置模式(进入配置界面)
crm configure show

# 添加资源
crm configure primitive vip ocf:heartbeat:IPaddr2 \
    params ip=192.168.1.100 cidr_netmask=24

# 添加资源组
crm configure group webgroup vip apache

# 添加约束
crm configure colocation apache_with_vip apache: vip INFINITY
crm configure order start_vip_before_apache vip:start apache:start

# 提交配置
crm configure commit

# 清理资源
crm resource cleanup

配置示例(MySQL HA)

bash 复制代码
# 1. 配置 DRBD 资源
crm configure primitive drbd_mysql ocf:linbit:drbd \
    params drbd_resource=mysql \
    op monitor interval=15s role=Master \
    op monitor interval=30s role=Slave

# 2. 配置主从资源
crm configure ms ms_drbd_mysql drbd_mysql \
    meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1

# 3. 配置文件系统
crm configure primitive fs_mysql ocf:heartbeat:Filesystem \
    params device="/dev/drbd0" directory="/data" fstype="ext4" \
    op monitor interval=20s

# 4. 配置 VIP
crm configure primitive vip_mysql ocf:heartbeat:IPaddr2 \
    params ip=192.168.1.100 cidr_netmask=24 \
    op monitor interval=10s

# 5. 配置 MySQL
crm configure primitive mysql systemd:mysqld \
    op monitor interval=20s timeout=30s

# 6. 配置资源组
crm configure group mysql_group vip_mysql fs_mysql mysql

# 7. 配置约束
crm configure colocation mysql_on_drbd \
    mysql_group ms_drbd_mysql INFINITY
crm configure order mysql_after_drbd \
    ms_drbd_mysql:start mysql_group:start

📊 Heartbeat 状态监控

查看集群状态

bash 复制代码
# 1. 查看 Heartbeat 状态
cl_status

# 输出示例:
# Cluster name: mycluster
# Cluster ID: 1234
# Nodes: node1.magedu.com node2.magedu.com
# Resources:
#   IPaddr::192.168.1.100/24/eth0
#   httpd

# 2. 查看详细状态
crm_mon -1

# 3. 查看资源状态
crm_resource --list

# 4. 查看节点状态
crm_node --list

日志查看

bash 复制代码
# 主日志
tail -f /var/log/ha-log

# 调试日志
tail -f /var/log/ha-debug

# 系统日志
journalctl -u heartbeat -f

# 查看最近的错误
grep -i error /var/log/ha-log | tail -20

⚠️ 故障排查

常见问题

1. 节点无法检测到对方

现象:两个节点都认为自己是主节点




⚠️ 问题
网络连通?
🔧 检查网络配置
防火墙开放?
🔥 开放 UDP 694 端口
📋 检查心跳配置
✅ 确认 ucast IP 正确

解决步骤

bash 复制代码
# 1. 检查网络连通性
ping -c 3 node2

# 2. 检查端口监听
netstat -tulnp | grep 694

# 3. 检查防火墙
iptables -L -n | grep 694

# 4. 抓包分析
tcpdump -i eth0 udp port 694
2. 资源无法启动

现象:资源一直处于 Starting 状态

bash 复制代码
# 1. 手动测试资源脚本
/etc/init.d/httpd start

# 2. 查看资源日志
grep -i httpd /var/log/ha-log

# 3. 清理资源状态
crm_resource -C -r httpd

# 4. 查看详细错误
crm_resource --fail -r httpd -H node1
3. 频繁切换

现象:资源在两个节点间反复切换
🔄 资源频繁切换
⏱️ 检查心跳间隔
👁️ 检查资源健康检查
🌐 检查网络稳定性
增加 deadtime
调整监控间隔
优化网络配置

解决方案

bash 复制代码
# 1. 调整超时参数
# ha.cf
keepalive 5        # 增加心跳间隔
deadtime 60        # 增加超时时间

# 2. 调整监控间隔
crm_resource meta httpd set failure-timeout 60s

# 3. 关闭 auto_failback
auto_failback off

🔄 Heartbeat vs Corosync 对比

功能对比

Corosync
Heartbeat
对比维度
📐 复杂度
⚙️ 功能
🚀 性能
🔧 维护状态
⭐ 低
⭐⭐ 中
⭐⭐ 中
⭐ 基本停止
⭐⭐⭐ 高
⭐⭐⭐⭐ 很强
⭐⭐⭐ 高
⭐⭐⭐ 活跃

特性 Heartbeat Corosync
复杂度 简单 复杂
功能 基础 HA 丰富的集群功能
性能 中等 高性能
扩展性 适合双节点 支持多节点
维护状态 基本停止 活跃开发
官方支持 RHEL 6 之前 RHEL 7 及之后
生活类比 老式座机 现代智能手机

迁移建议

简单
复杂
💓 现有 Heartbeat 集群
复杂度?
✅ 保持 Heartbeat
🔄 迁移到 Corosync
🧪 测试环境验证
📋 逐步迁移


💡 最佳实践

配置建议

  1. 多心跳路径 :网络 + 串口(或双网卡)
    为什么? 单一路径故障(如网卡或交换机挂)会被误判为对方节点挂,触发不必要切换;多路径下只有「所有路径都不通」才判死,减少误判。生活例子:不只靠微信报平安,还有电话线备用。
  2. 合理的超时设置 :避免误判故障
    为什么? deadtime 太小网络一抖就切换;太大则真故障时恢复慢。生活例子:迟到 5 分钟算缺勤太严,迟到 2 小时才算又太松。
  3. 资源粘性 :防止资源频繁迁移
    为什么? 无粘性时集群可能因小波动把资源在两边来回迁,导致服务抖动。生活例子:给「当前节点」加点「留恋分」,不轻易搬家。
  4. 定期测试 :故障切换演练
    为什么? 不演练的话真故障时不知道脚本、顺序、网络是否都正常。生活例子:消防演练。
  5. 监控告警 :及时发现问题
    为什么? 心跳断、资源迁移、节点状态变化都应有告警,便于运维介入。生活例子:考勤异常要提醒主管。

生产环境检查清单

bash 复制代码
# 1. 确认时间同步
ntpdate pool.ntp.org

# 2. 确认主机名解析
getent hosts node1
getent hosts node2

# 3. 确认 SSH 免密登录
ssh node2 hostname

# 4. 确认防火墙规则
iptables -L -n | grep 694

# 5. 确认资源脚本可执行
ls -l /etc/init.d/httpd

# 6. 测试资源切换
crm_resource --move --node node2 httpd

# 7. 查看集群状态
crm_mon -1

🎯 总结

Heartbeat 是 Linux HA 的开山鼻祖,虽然逐渐被 Corosync 替代,但仍然在许多老系统中服役。

核心要点记忆口诀

  • Heartbeat 传心跳,超时判生死
  • haresource 简单,CRM 强大
  • auto_failback 慎用,来回切换伤不起
  • 多心跳路径好,网络故障不误判
  • Corosync 趋势,新项目用它好

生活类比总结

  • 心跳信号 = 对讲机定期报平安
  • deadtime = 多久没联系就报警
  • auto_failback = 主人回来让不让位
  • 资源粘性 = 习惯了现在的岗位

最后提醒:如果是新项目,建议直接使用 Corosync + Pacemaker!Heartbeat 已经过时,官方支持逐渐减少。


📚 官方文档与参考

资源 链接/说明 用途
Linux-HA 官网 linux-ha.org 项目首页、文档入口
Getting Started Getting Started with Linux-HA (heartbeat) 入门与基础配置
Heartbeat 与 Corosync 见本仓库 Corosync + Pacemaker 指南HA 高可用集群指南 了解替代方案与 CRM 概念

相近方案速览(Heartbeat 在其中的位置)

方案 说明 与 Heartbeat 的关系
Heartbeat 早期 Linux-HA 心跳与资源脚本 本文主角;维护趋停,多用于老环境
Corosync 替代 Heartbeat 的心跳/成员层,与 Pacemaker 配套 RHEL 7+ 及新项目推荐,概念类似、功能更强
Pacemaker CRM,可与 Heartbeat 或 Corosync 搭配 Heartbeat v2+ 通过 crm respawn 启动 Pacemaker 做资源管理
Keepalived 基于 VRRP,主做 VIP 漂移与轻量 HA 不做通用资源管理,只做「谁当主」;与 Heartbeat 定位不同
相关推荐
浩子智控2 小时前
提升linux串口通信实时性的编程实践
linux·单片机·嵌入式硬件
Tyrion.Mon2 小时前
5脚188数码管驱动
单片机
国科安芯17 小时前
高可靠性电源方案的高温降额设计与热管理策略——基于ASP3605的温域特性实证研究
单片机·嵌入式硬件·安全威胁分析·安全性测试
白太岁17 小时前
操作系统开发:(9) 从硬件复位到程序执行:如何编写符合硬件动作的启动文件与链接脚本
c语言·汇编·嵌入式硬件·系统架构
逻辑流17 小时前
《精准测量的起点:STM32中的电压电流有效值计算算法》
stm32·单片机·嵌入式硬件·算法
隔壁大炮18 小时前
MPU6050
stm32·单片机·嵌入式硬件
麦德泽特20 小时前
STM32与Linux的无缝协作:通过USB CDC/VCP实现高效数据交互
linux·stm32·单片机·嵌入式硬件·安全
良许Linux20 小时前
FPGA原理和应用
stm32·单片机·fpga开发·程序员·嵌入式·编程
清风66666620 小时前
基于单片机的夹具压力控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业