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

适用版本: 7.14-8.9

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

failed to get snapshot info 表示 Elasticsearch 已经定位到某个快照 ID,但在进一步读取这个快照的详情元数据时失败了。它通常出现在列举快照、查询快照详情、恢复前检查快照信息等场景。

常见现象 #

  • GET /_snapshot/{repository}/{snapshot} 返回 500
  • 某些快照可以正常列出,但个别快照一读取详情就失败。
  • 日志里可能同时出现 NoSuchFileExceptionNotXContentExceptionSnapshotMissingException 或底层存储读取异常。

典型报错与异常栈 #

org.elasticsearch.snapshots.SnapshotException: [prod-backup:snap-2026.03.30] failed to get snapshot info
Caused by: java.io.IOException / org.elasticsearch.common.compress.NotXContentException

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

Elasticsearch 在读取快照详情时,需要从仓库中加载该快照对应的元数据 blob。如果文件缺失、内容损坏或底层读取失败,就会抛出这个异常。常见原因包括:

  • 快照元数据文件缺失,导致触发 NoSuchFileException
  • 快照详情文件内容损坏或格式异常,触发 NotXContentException
  • 对象存储、共享文件系统或远程仓库读取失败。
  • 仓库曾被人工修改、迁移不完整,或多个集群并发写入造成快照记录与文件不一致。

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

建议把重点放在“具体哪个快照的哪个元数据文件读失败”。

  1. 先定位报错中的仓库名和快照名。
  2. 用接口确认是否只有单个快照失败,还是整个仓库读取都异常:
GET /_snapshot/prod-backup/_all
GET /_snapshot/prod-backup/snap-2026.03.30
  1. 查看主节点日志里的完整 Caused by,判断是文件缺失、内容损坏还是底层 IO 失败。
  2. 如果仓库在对象存储上,检查目标快照相关 blob 是否存在,权限是否完整,最近是否有人做过人工清理或生命周期回收。
  3. 如果是共享文件系统仓库,检查挂载一致性、路径配置和底层文件是否被误删或覆盖。

排查时需要注意的问题 #

  • failed to get snapshot info 说明问题已经落到某个具体快照,而不是泛泛的仓库不可用。
  • 如果 _all 能列出快照,但读取单个快照详情失败,通常是该快照自己的元数据文件有问题。
  • 不要因为仓库里还能看到其他快照就排除存储层故障,局部对象缺失也很常见。

4. 如何解决这个错误 #

常用修复思路 #

  • 如果是权限或连通性问题,修复仓库访问权限和网络后重新验证读取。
  • 如果是个别快照元数据缺失或损坏,需要评估该快照是否还能使用,必要时删除损坏快照并重新备份。
  • 如果是仓库迁移或人工改动引起的不一致,先停止仓库写入,再检查元数据与底层文件的对应关系。
  • 如果多个集群共享写入同一仓库,改为单写多读模式,避免继续制造不一致。

相关 Elasticsearch API #

  • GET /_snapshot/{repository}/_all:列出全部快照。
  • GET /_snapshot/{repository}/{snapshot}:读取指定快照详情。
  • POST /_snapshot/{repository}/_verify:验证仓库是否可正常访问。

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

  • INFINI Console 可集中查看快照任务、节点异常和仓库访问日志,便于确认是单个快照问题还是仓库整体问题。
  • INFINI Gateway 可辅助定位上游是否持续请求一个已经损坏或缺失元数据的快照。

5. 小结 #

failed to get snapshot info 的本质是“快照记录找到了,但快照详情读不出来”。处理时应优先判断是单个快照元数据损坏、底层文件缺失,还是仓库访问本身异常,再决定是修复存储、删除坏快照还是调整仓库访问方式。

相关错误 #

附:日志上下文 #

try {
	snapshotInfo = SNAPSHOT_FORMAT.read(metadata.name(), blobContainer(), snapshotId.getUUID(), namedXContentRegistry);
} catch (NoSuchFileException ex) {
	failure = new SnapshotMissingException(metadata.name(), snapshotId, ex);
} catch (IOException | NotXContentException ex) {
	failure = new SnapshotException(metadata.name(), snapshotId, "failed to get snapshot info " + snapshotId, ex);
}