Linux nfsv4中的并发文件访问

9
使用C语言,在Linux环境下,我想知道如何让两个不同的进程访问位于NFSv4文件系统上的同一文件。具体而言,我希望一个程序打开文件进行读取,而第二个程序则打开文件进行写入。我打算使用AWS的新EFS(弹性文件系统),而EFS仅支持NFSv4。
这些程序的特性是,写入者实质上只会将内容追加到文件中。在写入者完成并调用fflush之前,读取者将永远不会访问新追加的信息。
NFSv4是否支持此场景?还是说有更好的方法来实现这样的并发NFSv4文件访问?

那么看起来你应该关注HDFS - Elliott Frisch
@ElliottFrisch:我编辑了我的问题,以反映AWS ElasticFileSystem仅在NFSv4下运行。 - PaeneInsula
这两个进程是否在同一台机器上运行?如果是,那么文件映射几乎肯定是正确的选择。 - camelccc
@camelccc 这两个进程在不同的AWS节点上运行。并且不确定文件映射是否适用于4000万个文件和500TB的数据。 - PaeneInsula
不同的节点在映射方面会使事情变得复杂。fopen在同时打开文件的数量上受到限制,其默认文件句柄限制为-1024。据我所知,映射没有限制,但比我所知道的任何其他访问文件的方法都要少一些限制。你需要同时打开多少个文件?如果超过一千个左右,映射大概是唯一的选择。 - camelccc
显示剩余2条评论
1个回答

2
NFS v4支持文件的字节范围锁定(如RFC 3530“NFS版本4协议”中所述):
1.4.5. 文件锁定
使用NFS版本4协议,字节范围文件锁定支持是NFS协议的一部分。文件锁定支持结构化,因此不需要RPC回调机制。这是与先前版本的NFS文件锁定协议Network Lock Manager(NLM)不同的地方。与文件锁定相关联的状态在服务器上以基于租赁的模型维护。服务器为NFS客户端持有的所有状态定义单个租约期。如果客户端未在规定的时间内更新其租约,则服务器可能释放与客户端租约相关联的所有状态。客户端可以使用RENEW操作或隐式地使用其他操作(主要是READ)来更新其租约。
请参阅同一RFC的第8节,以获得有关锁定和基于租赁的模型的更详细信息。
您的程序将需要使用fcntl管理锁定。我的建议是编写一个测试来检查EFS提供的NFS v4的实际实现是否按预期支持锁定(规范中的某些方面是可选的)。您可以参考此锁测试套件的源代码,该测试套件支持多客户端测试。

@Paenelnsula,你运行了实验吗?你的发现是什么?我的应用程序与之有相同的情况,更像WAL。 - Laukik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接