--- title: "恢复失败 (recovery_failed_exception) 错误排查与解决" date: 2026-01-10 lastmod: 2026-01-10 description: "recovery_failed_exception 表示分片恢复过程失败,通常由网络问题、磁盘空间不足、数据损坏或超时引起。" tags: ["分片恢复", "数据恢复"] summary: "为什么这个错误发生 # recovery_failed_exception 表示分片恢复过程失败。恢复是指将数据从一个节点复制到另一个节点的过程,发生在副本创建、节点重启、分片迁移等场景。 这个错误可能由以下原因引起: 网络问题:节点间网络连接中断或不稳定 磁盘空间不足:目标节点磁盘空间不足 数据损坏:源分片数据损坏 超时:恢复过程超过时间限制 并发恢复过多:同时进行的恢复操作过多 传输失败:数据传输过程中发生错误 节点故障:源节点或目标节点故障 文件锁定:文件被其他进程锁定 如何修复这个错误 # 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_failed_exception` 表示分片恢复过程失败。恢复是指将数据从一个节点复制到另一个节点的过程,发生在副本创建、节点重启、分片迁移等场景。 这个错误可能由以下原因引起: 1. **网络问题**:节点间网络连接中断或不稳定 2. **磁盘空间不足**:目标节点磁盘空间不足 3. **数据损坏**:源分片数据损坏 4. **超时**:恢复过程超过时间限制 5. **并发恢复过多**:同时进行的恢复操作过多 6. **传输失败**:数据传输过程中发生错误 7. **节点故障**:源节点或目标节点故障 8. **文件锁定**:文件被其他进程锁定 ## 如何修复这个错误 ### 1. 检查恢复状态 ```bash # 查看正在进行的恢复 GET /_cat/recovery?v # 查看特定索引的恢复 GET /_cat/recovery?v&active_only=true ``` ### 2. 检查分片状态 ```bash # 查看分片分配状态 GET /_cat/shards?v # 查看未分配的分片 GET /_cluster/allocation/explain ``` ### 3. 重试恢复 ```bash # 触发分片重新分配 POST /_cluster/reroute?retry_failed=true ``` ### 4. 限制并发恢复数 ```bash # 减少并发恢复数量 PUT /_cluster/settings { "transient": { "cluster.routing.allocation.node_concurrent_recoveries": 2, "indices.recovery.max_concurrent_file_chunks": 2 } } ``` ### 5. 增加恢复超时时间 ```bash # 调整恢复超时设置 PUT /_cluster/settings { "transient": { "indices.recovery.max_bytes_per_sec": "50mb", "indices.recovery.activity_timeout": "10m" } } ``` ### 6. 检查磁盘空间 ```bash # 查看磁盘使用情况 GET /_cat/allocation?v # 确保目标节点有足够空间 df -h ``` ### 7. 检查网络连接 ```bash # 测试节点间网络 ping telnet 9300 # 检查网络延迟和带宽 ``` ### 8. 检查节点日志 ```bash # 查看恢复相关日志 grep -i "recovery" /path/to/easysearch/logs/easysearch.log | tail -50 # 查找错误信息 grep -i "failed" /path/to/easysearch/logs/easysearch.log | tail -50 ``` ### 9. 重新分配分片 ```bash # 手动将分片分配到其他节点 POST /_cluster/reroute { "commands": [ { "move": { "index": "", "shard": 0, "from_node": "source_node", "to_node": "target_node" } } ] } ``` ### 10. 删除并重建副本 ```bash # 减少副本数量为 0 PUT //_settings { "index": { "number_of_replicas": 0 } } # 等待集群稳定后重新添加副本 PUT //_settings { "index": { "number_of_replicas": 1 } } ``` ### 11. 从快照恢复 ```bash # 如果恢复持续失败,从快照恢复 POST /_snapshot///_restore { "indices": "" } ``` ### 12. 检查文件系统 ```bash # 检查文件系统错误 fsck -f /dev/sda1 # 检查文件权限 ls -la /path/to/data/ ``` ### 预防措施 - 确保稳定的网络连接 - 监控磁盘空间使用情况 - 配置合理的恢复并发数 - 避免在高负载时进行大量恢复 - 定期检查节点健康状态 - 配置适当的恢复超时设置 - 使用快照备份重要数据 - 监控恢复状态和进度