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

适用版本: 7.16-8.9

1. 错误异常的基本描述 #

在从快照恢复分片时,Elasticsearch 会并行下载和应用快照文件。如果发现某些下载失败,或者恢复中的文件状态与源索引文件不再一致,它会取消当前这一轮文件恢复,等待飞行中的请求收尾后再重置恢复流程。此时常见异常就是 Recover snapshot files cancelled

常见现象 #

  • 快照恢复过程中中断,但不是简单的“目标分片不存在”。
  • 恢复日志中往往伴随文件下载失败、校验不一致或底层 I/O 报错。
  • 某些场景下 Elasticsearch 会改为回退并重新从源节点文件恢复,而不是继续使用当前快照文件流。

典型报错与异常栈 #

org.elasticsearch.common.util.CancellableThreads$ExecutionCancelledException: Recover snapshot files cancelled

2. 为什么会发生这个错误 #

代码注释已经给出信号:当部分快照文件下载失败,导致“已恢复的快照文件”和“源索引文件”不再一致时,当前恢复必须整体取消并重来。这通常意味着恢复过程中的文件级一致性已被打破。

常见根因包括:

  • 仓库到目标节点的网络传输中断或超时。
  • 对象存储读失败、文件损坏或短时不可用。
  • 恢复过程中分片状态变化,导致当前恢复上下文失效。
  • 节点负载高、磁盘 I/O 异常,造成部分文件落地失败。

3. 如何排查和解决这个异常和解决这个异常 #

  1. 先检查恢复状态:
GET /_recovery?active_only=true&detailed=true
  1. 结合节点日志查看在取消前的真正失败原因,通常在更早的 Caused by 中。
  2. 如果是快照仓库恢复,检查仓库连通性和对象存储读取稳定性。
  3. 观察目标节点磁盘、网络和线程池是否在恢复时出现资源瓶颈。
  4. 如果恢复被反复取消,排查是否同时存在节点重启、分片重新分配或恢复来源切换。

排查时需要注意的问题 #

  • Recover snapshot files cancelled 通常是恢复控制流的结果,不是第一现场根因。
  • 真正的原因往往在此前的文件下载失败、校验失败或 I/O 异常日志里。
  • 只盯着最后这条取消异常,容易忽略真正导致恢复重置的前序错误。

4. 如何解决这个错误 #

常用修复思路 #

  • 优先修复底层文件读取失败的原因,例如对象存储权限、网络超时、磁盘问题。
  • 避免在节点资源紧张或频繁重分配期间执行大规模恢复。
  • 必要时降低并发恢复压力,给节点更多磁盘和网络余量。
  • 底层问题修复后重新触发恢复,让系统走一次完整、稳定的恢复流程。

相关 Elasticsearch API #

  • GET /_recovery?active_only=true&detailed=true:查看恢复进度与失败点。
  • GET /_snapshot/{repository}/{snapshot}:确认恢复来源快照是否正常。
  • GET /_cat/shards?v:查看分片是否因状态变化导致恢复上下文切换。

借助 INFINI 产品提升排障效率 #

  • INFINI Console 有助于把恢复失败、节点资源波动和仓库异常日志串在一起看。
  • INFINI Gateway 适合追踪恢复相关管理请求的重试与失败链路。

5. 小结 #

Recover snapshot files cancelled 说明当前快照文件恢复已经被系统主动放弃,准备回退重来。它通常不是根因本身,而是前面文件下载失败或一致性校验异常的结果。排查重点应放在取消前的底层 I/O 和仓库访问错误上。

相关错误 #

附:日志上下文 #

assert this.cancelled.get();
throw new CancellableThreads.ExecutionCancelledException("Recover snapshot files cancelled");