确保客户端上的文件状态与NFS服务器同步

时间:2010-07-08 14:50:06

标签: c linux nfs

我正在尝试找到处理NFS客户端上过时数据的正确方法。请考虑以下情况:

  • 两台服务器挂载具有多个文件的相同NFS共享存储
  • 1台服务器上的客户端应用程序删除了一些文件
  • 2服务器上的客户端应用程序尝试访问已删除的文件,但失败的是:过时的NFS文件句柄(没什么奇怪的,预计会出错)

(另外可能有用的是,出于性能原因,两台服务器上的缓存安装选项都相当高。)

我想要了解的是:

  • 有可靠的检查方法,该文件存在吗?在上面给出的场景中,文件上的lstat返回成功,只有在尝试移动文件后应用程序才会失败。
  • 如何手动将客户端上的目录内容与服务器同步?
  • 有关如何在NFS的情况下编写可靠的文件管理代码的一般建议吗?

感谢。

3 个答案:

答案 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取得了成功。