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

为什么这个错误发生 #

recover_files_recovery_exception 表示在分片恢复过程中传输文件时失败。恢复文件是分片恢复的关键步骤,需要将索引文件从源节点复制到目标节点。

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

  1. 网络中断:节点间的网络连接在传输过程中中断
  2. 磁盘空间不足:目标节点磁盘空间不足
  3. 文件损坏:源节点的文件损坏无法读取
  4. 传输超时:大文件传输超时
  5. 并发限制:达到并发恢复限制
  6. 磁盘 IO 错误:磁盘读写错误
  7. 文件系统错误:文件系统问题
  8. 节点故障:源节点或目标节点故障
  9. 文件权限问题:文件权限不正确
  10. 传输带宽不足:网络带宽不足

如何修复这个错误 #

1. 查看恢复状态 #

# 查看当前恢复状态
GET /_cat/recovery?v&active_only=true

# 查看详细恢复信息
GET /<index>/_recovery?human&detailed=true

# 查看恢复的文件和字节数
GET /_recovery?human&filter_path=**.files,**.bytes

2. 检查磁盘空间 #

# 查看磁盘使用情况
GET /_cat/allocation?v

# 检查系统磁盘空间
df -h /path/to/easysearch/data

# 清理不必要的文件或索引
DELETE /<old_index>

3. 检查网络连接 #

# 测试节点间网络
ping <target_node>
telnet <target_node> 9300

# 检查网络带宽
iperf -c <target_node>

4. 调整恢复配置 #

# 减少并发恢复数量
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.node_concurrent_recoveries": 2
  }
}

# 减少恢复速度
PUT /<index>/_settings
{
  "index": {
    "recovery": {
      "max_bytes_per_sec": "10mb"
    }
  }
}

5. 重试恢复 #

# 取消卡住的恢复
POST /_cluster/reroute
{
  "commands": [
    {
      "cancel": {
        "index": "<index>",
        "shard": 0,
        "node": "<node_name>"
      }
    }
  ]
}

# 重新触发恢复
POST /_cluster/reroute?retry_failed=true

6. 重启节点 #

# 如果节点状态异常,重启相关节点
sudo systemctl restart easysearch

# 等待节点重新加入集群
GET /_cat/nodes?v

7. 检查文件权限 #

# 检查数据目录权限
ls -la /path/to/easysearch/data

# 修复权限
chown -R easysearch:easysearch /path/to/easysearch/data
chmod -R 750 /path/to/easysearch/data

8. 从快照恢复 #

# 如果恢复持续失败,从快照恢复
POST /_snapshot/<repository>/<snapshot_name>/_restore
{
  "indices": "<index>",
  "include_global_state": false
}

9. 查看错误日志 #

# 查看恢复相关错误日志
grep -i "recovery.*fail\|transfer.*error" /path/to/easysearch/logs/easysearch.log | tail -100

# 查看文件传输错误
grep -i "file.*not.*found\|io.*error" /path/to/easysearch/logs/easysearch.log | tail -50

10. 使用不同的恢复源 #

# 移动分片到其他节点恢复
POST /_cluster/reroute
{
  "commands": [
    {
      "move": {
        "index": "<index>",
        "shard": 0,
        "from_node": "<source_node>",
        "to_node": "<new_target_node>"
      }
    }
  ]
}

11. 增加超时时间 #

# 在 easysearch.yml 中增加超时
recovery.internal_action_timeout: 15m
indices.recovery.max_bytes_per_sec: 100mb

12. 分批恢复 #

# 如果有多个分片需要恢复,分批进行
# 暂停分片分配
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": "none"
  }
}

# 恢复后重新启用
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": "all"
  }
}

13. 检查磁盘健康 #

# 检查磁盘健康状态
sudo smartctl -a /dev/sdX

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

14. 验证源分片 #

# 确保源分片健康
GET /_cat/shards?v&h=index,shard,prirep,state,node

# 查看分片存储状态
GET /<index>/_shard_stores?status=green

15. 重建分片 #

# 如果恢复无法完成,考虑重建分片
# 删除并从副本重建
DELETE /<index>

# 从快照或数据源重新导入
POST /_snapshot/<repository>/<snapshot_name>/_restore
{
  "indices": "<index>"
}

预防措施 #

  • 保持足够的磁盘空间
  • 配置合理的恢复速度
  • 监控恢复进度
  • 使用稳定的网络连接
  • 配置足够的副本
  • 定期创建快照备份
  • 监控磁盘健康状态
  • 避免同时恢复大量分片
  • 使用增量恢复
  • 实现恢复失败自动重试