我可以通过编程强制对文件的更改传播到所有NFS客户机吗?


Can I programmatically force changes to a file to propagate to all NFS clients?

我有一个PHP内置的CMS,它将页面列表、页面导航结构和页面内容存储在磁盘上的文件中。该应用程序托管在haproxy服务器后面的Apache/php-fpm服务器集群上。这些服务器通过NFS从中央文件服务器挂载Apache DocumentRoot目录,因此从CMS所做的所有更改都会写入NFS共享上的文件。

我发现,除非我用noac选项挂载NFS共享,否则所做的更改可能需要5-10秒才能传播到集群中的所有服务器;这意味着当快速连续地进行多个更改时,最终更改有时会覆盖较早的更改,因为最终更改可能会发送到尚未接收较早更改的服务器。

但是,当使用noac挂载选项时,访问访问者端的内容会有2-5秒的延迟,这是完全不能接受的。

是否有一种方法可以通过编程强制对NFS共享上的文件的更改传播到所有客户端,或者导致所有客户端刷新该文件的缓存?

我不知道有什么NFS级别的选项可以实现你想要的,但是如果访问这些文件的应用程序在你的控制之下,那么你可以使用O_DIRECT选项打开每个文件-这绕过任何本地NFS缓存的任何文件以这种方式打开…

备注:

你写noac导致延迟2-5秒…这似乎指向一个网络和/或存储级别的问题,或者"在一个目录中有太多的文件/目录"…

我用NFS参数cto结合apache指令EnableMMAP OffEnableSendFile Off解决了同样的问题。noac参数具有与您所写的相同的症状