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

适用版本: 7.4-8.9

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

failed to verify repository 表示 Elasticsearch 已经识别到某个快照仓库定义,但在执行仓库校验时失败了。仓库校验的目的,是确认参与校验的节点都能访问同一份仓库存储,并且具备正确的读写权限。因此它比“创建仓库成功”更进一步,更能暴露共享文件系统、对象存储访问权限、节点间可见性不一致等问题。

从当前日志片段看,异常重点在于“仓库不是 master 节点和当前节点共享的,或者节点没有权限读取 master 节点写入的文件”。这说明问题核心不在查询或索引,而在仓库底层存储是否真的能被集群中的相关节点共同访问。

常见现象 #

  • 在调用 POST /_snapshot/{repository}/_verify 时直接失败,返回 repository_verification_exceptionrepository_exception 或底层 access_deniedno_such_fileblob_store_exception 等异常。
  • 仓库已经能够创建,但 verify 失败,这通常说明“定义没问题,实际访问不通”或者“只有部分节点能访问仓库”。
  • 文件系统仓库场景下,最常见现象是 master 节点能看到目录,但数据节点看不到,或者 UID/GID/挂载权限不一致。
  • 对象存储仓库场景下,常见现象包括凭证正确但某些节点出站网络受限、代理配置不一致、DNS 解析异常或 bucket 权限不完整。

典型报错与异常栈 #

这类错误通常会与下面这些异常一起出现:

  • repository_verification_exception
  • failed to verify repository
  • access_denied_exception
  • no_such_file_exception
  • blob_store_exception

常见日志形态通常类似下面这样:

RepositoryVerificationException: [my_backup_repo] Failed to verify repository
Caused by: RepositoryException: path is not shared between this node and the master node
Caused by: AccessDeniedException / NoSuchFileException / SdkClientException

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

这类错误的本质是“仓库定义已经存在,但 Elasticsearch 不能证明它在集群层面真的可用”。也就是说,不是仓库 JSON 写错,而是仓库对应的底层存储条件没有满足 verify 的要求。验证动作通常需要 master 节点和其他节点协作完成,因此很容易暴露单节点视角下看不出来的问题。

常见原因通常包括:

  • 文件系统仓库路径不是所有节点共享可见,或者某些节点挂载路径不同。
  • 节点对仓库目录的读写权限不一致,master 能写、其他节点不能读,或者反过来。
  • 对象存储仓库的 endpoint、代理、证书、凭证、bucket 权限在不同节点上不一致。
  • 部分节点没有安装对应仓库插件,或者插件配置、版本和网络环境不一致。
  • 底层存储短时不可用、DNS 失败、网络隔离或安全策略变更,导致 verify 阶段访问失败。

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

建议按“先看仓库定义,再跑 verify,再确认节点间是否共享同一存储”的顺序处理:

  1. 先查看仓库当前配置,确认 typesettings 没有写错。
  2. 执行 _verify,记录返回中的节点信息和底层错误原因。
  3. 如果是文件系统仓库,重点核查所有相关节点的共享路径、挂载方式和目录权限。
  4. 如果是对象存储仓库,重点核查节点间凭证、代理、出站网络、DNS 和证书配置是否一致。
  5. 修复后重新验证,确认问题不是偶发性存储波动。

相关 Elasticsearch API 及调用说明 #

1. 查看仓库配置 #

curl -X GET "http://localhost:9200/_snapshot/my_backup_repo?pretty"

用于确认仓库类型和配置参数最终是什么,重点看 typelocationbucketbase_path 等。

2. 验证仓库可用性 #

curl -X POST "http://localhost:9200/_snapshot/my_backup_repo/_verify?pretty"

这是定位问题的核心接口。重点关注:

  • 哪些节点参与了校验。
  • 是所有节点失败,还是只有个别节点失败。
  • 失败原因是权限、路径、网络还是对象存储访问异常。

3. 查看节点列表 #

curl -X GET "http://localhost:9200/_cat/nodes?v"

用于确认当前集群有哪些节点在线,以及 verify 失败时是不是只有某个节点有问题。

4. 查看节点插件 #

curl -X GET "http://localhost:9200/_nodes/plugins?pretty"

如果是 S3、GCS、Azure 等仓库,重点确认所有相关节点是否都安装了对应插件。

排查时需要注意的问题 #

  • 创建成功不代表校验成功,更不代表快照一定能用。
  • verify 场景最关键的是“节点之间的一致性”,不要只在单个节点上验证目录或对象存储。
  • 对文件系统仓库来说,共享挂载和权限一致性往往比 API 参数更重要。

4. 如何解决这个错误 #

常用修复思路 #

  • 修复共享文件系统的路径挂载和目录权限,确保所有相关节点都能读写同一仓库路径。
  • 对对象存储仓库,统一节点上的凭证、代理、证书和网络访问策略。
  • 补齐缺失插件或修正不一致的插件配置,再重新执行 verify。
  • 对 verify 通过后的仓库再做一次小范围快照验证,确保不仅能验证,也能实际执行。

后续注意事项与推荐建议 #

  • 为仓库校验建立固定巡检流程,避免等到备份失败时才发现节点可见性问题。
  • 对共享文件系统仓库维护标准化挂载和权限规范。
  • 对对象存储仓库维护统一的节点出网、代理和凭证管理策略。

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

  • INFINI Console 适合观察节点状态和快照异常趋势,帮助识别是否某个节点反复导致仓库校验失败。
  • INFINI Gateway 更适合沉淀变更审计和请求记录,便于回溯仓库配置调整带来的影响。

5. 小结 #

failed to verify repository 的核心在于“仓库定义存在,但集群级别无法证明它可被共同访问”。处理这类问题时,最有效的路径是先看 verify 返回的具体节点,再围绕共享可见性、权限和底层存储连通性逐项收敛。

只要把“仓库定义检查 + verify + 节点一致性”固化成标准流程,这类问题通常都能比事后从快照失败倒查更早发现。

相关错误 #

附:日志上下文 #

下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:

+ "] is not shared between this node and the master node or "
 + "that permissions on the store don't allow reading files written by the master node";
 e
 );
 } catch (Exception e) {
 throw new RepositoryVerificationException(metadata.name(); "Failed to verify repository"; e);
 }
 }
 }  @Override