2010-07-08 41 views
9

我正试图找到正确的方式来处理NFS客户端上的陈旧数据。请考虑以下情形:确保客户端上的文件状态与NFS服务器同步

  • 两台服务器安装相同的NFS共享存储与文件
  • 1个服务器的客户端应用程序上的数字2的服务器试图访问已删除的文件和失败,删除一些文件
  • 客户端应用程序:过时NFS文件句柄(没有什么奇怪的,预计会出现错误)

(也可能因为性能原因,在两台服务器上缓存装载选项都很高)。

我试图理解是:

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

谢谢。

回答

11
  • 是否有可靠的方法来检查该文件是否存在?在上面给出的场景中,lstat文件返回成功,应用程序仅在尝试移动文件后失败。

这是正常的NFS行为。

  • 如何手动同步客户端上的目录内容与服务器?

那是不可能做手工,因为NFS伪装成一个正常的POSIX兼容的文件系统。

我试过一次代码close()/ open()试图以某种方式减轻NFS客户端缓存的影响。在我的情况下,我需要读取写入其他服务器上的文件的信息。但即使重新开放的伎俩也接近零效应。我不能将fdatasync()添加到写入端,因为这会降低整个应用程序的速度。

我迄今为止对NFS的使用经验是,你无能为力。在关键代码路径中,我简单地编码以重试返回ESTALE的文件操作。

  • 如何在NFS的情况下写的可靠的文件管理代码一些一般性的提醒?

国防部我下来你想要的,但如果你的客户想要的可靠性,他们应该不会使用NFS。

例如,如果客户需要可靠性,我公司例如广告使用正确的分布式文件系统(我故意省略品牌)。我们的核心软件不保证在NFS上运行,我们不支持这种配置。但在我们的情况下,我们确实需要保证只要数据写入FS,它们就可以在所有其他节点上访问。

NFS的一致性可以实现,但以性能为代价,使得NFS几乎不可用。 (检查它的挂载选项。)NFS正在疯狂地缓存,以隐藏它是服务器文件系统的事实。为了使所有操作一致,NFS客户端必须同步转到NFS服务器以进行每个小操作,绕过本地缓存。那永远不会很快。

但是因为我们在这里谈论Linux,所以可以建议客户使用该软件来评估可用的群集文件系统。例如。 RedHat现在正式支持GFS。我听说过使用CodaFS的人,但没有很好的信息。

+0

谢谢。你已经证实了我自己的大部分NFS研究结果。猜猜我会编写一堆ESTALE检查,因为我们没有计划迁移到其他存储。我现在不会接受这个答案,希望有人会提出更多关于主题的信息。 – begray 2010-07-08 18:57:33

4

你可以从你的男人NFS尝试'NOAC“”安装选项

除了防止客户 从缓存文件属性的NOAC 选项强制应用程序写入 变成同步,以便本地 更改为一个文件立即在 上可见。这样, 其他客户端在检查 文件的属性时可以快速检测到 。

使用NOAC选项提供NFS 客户端访问同一文件中 更大的高速缓存一致性,但 它提取显著的性能 处罚。因此,鼓励明智地使用 文件锁定。

您可以有两个挂载,一个用于快速更改关键数据,需要同步,另一个用于其他数据挂载。您也可以查看NFS locking and its limitations

至于一般的建议是:截断是同时从多个主机读取的文件

一种方式是写的内容到一个临时文件,然后rename该文件到最终位置。

在同一个文件系统上,这个操作应该是原子的。

+0

好吧,这提出了一个好主意:将问题发布到serverfault。开发人员无法通过编程方式影响NFS(最好是解决方法),而管理员必须更频繁地处理NFS及其上运行的应用程序。因此后者有更多的经验,可能会提供更多的建议。 – Dummy00001 2010-07-09 09:03:32

+0

链接的NFS锁定文章现在消失了,你碰巧有更换吗? – 2013-11-04 01:53:02

1

我已经在包含该文件的目录上做了ls -l的成功。

相关问题