📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

为什么这个错误发生 #

node_health_check_failure_exception 表示节点的文件系统健康检查失败。当 FsHealthService 报告文件系统不健康时,该节点需要从集群中移除。

这个错误可能由以下原因引起:

  1. 磁盘故障:物理磁盘故障或损坏
  2. 磁盘空间不足:磁盘使用率超过配置的阈值
  3. 磁盘 IO 错误:磁盘读写错误
  4. 文件系统损坏:文件系统元数据损坏
  5. 只读文件系统:文件系统变为只读状态
  6. 磁盘错误过多:超过允许的磁盘错误阈值
  7. 挂载点问题:磁盘挂载点出现问题
  8. RAID 故障:RAID 阵列故障或降级
  9. NFS/网络存储问题:网络存储连接问题
  10. 磁盘控制器故障:磁盘控制器硬件故障

如何修复这个错误 #

1. 检查磁盘空间 #

# 查看磁盘使用情况
df -h

# 查看数据目录的磁盘使用
du -sh /path/to/easysearch/data

# 查看 inode 使用情况
df -i

2. 检查磁盘健康状态 #

# 使用 smartctl 检查磁盘健康
sudo smartctl -a /dev/sdX

# 查看磁盘错误
sudo smartctl -l error /dev/sdX

# 执行磁盘自检
sudo smartctl -t long /dev/sdX

3. 清理磁盘空间 #

# 删除旧的索引
DELETE /<old_index>

# 删除旧的快照
DELETE /_snapshot/<repository>/<snapshot_name>

# 清理日志文件
sudo rm /path/to/easysearch/logs/easysearch.log.*

4. 检查文件系统 #

# 检查文件系统错误
sudo fsck /dev/sdX

# 查看挂载点
mount | grep easysearch

# 重新挂载文件系统
sudo mount -o remount,rw /path/to/easysearch/data

5. 检查磁盘读写 #

# 测试磁盘写入
dd if=/dev/zero of=/path/to/easysearch/data/test.img bs=1M count=100

# 测试磁盘读取
dd if=/path/to/easysearch/data/test.img of=/dev/null bs=1M

# 清理测试文件
rm /path/to/easysearch/data/test.img

6. 查看系统日志 #

# 查看内核日志中的磁盘错误
dmesg | grep -i "error\|i/o error"

# 查看 syslog
grep -i "disk\|i/o" /var/log/syslog | tail -50

# 查看 Easysearch 日志
grep -i "fs.*health\|disk.*error" /path/to/easysearch/logs/easysearch.log | tail -100

7. 检查 RAID 状态 #

# 查看 RAID 状态
cat /proc/mdstat

# 查看 RAID 详细信息
sudo mdadm --detail /dev/mdX

# 查看磁盘阵列状态
sudo megacli -AdpAllInfo -aAll  # 对于 LSI RAID 卡

8. 调整磁盘水位线配置 #

# 查看当前配置
GET /_cluster/settings?flat_settings=true

# 调整磁盘水位线
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "90%",
    "cluster.routing.allocation.disk.watermark.high": "95%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "98%"
  }
}

# 使用绝对值
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "100gb",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb"
  }
}

9. 解除洪水阶段水印 #

# 如果索引被设置为只读,需要解除
PUT /<index>/_settings
{
  "index.blocks.read_only_allow_delete": null
}

# 对所有索引解除
PUT /_all/_settings
{
  "index.blocks.read_only_allow_delete": null
}

10. 迁移分片到其他节点 #

# 排除问题节点
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._name": "problem_node"
  }
}

# 等待分片迁移完成后重启节点
GET /_cat/shards?v

11. 重启节点 #

# 排除节点后重启
sudo systemctl restart easysearch

# 或
sudo service easysearch restart

# 重启后恢复节点
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._name": null
  }
}

12. 更换故障磁盘 #

# 如果磁盘物理故障,需要更换
# 1. 备份数据
# 2. 将数据迁移到其他节点
# 3. 关闭节点
# 4. 更换磁盘
# 5. 重建 RAID(如适用)
# 6. 重启节点

13. 检查网络存储(如适用) #

# 对于 NFS,检查挂载状态
mount | grep nfs

# 测试 NFS 连接
showmount -e <nfs_server>

# 重新挂载 NFS
sudo umount /path/to/nfs/mount
sudo mount -t nfs <nfs_server>:/path /path/to/nfs/mount

14. 禁用磁盘分配决策器(临时) #

# 仅用于紧急情况,不推荐长期使用
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.threshold_enabled": false
  }
}

# 完成修复后重新启用
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.threshold_enabled": true
  }
}

15. 监控磁盘健康 #

# 配置磁盘监控
# 使用 tools 如 collectd, prometheus, 或 nagios

# 查看节点统计信息
GET /_nodes/stats/fs?human

预防措施 #

  • 定期检查磁盘健康状态
  • 配置磁盘空间告警
  • 保持至少 20-30% 的磁盘空闲空间
  • 使用 RAID 提高容错能力
  • 实施磁盘监控和自动告警
  • 定期清理旧数据和日志
  • 配置合理的磁盘水位线
  • 使用专用的数据磁盘
  • 避免将系统盘用于数据存储
  • 实施磁盘备份策略
  • 监控磁盘 IO 性能