从 java 轮询 NFS 共享会破坏文件系统

Posted

技术标签:

【中文标题】从 java 轮询 NFS 共享会破坏文件系统【英文标题】:Polling NFS share from java breaks filesystem 【发布时间】:2011-03-14 13:50:24 【问题描述】:

我们有两个服务器,每个服务器都有一个通过 NFS 映射到它们的目录。

服务器 A 上的进程(shell 脚本)将文件放入映射驱动器。

服务器 B 上的 Java 进程定期轮询映射的驱动器并在找到文件后立即处理该文件。处理文件后 - 它被重命名(然后由服务器 A 上的 cron 进程删除)

该文件是一个小的 .properties 文件。在几个周期内一切正常。之后,服务器 A 和服务器 B 开始以不同的方式查看映射驱动器的内容。我们禁用了 NFS 缓存和属性查找。问题依然存在。

如果我去一个视野不好的服务器并这样做:

ls

我会看到停滞的文件。但是,如果我再做一次 - 会打印正确的文件列表。

我们将不胜感激有关此问题的任何帮助。

【问题讨论】:

【参考方案1】:

我的问题是,当使用计时器循环时,下面的命令会停止查看实际目录内容。它与 NFS 服务器不同步。

File[] files = dir.listFiles(new MyFileFilter() );

我的解决方案是请求故意不存在的文件。我假设这会使 NFS 客户端修复或刷新其状态。

// Key point is here: we ask NFS client to obtain unexisting file. Since the client
// cannot find it locally - it will make a call to the NFS server which will 
// fix client cache or whatever it uses locally when cache is disabled.
File temp = new File(dir, "unexisting.file");
temp.exists();

如果您知道此解决方法背后的机制 - 请分享!

【讨论】:

【参考方案2】:

使用哪个 NFS 服务器?如果该服务器支持文件更改通知,您可以使用它而不是轮询。

【讨论】:

其实我不确定 - 需要检查 NFS 服务器。我一到办公室就会这样做。你说的通知是什么意思?它会以某种方式通知 java 进程有一个新文件吗? 是的,任何程序都可以注册以获取文件更改或目录中新文件的通知。 我们使用 NFSv3。很遗憾,没有通知。【参考方案3】:

您禁用了哪种缓存? NFS 支持目录条目缓存,请参阅nfs Linux man page 中的选项acdirminacdirmax。或同一手册中的“数据和元数据一致性”一章。

【讨论】:

以上是关于从 java 轮询 NFS 共享会破坏文件系统的主要内容,如果未能解决你的问题,请参考以下文章

NFS共享关系型数据库利用DNS轮询提供Web负载均衡

NFS(网络文件系统)

NFS企业级网络文件共享

NFS企业级网络文件共享

NFS网络文件系统安装与测试

集群实战NFS网络文件共享服务