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

为什么这个错误发生 #

recovery_engine_exception 表示在分片恢复过程中的引擎阶段失败。恢复引擎负责将分片恢复到一致状态,包括事务日志和索引文件的恢复。

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

  1. 事务日志损坏:事务日志文件损坏无法恢复
  2. 索引文件损坏:Lucene 索引文件损坏
  3. 检查点不匹配:检查点信息不匹配
  4. 恢复阶段失败:特定恢复阶段(Phase 1-4)执行失败
  5. 磁盘 IO 错误:磁盘读写错误
  6. 内存不足:恢复过程中内存不足
  7. 版本冲突:恢复的版本与当前不兼容
  8. 引擎初始化失败:引擎初始化失败
  9. 分段文件丢失:恢复所需的分段文件丢失
  10. 并发修改冲突:恢复过程中有并发修改

如何修复这个错误 #

1. 查看恢复状态和阶段 #

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

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

# 查看特定分片的恢复
GET /_cat/recovery?v&h=index,shard,stage,bytes_percent

2. 检查错误日志中的阶段信息 #

# 错误包含阶段编号
# Phase 1: Translog 转储
# Phase 2: 索引文件恢复
# Phase 3: 事务日志重放
# Phase 4: 最终清理

grep -i "recovery.*phase\|engine.*error" /path/to/easysearch/logs/easysearch.log | tail -100

3. 检查事务日志 #

# 查看事务日志文件
ls -la /path/to/easysearch/data/nodes/0/indices/<index_id>/0/translog/

# 检查事务日志是否损坏

4. 重试恢复 #

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

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

5. 清理事务日志 #

# 如果事务日志损坏,可能需要清理
# 注意:这会导致数据丢失
# 停止节点
sudo systemctl stop easysearch

# 删除损坏的事务日志
rm /path/to/easysearch/data/nodes/0/indices/<index_id>/0/translog/*

# 重启节点
sudo systemctl start easysearch

6. 从快照恢复 #

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

7. 重启节点 #

# 有时重启可以清理引擎状态
sudo systemctl restart easysearch

# 等待节点启动
GET /_cat/nodes?v

8. 检查磁盘空间和 IO #

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

# 检查磁盘 IO
iostat -x 1

# 查看磁盘错误
dmesg | grep -i "error\|i/o"

9. 增加恢复超时 #

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

10. 减少恢复并发 #

# 减少并发恢复避免资源争用
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.node_concurrent_recoveries": 1
  }
}

11. 使用不同的恢复模式 #

# 可以尝试使用不同的恢复方式
# 基于网关的恢复 vs 基于副本的恢复

12. 重建分片 #

# 如果无法恢复,可能需要重建分片
# 从副本恢复
DELETE /<index>
# 然后重新导入数据或从快照恢复

13. 检查索引文件完整性 #

# 检查索引文件
ls -la /path/to/easysearch/data/nodes/0/indices/<index_id>/0/index/

# 查找损坏的文件

14. 查看引擎统计 #

# 查看引擎相关统计
GET /_nodes/stats/indices?filter_path=**.engine

15. 验证集群状态 #

# 确保集群状态一致
GET /_cluster/state?filter_path=metadata.indices.<index>

# 等待集群稳定
GET /_cluster/health?wait_for_status=yellow&timeout=50s

预防措施 #

  • 优雅关闭节点
  • 保持磁盘空间充足
  • 配置合理的恢复速度
  • 定期创建快照备份
  • 监控恢复进度
  • 避免频繁的分片迁移
  • 监控磁盘健康
  • 保持稳定的网络
  • 配置足够的副本
  • 实现恢复失败自动重试