心跳检测通过周期性信号确认节点存活,常见方式有网络通信、共享存储和第三方服务;可使用Shell脚本结合ping实现简单检测,或用Socket编程开发自定义协议;推荐以systemd服务运行守护进程,确保高可用,关键在于合理设置检测频率与超时阈值,配合日志告警形成闭环管理。

在分布式系统或高可用集群中,节点之间的通信稳定性至关重要。构建一个可靠的心跳检测机制能及时发现故障节点,保障服务连续性。Linux环境下可通过多种方式实现节点心跳检测与健康检查,下面介绍核心思路和开发方法。
心跳检测的基本原理
心跳机制本质是周期性发送信号(即“心跳包”)来确认目标节点是否存活。接收方若在设定时间内未收到心跳,则判定对方异常。常见实现方式包括:
- 基于网络通信:使用TCP/UDP协议定期发送探测消息
- 基于共享存储:各节点更新特定文件时间戳,通过监测变化判断状态
- 基于第三方协调服务:如ZooKeeper、etcd等维护成员列表与活跃状态
使用Shell脚本实现简单心跳
对于轻量级场景,可用Bash结合cron任务快速搭建基础检测逻辑。
示例:通过ping检测远程主机可达性#!/bin/bash TARGET_IP="192.168.1.100" LOG_FILE="/var/log/heartbeat.log"if ping -c 1 -W 2 $TARGET_IP > /dev/null; then echo "$(date): Node $TARGET_IP is alive" >> $LOG_FILE else echo "$(date): Node $TARGET_IP is DOWN!" >> $LOG_FILE
可在此触发告警或切换操作
fi
将该脚本加入crontab每10秒执行一次:* * * * * sleep 10; /path/to/heartbeat.sh
注意:频繁执行需合理设置间隔,避免资源浪费。
使用Socket编程实现自定义心跳协议
更灵活的方式是编写守护进程,利用TCP或UDP套接字实现双向心跳通信。
关键设计点:
- 发送端:每隔固定时间向监控节点发送心跳消息(如JSON格式{"type": "heartbeat", "node": "node1"})
- 接收端:监听指定端口,记录每个节点最后活动时间
- 超时判断:轮询检查各节点最近收包时间,超过阈值则标记为离线
- 重连机制:断开后尝试自动重建连接
语言推荐C/C++、Python或Go,其中Go的goroutine模型特别适合并发处理多个节点连接。
集成健康检查到系统服务
为提升可靠性,可将心跳模块作为systemd服务运行,确保开机启动并自动恢复崩溃进程。
创建服务文件 /etc/systemd/system/healthcheck.service[Unit] Description=Node Health Check Daemon After=network.target[Service] Type=simple ExecStart=/usr/local/bin/health_daemon.py Restart=always User=root
[Install] WantedBy=multi-user.target
启用服务:systemctl enable healthcheck.servicesystemctl start healthcheck.service
基本上就这些。根据实际需求选择合适粒度的方案——从脚本级探测到专用守护进程,关键是保证检测频率合理、响应及时,并配合日志与告警体系形成闭环管理。









