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

适用版本: 6.8-8.9

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

Snapshot has no segments file 表示 Elasticsearch 在恢复某个 shard 时,已经根据 snapshot metadata 构造出 Store.MetadataSnapshot,但调用 getSegmentsFile() 得到的是 null。由于 segments 文件是恢复 Lucene 索引目录的关键入口,缺少它时会直接抛出 IndexShardRestoreFailedException

这属于 restore 执行阶段的底层文件完整性异常。

常见现象 #

  • restore 已进入 shard 执行阶段,但特定 shard 直接失败。
  • 日志常伴随 IndexShardRestoreFailedException 和具体 shardId
  • 相比“快照不存在”或“索引无法升级”,这一步更靠后,说明前置校验大概率已经通过。
  • 常见于快照元数据损坏、不完整或 segments 文件引用缺失。

典型报错与异常栈 #

IndexShardRestoreFailedException: [index][0] Snapshot has no segments file

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

恢复 shard 时,Elasticsearch 需要根据 snapshot metadata 找到 segments 文件,才能建立恢复差异和文件拷贝计划。如果这一步拿不到 segments file,就说明源快照中的 shard 元数据不完整,或者关键文件引用已经丢失。

常见原因通常包括:

  • shard 对应的快照元数据损坏,缺少 segments 文件条目。
  • 快照仓库对象不完整,segments 文件未写入或已丢失。
  • 手工操作仓库内容后,metadata 与真实对象不再一致。

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

建议按“先确认是单 shard metadata 损坏,还是整个快照仓库存在完整性问题”的顺序处理:

  1. 确认失败是否集中在固定 shard。
  2. 查看同一快照中其他 shard 是否可恢复。
  3. 若只是单 shard 失败,优先怀疑该 shard 的 snapshot metadata 或文件引用损坏。
  4. 若多个 shard 都缺 segments 文件,回到仓库完整性和快照写入质量排查。

相关 Elasticsearch API #

  • GET /_recovery:查看 shard 恢复停在哪一阶段。
  • GET /_snapshot/{repository}/{snapshot}:确认源快照和索引仍可见。
  • GET /_cluster/allocation/explain:查看失败 shard 后续为何无法继续恢复。

排查时需要注意的问题 #

  • 这是执行阶段的文件完整性问题,不是快照名称或兼容性校验问题。
  • 如果仓库是对象存储,不要忽略部分对象丢失、同步延迟或手工清理的可能性。
  • 对损坏 shard 强行重复恢复通常无效,先确认是否有更完整的备份快照。

4. 如何解决这个错误 #

常用修复思路 #

  • 优先改用其他完整快照恢复该索引或 shard。
  • 对仓库做完整性检查,确认 segments 文件及相关 metadata 是否缺失。
  • 避免手工修改仓库内容,并为关键索引保留多代快照。

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

  • INFINI Console 适合关联查看失败 shard、仓库异常和恢复阶段信息。
  • INFINI Gateway 可帮助识别是否有批量恢复任务持续打到已损坏快照。

5. 小结 #

Snapshot has no segments file 说明 restore 已走到 shard 文件恢复阶段,但源快照缺少最关键的 segments 文件引用。处理重点在快照完整性和替代快照选择,而不是继续重复提交 restore 请求。

相关错误 #

附:日志上下文 #

final StoreFileMetadata restoredSegmentsFile = sourceMetadata.getSegmentsFile();
if (restoredSegmentsFile == null) {
	throw new IndexShardRestoreFailedException(shardId, "Snapshot has no segments file");
}