代码之家  ›  专栏  ›  技术社区  ›  begray

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

  •  9
  • begray  · 技术社区  · 15 年前

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

    • 两台服务器装载相同的NFS共享存储,文件数为
    • 1服务器上的客户端应用程序删除一些文件
    • 2服务器上的客户端应用程序尝试访问已删除的文件,但失败的原因是:陈旧的NFS文件句柄(没有什么奇怪的地方,应出现错误)

    (另外,知道两台服务器上的缓存装载选项都非常高可能很有用,因为性能原因)。

    我想了解的是:

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

    谢谢。

    3 回复  |  直到 10 年前
        1
  •  11
  •   Dummy00001    15 年前
    • 是否有可靠的检查方法,该文件是否存在?在上面给出的场景中,lstat返回成功,只有在尝试移动文件后应用程序才会失败。

    这就是正常的NFS行为。

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

    这是不可能手动完成的,因为NFS假装是一个正常的符合POSIX的文件系统。

    我曾经尝试过编写close()/open()代码,试图以某种方式减轻NFS客户端缓存的影响。在我的情况下,我需要读取写入其他服务器上文件的信息。但即使是重开的把戏也几乎没有效果。我不能将fdatasync()添加到写入端,因为这会减慢整个应用程序的速度。

    到目前为止,我在NFS方面的经验是,您无能为力。在关键代码路径中,我简单地进行了编码,以重试返回estale的文件操作。

    • 对于如何在使用NFS的情况下编写可靠的文件管理代码,有一些一般性的建议吗?

    把我变成你想要的一切,但是如果你的客户想要可靠性,那么他们就不应该使用NFS。

    例如,我的公司在广告中宣称,如果客户想要可靠性,就使用适当的分布式文件系统(我故意省略了这个品牌)。我们的核心软件不能保证在NFS上运行,而且我们不支持这种配置。但在我们的例子中,我们确实需要保证,一旦数据写入到FS,它们就可以在所有其他节点上访问。

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

    但是,既然我们在这里讨论Linux,我们可以建议软件的客户评估可用的集群文件系统。例如,Redhat现在正式支持 GFS . 我听说有人使用可待因,但没有关于它的硬信息。

        2
  •  4
  •   miedwar    15 年前

    您可以尝试“noac”安装选项

    来自人类NFS:

    除了防止客户 通过缓存文件属性,noac 选项强制应用程序写入 同步,以便本地 对文件的更改在上可见 服务器立即启动。那样, 其他客户端可以快速检测 当他们检查 文件的属性。

    使用noac选项提供 提高了NFS之间的缓存一致性 客户端访问相同的文件,但是 它提取了显著的性能 处罚。因此,明智地使用 建议使用文件锁定。

    您可以有两个装载,一个用于需要同步的关键快速更改数据,另一个装载用于其他数据。

    此外,查看 NFS locking and its limitations .

    关于一般建议:

    截断同时从多个主机读取的文件的一种方法是将内容写入临时文件,然后 rename 把文件送到最后的位置。

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

        3
  •  2
  •   gunr2171    10 年前

    我做得很成功 ls -l 在包含该文件的目录上。