9.5.1 健康检查机制:心跳、超时与剔除

健康检查是服务注册中心保证实例可用性的核心机制,Nacos通过心跳、超时与剔除的闭环管理实例健康状态。健康检查既影响服务发现结果,也直接影响流量路由与故障隔离效果。

文章图片

1. 心跳机制(原理+示例)
- 客户端定期向Nacos发送心跳,携带实例元数据与服务信息。
- 心跳间隔应与业务负载匹配,过短会增加压力,过长会导致故障感知延迟。

客户端心跳间隔示例(Spring Cloud Alibaba):

# file: application.yml
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 10.0.0.10:8848
        heart-beat-interval: 5000   # 毫秒,默认5s
        heart-beat-timeout: 15000   # 毫秒,默认15s

心跳行为验证(查看注册中心心跳日志):

# Nacos Server 日志
tail -f /opt/nacos/logs/nacos.log | grep -i "beat"

2. 超时判定(参数+解释)
- Nacos在超过超时时间未收到心跳时标记为不健康。
- 通常设定为心跳间隔的2~3倍,避免网络抖动误判。

服务端健康检查参数(核心配置):

# file: /opt/nacos/conf/application.properties
# 心跳超时与删除阈值(示例值)
nacos.naming.expireInstance=true
nacos.naming.health.timeout=15000   # 心跳超时阈值(ms)
nacos.naming.health.timeout.delete=30000  # 剔除阈值(ms)

验证超时判定(模拟停心跳):

# 停止某实例服务或断网络后观察实例状态
curl -s "http://10.0.0.10:8848/nacos/v1/ns/instance/list?serviceName=demo-service"
# 预期:实例的healthy字段变为false

3. 剔除机制(策略+示例)
- 当实例持续超时达到剔除阈值,Nacos从可用列表剔除。
- 剔除后实例不会被下发给调用侧,避免错误路由。

剔除观察示例:

# 持续停止实例30s后查询
curl -s "http://10.0.0.10:8848/nacos/v1/ns/instance/list?serviceName=demo-service&healthyOnly=true"
# 预期:剔除后的实例不再出现在列表中

4. 保护模式与误判控制(架构要点+示例)
- 大规模故障或网络分区时,Nacos可进入保护模式,避免错误剔除大量实例。
- 保护模式下保留最近健康实例列表,保证核心服务可用性。

保护模式开关示例(服务端):

# file: /opt/nacos/conf/application.properties
# 是否启用保护模式
nacos.naming.enableProtection=true

查看保护模式状态(运维排查):

# 通过指标或日志查看是否进入保护模式
grep -i "protection" /opt/nacos/logs/naming-server.log

5. 安装与环境准备(快速可执行)
Nacos单机安装(便于验证健康检查机制):

# 1) 解压安装
tar -zxvf nacos-server-2.2.3.tar.gz -C /opt/
cd /opt/nacos

# 2) 单机模式启动
./bin/startup.sh -m standalone

# 3) 验证启动
curl -s http://127.0.0.1:8848/nacos

6. 常见故障排查(结合命令)
- 心跳丢失:检查客户端与服务端时间同步、网络丢包、心跳间隔配置。
- 频繁剔除:检查超时阈值设置过短、实例CPU抖动、GC频繁。
- 误判不健康:检查保护模式是否触发、查看服务端日志与指标。

排查命令示例:

# 检查时间同步
timedatectl status

# 检查网络连通性
ping -c 3 10.0.0.10
telnet 10.0.0.10 8848

# 观察实例心跳日志
tail -f /opt/nacos/logs/naming-server.log | grep -i "heartbeat"

7. 练习题(动手验证)
1) 调整心跳间隔为3秒,超时阈值为9秒,观察实例健康状态变化时间。
2) 停止某实例服务30秒,确认其从健康列表中剔除,再恢复服务观察回归时间。
3) 模拟网络延迟(如tc)后观察误判率变化,并优化超时参数。

示例:模拟网络延迟(Linux):

# 为网卡添加延迟
sudo tc qdisc add dev eth0 root netem delay 200ms

# 清除延迟
sudo tc qdisc del dev eth0 root netem

8. 运维配置建议(落地参数)
- 心跳间隔:3~5秒(高频核心服务)或10秒(低频服务)。
- 超时阈值:心跳间隔的2~3倍,剔除阈值再乘2。
- 关键服务建议启用更严格超时与剔除策略,并配合保护模式。