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

适用版本: 7.x-8.x

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

Failed to get store file metadata 表示快照流程已经拿到了当前分片的 IndexCommit,但在读取该提交对应的本地 store 元数据时失败。

这说明问题发生在“从本地分片读取待快照文件信息”这一步,还没有进入远端仓库上传阶段。

常见现象 #

  • 某个分片快照失败,但仓库本身可能仍然可访问。
  • 日志中出现 IndexShardSnapshotFailedException,并带有底层 IOException
  • 同一快照任务中,个别分片失败而其他分片继续执行。

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

源码先记录当前 IndexCommit,随后执行 store.getMetadata(snapshotIndexCommit)snapshotIndexCommit.getFileNames()。只要读取提交点对应的本地文件元数据失败,就会抛出这个异常。

常见原因包括:

  • 分片本地段文件缺失、损坏或无法读取。
  • 节点磁盘异常、文件系统抖动或 I/O 故障。
  • 分片在快照期间正经历恢复、关闭或并发异常。
  • 底层 Lucene commit 信息与实际文件状态不一致。

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

  1. 先确认失败的是哪个索引、分片和快照任务。
  2. 查看分片所在节点日志,定位 IOException 的底层原因。
  3. 检查本地磁盘、文件系统、段文件和分片恢复状态。
  4. 确认该分片是否近期发生过异常重启、磁盘迁移或文件损坏。
  5. 如果只有单个副本异常,考虑切换到健康副本后重试快照。

4. 如何解决这个错误 #

常用修复思路 #

  • 修复分片所在节点的磁盘或文件系统问题。
  • 让分片恢复到稳定状态后重新执行快照。
  • 对已损坏的分片通过副本恢复或重建索引进行修复。
  • 不要把这个错误误判成仓库权限问题,因为失败点还在本地 store 元数据读取。

5. 小结 #

Failed to get store file metadata 指向的是快照前半段的本地文件元数据收集失败。先看分片本地健康度,再看仓库侧,排查路径会更高效。

相关错误 #

附:日志上下文 #

final IndexCommit snapshotIndexCommit = context.indexCommit();
    logger.trace("[{}] [{}] Loading store metadata using index commit [{}]"; shardId; snapshotId; snapshotIndexCommit);
    metadataFromStore = store.getMetadata(snapshotIndexCommit);
    fileNames = snapshotIndexCommit.getFileNames();
} catch (IOException e) {
    throw new IndexShardSnapshotFailedException(shardId; "Failed to get store file metadata"; e);
}
    }
    for (String fileName : fileNames) {
        if (snapshotStatus.isAborted()) {
            logger.debug("[{}] [{}] Aborted on the file [{}]; exiting"; shardId; snapshotId; fileName);