适用版本: 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_exceptiona file written by master to the store cannot be accessed on the nodeSeed read from master.dat was [...] but expected seed [...]NoSuchFileExceptionAccessDeniedException
常见日志形态通常类似下面这样:
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. 如何排查和解决这个异常和解决这个异常 #
建议按“先确认仓库是否真的共享,再确认节点是否拥有一致的读权限”的顺序处理:
- 查看仓库配置,确认仓库类型和 location/base_path 等参数。
- 执行
_verify,确认是哪些节点失败。 - 登录失败节点,对比其看到的仓库路径、挂载点和权限是否与 master 一致。
- 如果是对象存储仓库,检查所有节点的 endpoint、凭证、代理和证书配置是否完全一致。
相关 Elasticsearch API 及调用说明 #
1. 查看仓库信息 #
curl -X GET "http://localhost:9200/_snapshot/my_repo?pretty"
用于确认 type、location、bucket、base_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.datseed 不一致时,往往说明读取到的不是 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 和节点一致性检查纳入日常流程,这类问题通常都能在真正的快照任务开始前提前暴露。
相关错误 #
- failed-to-perform-snapshot-index-files:快照执行失败
- repository-verification-exception:仓库验证异常
- repository-exception:仓库异常
- blob-store-exception:Blob存储异常
- access-denied-exception:访问被拒绝
参考文档 #
附:日志上下文 #
下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:
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);





