我正在尝试找到处理NFS客户端上过时数据的正确方法。请考虑以下情况:
(另外可能有用的是,出于性能原因,两台服务器上的缓存安装选项都相当高。)
我想要了解的是:
感谢。
答案 0 :(得分:11)
- 有可靠的检查方法,该文件存在吗?在上面给出的场景中,文件上的lstat返回成功,只有在尝试移动文件后应用程序才会失败。
这就是正常的NFS行为。
- 如何手动将客户端上的目录内容与服务器同步?
这是不可能手动完成的,因为NFS假装是一个普通的POSIX兼容文件系统。
我曾尝试过编写close()/ open(),试图以某种方式缓解NFS客户端缓存的影响。在我的情况下,我需要读取写在其他服务器上的文件的信息。但即使是重新开放的技巧也几乎没有效果。而且我无法在写入方面添加fdatasync(),因为这会降低整个应用程序的速度。
我迄今为止使用NFS的经验是你无能为力。在关键代码路径中,我只是编码重试返回ESTALE的文件操作。
- 有关如何在NFS的情况下编写可靠的文件管理代码的一般建议吗?
根据您的需要修改我,但如果您的客户需要可靠性,那么他们就不应该使用NFS。
如果客户想要可靠性,我的公司例如宣传使用适当的分布式文件系统(我故意省略品牌)。我们的核心软件不保证在NFS上运行,我们不支持此类配置。但在我们的情况下,我们确实需要保证,一旦数据写入FS,它们就可以在所有其他节点上访问。
可以实现NFS中的一致性,但是以性能为代价,使NFS几乎无法使用。 (检查它的挂载选项。)NFS正在疯狂缓存以隐藏它是服务器文件系统的事实。为了使所有操作保持一致,NFS客户端必须绕过本地缓存,为每个小操作同步转到NFS服务器。这永远不会很快。
但是,由于我们在这里谈论Linux,因此可以建议客户使用该软件来评估可用的群集文件系统。例如。 RedHat现在正式支持GFS。我听说有人使用CodaFS,但没有硬信息。
答案 1 :(得分:4)
您可以尝试''noac''挂载选项
来自man nfs:
除了阻止客户端 从缓存文件属性,noac 选项强制应用程序写入 变得同步以便本地化 对文件的更改将变为可见 服务器立即。那样, 其他客户可以快速检测到 他们检查时最近写道 文件的属性。
使用noac选项提供 NFS之间更高的缓存一致性 客户端访问相同的文件,但是 它提取了重要的表现 罚款。因此,明智地使用 鼓励文件锁定。
您可以安装两个,一个用于需要同步的关键快速更改数据,另一个用于其他数据。
另外,请查看NFS locking and its limitations。
关于一般建议:
截断从多个主机同时读取的文件的一种方法是将内容写入临时文件,然后将rename
该文件写入最终位置。
在同一文件系统上,此操作应该是原子操作。
答案 2 :(得分:2)
我在包含该文件的目录上执行ls -l
取得了成功。