为什么这个错误发生 #
recover_files_recovery_exception 表示在分片恢复过程中传输文件时失败。恢复文件是分片恢复的关键步骤,需要将索引文件从源节点复制到目标节点。
这个错误可能由以下原因引起:
- 网络中断:节点间的网络连接在传输过程中中断
- 磁盘空间不足:目标节点磁盘空间不足
- 文件损坏:源节点的文件损坏无法读取
- 传输超时:大文件传输超时
- 并发限制:达到并发恢复限制
- 磁盘 IO 错误:磁盘读写错误
- 文件系统错误:文件系统问题
- 节点故障:源节点或目标节点故障
- 文件权限问题:文件权限不正确
- 传输带宽不足:网络带宽不足
如何修复这个错误 #
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>"
}
预防措施 #
- 保持足够的磁盘空间
- 配置合理的恢复速度
- 监控恢复进度
- 使用稳定的网络连接
- 配置足够的副本
- 定期创建快照备份
- 监控磁盘健康状态
- 避免同时恢复大量分片
- 使用增量恢复
- 实现恢复失败自动重试





