为什么这个错误发生 #
node_health_check_failure_exception 表示节点的文件系统健康检查失败。当 FsHealthService 报告文件系统不健康时,该节点需要从集群中移除。
这个错误可能由以下原因引起:
- 磁盘故障:物理磁盘故障或损坏
- 磁盘空间不足:磁盘使用率超过配置的阈值
- 磁盘 IO 错误:磁盘读写错误
- 文件系统损坏:文件系统元数据损坏
- 只读文件系统:文件系统变为只读状态
- 磁盘错误过多:超过允许的磁盘错误阈值
- 挂载点问题:磁盘挂载点出现问题
- RAID 故障:RAID 阵列故障或降级
- NFS/网络存储问题:网络存储连接问题
- 磁盘控制器故障:磁盘控制器硬件故障
如何修复这个错误 #
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 性能





