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

为什么这个错误发生 #

recovery_failed_exception 表示分片恢复过程失败。恢复是指将数据从一个节点复制到另一个节点的过程,发生在副本创建、节点重启、分片迁移等场景。

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

  1. 网络问题:节点间网络连接中断或不稳定
  2. 磁盘空间不足:目标节点磁盘空间不足
  3. 数据损坏:源分片数据损坏
  4. 超时:恢复过程超过时间限制
  5. 并发恢复过多:同时进行的恢复操作过多
  6. 传输失败:数据传输过程中发生错误
  7. 节点故障:源节点或目标节点故障
  8. 文件锁定:文件被其他进程锁定

如何修复这个错误 #

1. 检查恢复状态 #

# 查看正在进行的恢复
GET /_cat/recovery?v

# 查看特定索引的恢复
GET /_cat/recovery?v&active_only=true

2. 检查分片状态 #

# 查看分片分配状态
GET /_cat/shards?v

# 查看未分配的分片
GET /_cluster/allocation/explain

3. 重试恢复 #

# 触发分片重新分配
POST /_cluster/reroute?retry_failed=true

4. 限制并发恢复数 #

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

5. 增加恢复超时时间 #

# 调整恢复超时设置
PUT /_cluster/settings
{
  "transient": {
    "indices.recovery.max_bytes_per_sec": "50mb",
    "indices.recovery.activity_timeout": "10m"
  }
}

6. 检查磁盘空间 #

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

# 确保目标节点有足够空间
df -h

7. 检查网络连接 #

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

# 检查网络延迟和带宽

8. 检查节点日志 #

# 查看恢复相关日志
grep -i "recovery" /path/to/easysearch/logs/easysearch.log | tail -50

# 查找错误信息
grep -i "failed" /path/to/easysearch/logs/easysearch.log | tail -50

9. 重新分配分片 #

# 手动将分片分配到其他节点
POST /_cluster/reroute
{
  "commands": [
    {
      "move": {
        "index": "<index>",
        "shard": 0,
        "from_node": "source_node",
        "to_node": "target_node"
      }
    }
  ]
}

10. 删除并重建副本 #

# 减少副本数量为 0
PUT /<index>/_settings
{
  "index": {
    "number_of_replicas": 0
  }
}

# 等待集群稳定后重新添加副本
PUT /<index>/_settings
{
  "index": {
    "number_of_replicas": 1
  }
}

11. 从快照恢复 #

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

12. 检查文件系统 #

# 检查文件系统错误
fsck -f /dev/sda1

# 检查文件权限
ls -la /path/to/data/

预防措施 #

  • 确保稳定的网络连接
  • 监控磁盘空间使用情况
  • 配置合理的恢复并发数
  • 避免在高负载时进行大量恢复
  • 定期检查节点健康状态
  • 配置适当的恢复超时设置
  • 使用快照备份重要数据
  • 监控恢复状态和进度