问题描述: 云主机1更新了文件A,但是云主机2立即去读取时,仍然获取到的是旧的内容。
问题原因: 这涉及两个原因:第一个原因是,云主机1在写入文件A后,并不会立即进行刷新(flush),而是先进行PageCache操作,依赖于应用层调用fsync或者close来进行刷新。第二个原因是,云主机2存在文件缓存,可能不会立即从服务器获取最新的内容。例如,在云主机1更新文件A时,云主机2已经缓存了数据,当云主机2再次读取时,仍然使用了缓存中的旧内容。
解决方案:
方案一:在云主机1更新文件后,一定要执行close或者调用fsync。在云主机2读取文件之前,重新打开文件,然后再进行读取。
方案二:关闭云主机1和云主机2的所有缓存。这会导致性能较差,所以请根据实际业务情况选择适合的方案。
关闭云主机1的缓存:在挂载时,添加noac参数,确保所有写入立即落盘。挂载命令示例如下:
mount -t nfs -o vers=3,proto=tcp,async,nolock,noatime,noresvport,nodiratime,wsize=1048576,rsize=1048576,timeo=600,noac
挂载地址 本地挂载路径1
关闭云主机2的缓存:在挂载时,添加actimeo=0参数,忽略所有缓存。挂载命令示例如下:
mount -t nfs -o vers=3,proto=tcp,async,nolock,noatime,noresvport,nodiratime,wsize=1048576,rsize=1048576,timeo=600,actimeo=0
挂载地址 本地挂载路径2
根据实际情况合理以上方案可要确保云主机1更新文件后,云主机2能立即获取到最新内容。