NFS不同共享客户端间的数据不同步

问题现象

当您用台ECS挂载同一个NFS文件系统,在ECS-A上append写文件,在ECS-B用tail -f观察文件内容的变化。在ECS-A写完之后,在ECS-B看到文件内容变化会有10-30秒的延时。然而相同的场景下,如果直接在ECS-B上打开文件(比如vi)却是立即可以看到更新的内容的。

原因

该现象与mount的选项以及tail -f实现相关。

用户使用的mount命令为:mount -t nfs4 /mnt/

对于在ECS-B上以这一方式NFS mount的文件系统,默认情况下kernel对文件和目录的属性维护了一份metadata缓存,文件和目录属性(包括许可权、大小、和时间戳记)缓存的目的是减少 NFSPROC_GETATTR 远程过程调用(RPC)的需求。

tail -f 的实现是sleep+fstat来观察文件属性(主要是文件大小)的变化,然后读入文件并输出。可见,tail -f是否能实时输出文件内容主要取决于fstat的结果,由于metadata cache的存在,fstat轮询到的并不是实时的文件属性。因此,即使在NFS服务器端文件已经更新了,但tail -f却没法知道文件已经改动了,于是输出就会出现延时。

解决方法

使用mount 的noac选项可以disable文件和目录属性的缓存。

mount -t nfs4 -o noac /mnt/

---------------------------------------------------------------------------------------------------------------

1.cachefiled介绍

FS-Cache 是指在文件系统和缓存之间的接口。  CacheFS 指的则是FS-cache的缓存后端。CacheFS做实际的数据存储和检索处理,并使用块设备的分区。

NFS,AFS等netfs因为受网络的影响,使得对数据访问和存储的实时性就有了一定的挑战,CacheFS(FS-cache缓存后端即客户端)可解决响应实效的问题 ,用于提供分布式文件系统的本地缓存.
   cachefiled在2.6.30内核中,已作为内核的一部分。已支持NFS和AFS文件系统。

加载fscache模块:

modprobe -v fscache

确认nfs-utils的版本,cgslv4默认版本为1.2.2-7

[root@localhost ~]# rpm -qa |grep nfs-utils

nfs-utils-1.2.2-7.el6.x86_64

3.配置cachefiled

修改/etc/cachefilesd.conf文件

vi /etc/cachefilesd.conf

dir /var/cache/fscache

tag mycache

culltable 15

brun 20%

bcull 10%

bstop 5%

frun 20%

fcull 10%

fstop 5%

dir参数用于配置本地缓存目录。

tag参数用于指定一个FS-Cache的标签区分使用多个缓存

culltable参数用于设置缓存的等级,数字越大缓存的命中率越高,占有内存也越多。有效参数值在12-20之间。

brun,frun参数作用:如果剩余空间或缓存文件数量超过限制值,不会释放已使用缓存的空间

bcull,fcullp参数作用:如果剩余空间或缓存文件数量低于限制值,将停止写入缓存,并释放已经缓存的空间(释放最近比较少使用缓存对象。)

bstop,fstop3参数作用:如果剩余空间或文件数量低于限制值,将缓存停止,并释放至比brun,frun限制或更高才能重新工作。

必须满足:

0 <= bstop < bcull < brun < 100

0 <= fstop < fcull < frun < 100

配置文件完成后,执行/etc/init.d/cachefilesd start 启动cachefiled服务(建议关闭selinux,否则有可能导致cachefiled无法启动)

把cachefiled设置为开机启动:

chkconfig cachefiledsd on

4.测试缓存

nfs客户端挂载网络nfs共享盘符到本地,必须使用-o fsc参数,netfs挂载后,缓存并不会自动开始工作,只有发生了读或者写的操作后,缓存才会工作。cachefiled只支持小文件的缓存。

挂载命令:

mount -t nfs 172.16.100.127:/mnt /nfs -o fsc

可使用vi命令修改netfs中的文件,并检查/var/fscache/cache目录下是否生成@4a的类似文件,如存在表示缓存功能已经激活。

[root@localhost cache]# ls

@4a

如出现问题可查看分析/var/log/messages日志。

参考资料:https://www.cyberciti.biz/faq/centos-redhat-install-configure-cachefilesd-for-nfs/

Cachefiled的更多相关文章

  1. iOS-ASIHTTPRequest缓存机制

    第三方网络请求库 * 我们在对网络请求的时候,可以使用系统为我们提供的NSURLRequest和NSURLConnection,它基本能实现我们的基本功能. * 但是有时我们使用第三方封装的库,可以轻 ...

随机推荐

  1. MySQL中character set与collation的理解(转)

    character set和collation的是什么? character set即字符集 我们常看到的UTF-8.GB2312.GB18030都是相互独立的character set.即对Unic ...

  2. js 各种循环遍历

    js 各种循环遍历(表格比较) 遍历方法 能否遍历数组 能否遍历对象 备注 for 能 不能 for in 能(有诸多缺点) 能 为遍历对象而设计的,不适用于遍历数组 forEach 能 不能 bre ...

  3. 【Android】Android版本和API Level对应关系

    API Level Notes Android 4.4 19 KITKAT Platform Highlights Android 4.3 18 JELLY_BEAN_MR2 Platform Hig ...

  4. 用C#实现C/S模式下软件自动在线升级

    用C#实现C/S模式下软件自动在线升级 1 前言 长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构的程序可维护性 ...

  5. 从云端到边缘 AI推动FPGA应用拓展

    近日,全球最大的FPGA厂商赛灵思宣布收购深鉴科技的消息,引发人工智能芯片行业热议,这也是首起中国AI芯片公司被收购的案例.值得注意的是,收购深鉴科技的赛灵思在2018年下半年重点发展方面是汽车自动驾 ...

  6. jmeter 参数化方法

    1.csv 看异步图书 JMeter实战60页

  7. spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情

    <spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...

  8. [转]Windows服务“允许服务与桌面交互”的使用和修改方法

    上一篇文章是纯 C# 代码的形式勾上 “允许服务与桌面交互” 选项的 本文转载自:http://blog.csdn.net/lanruoshui/article/details/4756408 描述: ...

  9. ssh的应用和vnc连接桌面

    什么是ssh? SSH是一种网络协议,用于计算机之间的加密登录.如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露.SSH之 ...

  10. python程序里加入调试断点

    在需要打断的地方加入:import pdb;pdb.set_trace()即可 如: