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

适用版本: 6.8-8.11

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

a file written by master to the store cannot be accessed on the node 是典型的快照仓库校验异常,含义非常明确:master 节点已经把校验文件写进仓库,但另一个参与校验的节点无法读取这个文件。只要出现这个报错,就几乎可以确认仓库对集群来说不是“统一可见”的,或者节点之间对同一仓库的读权限并不一致。

这类错误常见于文件系统仓库、NFS 挂载、共享卷或者对象存储代理配置不一致的场景。它通常不是快照执行到一半才出现,而是在 verify 阶段就暴露出来,是典型的“仓库看起来配置好了,但集群层面并不成立”的问题。

常见现象 #

  • POST /_snapshot/{repository}/_verify 失败,并明确提示某个节点无法访问 master 写入的测试文件。
  • 仓库在某一台节点上看起来路径正常,但 verify 过程中只有部分节点失败。
  • 文件系统仓库中常见表现是 master 与 data 节点挂载的目录名相同,但实际指向的并不是同一个共享存储。
  • 有时仓库创建可以成功,但后续 verify、snapshot 或 cleanup 会持续失败,因为真正的问题是节点间共享访问不一致。

典型报错与异常栈 #

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

  • repository_verification_exception
  • a file written by master to the store cannot be accessed on the node
  • Seed read from master.dat was [...] but expected seed [...]
  • NoSuchFileException
  • AccessDeniedException

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

RepositoryVerificationException: [my_repo] a file written by master to the store [...] cannot be accessed on the node [...]
Caused by: NoSuchFileException / AccessDeniedException

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

这个错误的本质是“master 节点和其他节点看到的不是同一个仓库视图”。master 可以写入校验文件,但其他节点读取不到,因此 Elasticsearch 无法确认该仓库适合作为集群级快照仓库使用。

常见原因通常包括:

  • 文件系统仓库目录并不是共享存储,而是每台节点本地各自的路径。
  • NFS、NAS、容器卷挂载方式不一致,导致节点看到的目录内容不同。
  • 节点运行用户不同,master 可以写入,但其他节点没有读取权限。
  • 对象存储代理、endpoint、DNS 或凭证配置在节点间不一致,导致读取路径不一致。

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

建议按“先确认仓库是否真的共享,再确认节点是否拥有一致的读权限”的顺序处理:

  1. 查看仓库配置,确认仓库类型和 location/base_path 等参数。
  2. 执行 _verify,确认是哪些节点失败。
  3. 登录失败节点,对比其看到的仓库路径、挂载点和权限是否与 master 一致。
  4. 如果是对象存储仓库,检查所有节点的 endpoint、凭证、代理和证书配置是否完全一致。

相关 Elasticsearch API 及调用说明 #

1. 查看仓库信息 #

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

用于确认 typelocationbucketbase_path 等最终配置。

2. 验证仓库 #

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

这是最关键的接口。重点看失败节点列表和异常原因。

3. 查看节点信息 #

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

用于确认报错节点当前是否在线,以及失败是否集中在个别节点。

4. 查看节点插件 #

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

如果是对象存储仓库,需要确认所有节点插件和相关依赖一致。

排查时需要注意的问题 #

  • 同一个绝对路径不等于同一个共享仓库,特别是在容器和多挂载环境下。
  • 如果 verify 只有部分节点失败,不要只盯着 master,重点排查失败节点的挂载和权限。
  • master.dat seed 不一致时,往往说明读取到的不是 master 刚刚写入的那份内容。

4. 如何解决这个错误 #

常用修复思路 #

  • 把仓库目录改成真正的共享存储,并保证所有相关节点挂载到一致的位置。
  • 统一目录属主、属组和读写权限,确保 master 写入的校验文件对其他节点可读。
  • 对对象存储仓库统一 endpoint、网络出口和凭证配置。
  • 修复后重新执行 _verify,再进行小规模测试快照,确认仓库不只是“可配”,而是真的可用。

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

  • 为仓库挂载、对象存储访问和权限配置建立节点一致性检查。
  • 在新增节点、滚动升级和挂载变更后,主动执行仓库 verify,而不是等快照失败后再处理。
  • 对仓库路径和卷配置做标准化,避免环境间“看起来一样、实际不同”。

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

  • INFINI Console 可以帮助持续观察节点状态和快照异常趋势,快速发现是否某些节点长期是 verify 失败源头。
  • INFINI Gateway 适合结合运维请求审计,回溯仓库变更与异常出现时间点是否一致。

5. 小结 #

a file written by master to the store cannot be accessed on the node 基本都指向仓库共享视图不一致或权限不一致。处理这类问题时,最有效的方法不是反复重试,而是直接围绕共享存储、节点挂载和权限模型逐项核查。

只要把仓库 verify 和节点一致性检查纳入日常流程,这类问题通常都能在真正的快照任务开始前提前暴露。

相关错误 #

参考文档 #

附:日志上下文 #

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

if (seedRead.equals(seed) == false) {
    throw new RepositoryVerificationException(metadata.name(), "Seed read from master.dat was [" + seedRead +
        "] but expected seed [" + seed + "]");
}
} catch (NoSuchFileException e) {
    throw new RepositoryVerificationException(metadata.name(), "a file written by master to the store [" + blobStore() +
        "] cannot be accessed on the node [" + localNode + "]. " +
        "This might indicate that the store [" + blobStore() + "] 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);