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

适用版本: 6.8-8.9

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

empty restore source 表示某个分片已经开始进入 restore 恢复链路,但 restoreSource 为空,导致 Elasticsearch 无法知道应该从哪个快照源恢复该分片,因此抛出 IndexShardRestoreFailedException

这类错误不在 restore 请求参数校验阶段,而是在分片级实际恢复开始时才暴露出来。

常见现象 #

  • restore 请求已提交,部分分片进入恢复流程后失败。
  • 主节点或数据节点日志中出现 empty restore source
  • 同一恢复任务里可能只有个别分片失败,而不是整个请求立即被拒绝。
  • 常与恢复元数据不完整、cluster state 异常或恢复上下文丢失同时出现。

典型报错与异常栈 #

IndexShardRestoreFailedException: [index][0] empty restore source

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

分片恢复需要从 RecoverySource.SnapshotRecoverySource 获取快照、仓库和索引相关元数据。如果这个恢复源对象为空,说明当前分片进入恢复流程时,所依赖的恢复上下文没有被正确传递或已丢失。

常见原因通常包括:

  • cluster state 中的 restore 元数据不完整或已发生异常变更。
  • 分片恢复初始化阶段被中断,导致恢复源未正确挂到 shard recovery state 上。
  • 主节点切换、恢复任务取消或状态漂移,让数据节点收到一个不完整的恢复上下文。
  • 快照恢复的上游元数据本身异常,分片在真正启动恢复时才发现缺失。

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

建议按“先确认 restore 元数据是否完整,再判断是分片局部问题还是整个恢复上下文漂移”的顺序处理:

  1. 查看失败分片所在恢复任务,确认是否只有个别 shard 报错。
  2. 检查主节点日志和 cluster state 中 restore 元数据是否完整。
  3. 对照快照、索引和仓库信息,确认恢复源在请求提交时是否存在。
  4. 如果伴随主节点切换或恢复取消事件,优先沿时间线排查上下文是否丢失。

相关 Elasticsearch API #

  • GET /_recovery?active_only=true:查看正在恢复的分片及失败上下文。
  • GET /_cluster/state:检查 restore 相关元数据。
  • GET /_snapshot/{repository}/{snapshot}:确认源快照仍然存在且可读。

排查时需要注意的问题 #

  • 这类异常已经进入 shard 恢复阶段,不要再只盯着 restore 请求体。
  • 如果只是个别分片失败,重点看该 shard 的恢复状态与元数据,而不是整个仓库都出问题。
  • cannot delete snapshot during a restore 不同,这里不是并发保护,而是恢复上下文本身缺失。

4. 如何解决这个错误 #

常用修复思路 #

  • 先确认源快照和 restore 元数据完整,再重新发起恢复。
  • 如果恢复过程伴随主节点切换或 cluster state 异常,先恢复集群稳定性。
  • 对局部分片异常的场景,重点排查该 shard 的恢复记录和上游快照元数据。
  • 避免在恢复过程中叠加大量状态变更操作,减少恢复上下文漂移风险。

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

  • INFINI Console 适合关联查看分片恢复状态、主节点日志和恢复失败时间线。
  • INFINI Gateway 可帮助审计恢复请求、取消请求和相关异常调用的先后顺序。

5. 小结 #

empty restore source 的关键不是“快照不存在”,而是某个分片在进入恢复阶段时拿不到有效恢复源。处理时要围绕 restore 元数据、cluster state 和分片恢复上下文来查,而不是只看 restore API 请求参数。

相关错误 #

附:日志上下文 #

if (restoreSource == null) {
	listener.onFailure(new IndexShardRestoreFailedException(shardId, "empty restore source"));
	return;
}