避免同时写入 NFS 共享文本文件

Posted

技术标签:

【中文标题】避免同时写入 NFS 共享文本文件【英文标题】:avoiding simultaneous write on NFS shared text file 【发布时间】:2012-07-06 20:03:24 【问题描述】:

我正在用 C++ 编写一个模块,它将在一组机器上运行,所有这些机器都有一个 nfs 挂载的文件存储。

我有一个通过 NFS 与所有机器共享的配置文件;并且所有人都可以读/写该文件。如何确保不会因同时访问而导致数据损坏?

我知道 NFS 有自己的锁定协议,但我认为它不可靠 -concurrent nfs access。我还看到 iNotify 在安装了 nfs 的驱动器上表现不佳 - inotifiy example。我不确定stat 是否有助于在写入/读取之前检查文件是否正在被访问。

如何在c++中实现一个简单的锁定机制来避免同时访问?

【问题讨论】:

...通过不尝试同时写入同一个文件。写入文件的唯一副本并使用重命名在旧文件上进行透视。 ...换句话说,如果文件是本地文件,您可能应该做的事情完全相同。 这对我来说不是一个选项,因为 IPC(unix 域套接字)正在跟踪文件(及其 fd)以进行更改。更改将传输回模块进行进一步处理。 在这种情况下,您最好的选择可能是停止使用 NFS,并获得一个支持集群范围文件锁定的集群感知文件系统,该系统以比非为此设计的方式更可靠的方式支持使用 NFS 锁定(如上所述,除了不打算处理这种事情之外,它可能是不可靠的)。 这又不是我的选择 - 我正在专门寻找可以帮助我设计锁定机制的建议 【参考方案1】:

当您将内容 A、B 和 C 同时写入通过 NFS 共享的文件时,最终内容将是 A B C 或 A B C 的任何可能组合,如 B A C、C A B 等。文件将始终保持一致,它永远不会部分写A,然后是B。因此写一个接一个。请注意,仅当内容大小在 NFS 块大小范围内时才会如此。

如果您的写入超出块大小,则需要使用 NLM,这需要在 NFS 服务器和客户端上都运行锁定守护程序。

【讨论】:

我没有正确构建问题标题,我的错,我想避免同时“访问”,而不仅仅是写入。即使同时写入不会成为问题,但同时读/写将是问题。避免这种情况的锁定机制是我感兴趣的。

以上是关于避免同时写入 NFS 共享文本文件的主要内容,如果未能解决你的问题,请参考以下文章

与 UIActivityViewController 共享文本文件

CreateFileMapping() 用于写入文件长度未知的文本

避免在 R 中覆盖文本文件

如何在 Ruby 和另一种语言之间共享文本文件(或互斥体/信号量)?

NAS之NFS/CIFS

使用NFS服务实现文件共享