- 是否有可靠的方法来检查该文件是否存在?在上面给出的场景中,文件上的 lstat 返回成功,而应用程序仅在尝试移动文件后才会失败。
这是正常的 NFS 行为。
这是不可能手动完成的,因为 NFS 伪装成一个正常的 POSIX 兼容文件系统。
我曾尝试编写 close()/open() 代码,试图以某种方式减轻 NFS 客户端缓存的影响。就我而言,我需要读取写入其他服务器上文件的信息。但即使是重新开放的伎俩,效果也接近于零。而且我不能将 fdatasync() 添加到写入端,因为这会减慢整个应用程序的速度。
迄今为止,我对 NFS 的体验是,您无能为力。在关键代码路径中,我简单地编码以重试返回 ESTALE 的文件操作。
- 关于如何在 NFS 的情况下编写可靠的文件管理代码的一些一般建议?
随心所欲地修改我,但如果您的客户想要可靠性,那么他们不应该使用 NFS。
例如,如果客户想要可靠性,我的公司会宣传使用适当的分布式文件系统(我故意省略了品牌)。我们的核心软件不保证在 NFS 上运行,我们不支持此类配置。但在我们的例子中,我们确实需要保证一旦数据写入 FS,它们就可以在所有其他节点上访问。
可以实现 NFS 中的一致性,但以性能为代价,使 NFS 几乎无法使用。(检查它的挂载选项。) NFS 疯狂地缓存以隐藏它是服务器文件系统的事实。为了使所有操作保持一致,NFS 客户端必须为每个小操作同步到 NFS 服务器,绕过本地缓存。那永远不会很快。
但由于我们在这里讨论的是 Linux,因此可以建议该软件的客户评估可用的集群文件系统。例如 RedHat 现在正式支持GFS。我听说有人使用 CodaFS,但没有关于它的确切信息。