1)什么是NFS?html
NFS是Network File System的缩写,中文意思是网络文件系统。它的主要功能是经过网络(通常是局域网)让不一样的主机系统之间能够共享文件或目录。NFS客户端(通常为应用服务器,例如web)能够经过挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从客户端本地看,NFS服务器端共享的目录就好像是客户端本身的磁盘分区或者目录同样,而实际上倒是远端的NFS服务器的目录。前端
NFS网络文件系统很像Windows系统的网络共享,安全功能,网络驱动器影射,这也和Linux系统里的samba服务相似。只不过通常状况下,Windows网络共享服务或samba服务用于办公局域网共享,而互联网中小型网站集群架构后端经常使用NFS进行数据共享。node
2)NFS在企业中的应用场景linux
- 在企业集群架构的工做场景中,NFS网络文件系统通常被用来存储共享视频,图片,附件等静态资源文件,一般网站用户上传的文件都会放到NFS共享里,例如:BBS产品的图片,附件,头像(注意网站BBS程序不要放NFS共享里),而后前端全部的节点访问这些静态资源时都会读取NFS存储上的资源。NFS是当前互联网系统架构中最经常使用的数据存储服务之一,前面说过,中小型网站公司应用频率更高,大公司或门户除了使用NFS外,还可能会使用更为复杂的分布式文件系统,好比Moosefs(mfs),GlusterFS,FastDFS等
- 在企业生产集群架构中,NFS做为全部前端Web服务的共享存储,存储的内容通常包括网站用户上传的图片,附件,头像等,注意,网站的程序代码不要放NFS共享里,由于网站程序是开发运维人员统一发布的,不存在发布延迟问题,直接批量发布到Web节点提供访问比共享到NFS里访问效率更高。
3)企业生产集群为何须要共享存储角色。ios
- 这里经过图解给你们展现如下集群架构须要共享存储服务的理由。例如:A用户上传图片到Web1服务器,而后让B用户访问这张图片,结果B用户访问的请求分发到了Web2,由于Web2上没有这张图片,这就致使它没法看到A用户上传的图片,若是此时有一个共享存储,A用户上传图片的请求不管是分发到Web1仍是Web2上,最终都会存储到共享存储上,而在B用户访问图片时,不管请求分发到Web1仍是Web2上,最终也都会去共享存储上找,这样就能够访问到须要的资源了。这个共享存储的位置能够经过开源软件和商业硬件实现,互联网中小型集群架构会用普通PC服务器配置NFS网络文件系统实现。
- 当及集群中没有NFS共享存储时,用户访问图片的状况以下图所示。
上图是企业生产集群没有NFS共享存储访问的示意图。下图是企业生产集群有NFS共享存储的状况nginx
- 中小型互联网企业通常不会买硬件存储,由于太贵,大公司若是业务发展很快的话,可能会临时买硬件存储顶一下网站压力,当网站并发继续加大时,硬件存储的扩展相对就会很费劲,且价格成几何级数增长。例如:淘宝网就曾替换掉了不少硬件设备,好比,用lvs+haproxy替换了netscaler负载均衡设备,用FastDFS,TFS配合PC服务器替换了netapp,emc等商业存储设备,去IOE正在成为互联网公司的主流。
下图是企业工做中的NFS服务器与客户端挂载状况结构图web
客户端挂载NFS后,本地挂载基本信息显示以下:vim
[root@nfs01 ~]# df -h
Filesystem Size Used Use% Mounted on
/dev/sda1 1.1T 467G 544G 47% /
tmpfs 7.9G 0 7.9G 0% /dev/shm
10.0.0.7:/video 1002G 59G 892G 7% /video #<==10.0.0.7为nfsserver的ip地址
提示: mount 源 目标
mount 10.0.0.7:/video /video
从挂载信息来看,和本地磁盘分区几乎没什么差异,只是文件系统对应列的开头是以IP滴噢址开头的形式了。windows
通过前面的介绍,咱们知道NFS系统是经过网络来进行数据传输的(因此叫作网络文件系统)所以,NFS会使用一些端口来传输数据,那么,NFS到底使用哪些端口来进行数据传输呢?后端
NFS在传输数据时使用的端口会随机选择。可能有同窗会纳闷,既然这样,NFS客户端是怎么知道NFS服务端使用的哪一个端口呢?
当访问程序经过NFS客户端向NFS服务端存取文件时,其请求数据流程大体以下:
1)首先用户访问网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会经过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询问请求。
2)NFS服务端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务(rpcbind服务)
3)此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据
4)NFS客户端把数据存取成功后,返回给前端访问程序,告知给用户存取结果,做为网站用户,就完成了一次存取操做。
由于NFS的各项功能都须要向RPC服务(rpcbind服务)注册,因此只有RPC服务(rpcbind服务)才能获取到NFS服务的各项功能对应的端口号(port number),PID,NFS在主机所监听的IP等信息,而NFS客户端也只能经过向RPC服务(rpcbind服务)询问才能找到正确的端口。也就是说,NFS须要有RPC服务(rpcbind服务)的协助才能成功对外提供服务。从上面的描述,咱们不难推断,不管是NFS客户端仍是NFS服务器端,当要使用NFS时,都须要首先启动RPC服务(rpcbind服务),NFS服务必须在RPC服务启动以后启动,客户端无需启动NFS服务,但须要启动RPC服务。
注意:
NFS的RPC服务,在CentOS5.X下名称为portmap,在CentOS6.x下名称为rpcbind
角色 | 主机名 | eth0(外网) | eth1(内网) |
---|---|---|---|
C1-NFS服务器端 | nfs01 | 10.0.0.31 | 172.16.1.31 |
C2-Rsync存储服务器 | backup | 10.0.0.41 | 172.16.1.41 |
B2-nginx web服务器 | web01 | 10.0.0.8 | 172.16.1.8 |
hostname web01
sed -i 's#chensiqi#web01#g' /etc/sysconfig/network
从第二阶段开始教学笔记中出现的服务器配置没有意外的状况下,它的IP等相关信息都是统一的,第二阶段的教学当中一共大概会出现8-10台必须的服务器(搭建不一样的业务),最终这些服务器就组成了咱们第二阶段最后的考试内容,10台规模的基础核心架构集群。
所以,咱们在克隆虚拟机的时候,要统一克隆模版,所以建议你们,准备一个虚拟机的模版机,只作克隆用。模版机的相关优化及克隆准备工做,请参看http://www.cnblogs.com/chensiqiqi/p/6228006.html实战教学笔记的第六节
要部署NFS服务,须要安装下面的软件包:
注意:
有关RPC协议知识这里你们没必要细究,详细说明可见本章结尾命令部分。
可以使用以下命令查看默认状况下CentOS6.x里NFS软件的安装状况。
rpm -qa nfs-utils rpcbind
当不知道软件名字时候,能够用rpm -qa | grep -E "nfs-|rpcbind"
来过滤包含在引号内的字符串。grep -E这里至关于egrep。grep,egrep这两个命令在运维工做中很是经常使用而且很好用。CentOS6.8默认没有安装NFS软件包,可使用yum -y install nfs-utils rpcbind
命令来安装NFS软件。
root@nfs01 ~]# yum -y install nfs-utils rpcbind
...忽略软件显示信息...
[root@nfs01 ~]# rpm -qa nfs-utils rpcbind
nfs-utils-1.2.3-70.el6_8.2.x86_64
rpcbind-0.2.0-12.el6.x86_64
若是出现rpcbind和nfs-utils开头的两个软件包,表示NFS服务端软件安装完毕
查看某个命令属于已经安装的哪一个rpm包
[root@nfs01 backup]# which rpcinfo #查询命令绝对路径
/usr/sbin/rpcinfo
[root@nfs01 backup]# rpm -qf /usr/sbin/rpcinfo #查询某个命令属于已经安装的哪一个rpm包
rpcbind-0.2.0-12.el6.x86_64
[root@nfs01 backup]# rpm -qf `which showmount`
nfs-utils-1.2.3-70.el6_8.2.x86_64
由于NFS及其辅助程序都是基于RPC(remote Procedure Call)协议的(使用的端口为111),因此首先要确保系统中运行了rpcbind服务。启动的实际操做以下:
[root@nfs01 backup]# /etc/init.d/rpcbind status #检查rpcbind服务状态
rpcbind 已停
[root@nfs01 backup]# /etc/init.d/rpcbind start #启动rpcbind服务
正在启动 rpcbind: [肯定]
[root@nfs01 backup]# rpcinfo -p localhost #查看NFS服务向rpc服务注册的端口信息,由于NFS尚未启动,所以,没有太多注册的端口影射信息。
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
#提示:111端口为rpcbind服务对外提供服务的主端口
[root@nfs01 backup]# /etc/init.d/nfs start #启动nfs服务
启动 NFS 服务: [肯定]
关掉 NFS 配额: [肯定]
启动 NFS mountd: [肯定]
启动 NFS 守护进程: [肯定]
Starting RPC idmapd: [ OK ]
特别提示:
若是不启动rpcbind服务直接启动nfs服务的会启动时失败。
从上面NFS服务启动过程能够看出,运行NFS服务默认须要启动的服务或进程至少有:NFS quotas(rpc.rquotad),NFS daemon(nfsd),NFS mountd(rpc.mountd)。能够经过执行以下命令查看启动NFS后,系统中运行的NFS相关进程:
[root@nfs01 ~]# ps -ef | egrep "rpc|nfs"
root 2179 2 0 07:38 ? 00:00:00 [rpciod/0]
rpc 2560 1 0 07:42 ? 00:00:00 rpcbind
root 2605 1 0 07:42 ? 00:00:00 rpc.rquotad #磁盘配额进程(remote quota server)
root 2610 1 0 07:42 ? 00:00:00 rpc.mountd #权限管理验证等(NFS mount daemon)
root 2617 2 0 07:42 ? 00:00:00 [nfsd4]
root 2618 2 0 07:42 ? 00:00:00 [nfsd4_callbacks]
root 2619 2 0 07:42 ? 00:00:00 [nfsd] #nfs主进程
root 2620 2 0 07:42 ? 00:00:00 [nfsd] #nfs主进程
root 2621 2 0 07:42 ? 00:00:00 [nfsd] #nfs主进程
root 2622 2 0 07:42 ? 00:00:00 [nfsd] #nfs主进程
root 2623 2 0 07:42 ? 00:00:00 [nfsd] #nfs主进程
root 2624 2 0 07:42 ? 00:00:00 [nfsd] #nfs主进程
root 2625 2 0 07:42 ? 00:00:00 [nfsd] #nfs主进程
root 2626 2 0 07:42 ? 00:00:00 [nfsd] #nfs主进程
root 2657 1 0 07:42 ? 00:00:00 rpc.idmapd #name mapping daemon
root 2728 1525 0 08:06 pts/0 00:00:00 egrep rpc|nfs
NFS服务的主要任务是共享文件系统数据,而文件系统数据的共享离不开权限问题。因此NFS服务器启动时最少须要两个不一样的进程,一个是管理NFS客户端是否可以登入的rpc.nfsd主进程,另外一个用于管理NFS客户端是否可以取得对应权限的rpc.mountd进程。若是还须要管理磁盘配额,则NFS还要再加载rpc.rquotad进程。
服务或进程名 | 用途说明 |
---|---|
nfsd(rpc.nfsd) | rpc.nfsd主要功能是管理NFS客户端是否可以登入NFS服务端主机,其中还包含登入者的ID判别等 |
mountd(rpc.mountd) | rpc.mountd的主要功能则是管理NFS文件系统。当NFS客户端顺利经过rpc.nfsd登入NFS服务端主机时,在使用NFS服务器提供数据以前,它会去读NFS的配置文件/etc/exports来比对NFS客户端的权限,经过这一关以后,还会通过NFS服务端本地文件系统使用权限(就是owner,group,other权限)的认证程序。若是都经过了,NFS客户端就能够取得使用NFS服务器端文件的权限。注意,这个/etc/exports文件也是咱们用来管理NFS共享目录的使用权限与安全设置的地方,特别强调,NFS自己设置的是网络共享权限,整个共享目录的权限还和目录自身系统权限有关 |
rpc.lockd(非必需) | 可用来锁定文件,用于多客户端同时写入 |
[root@nfs01 ~]# chkconfig rpcbind on
[root@nfs01 ~]# chkconfig nfs on
[root@nfs01 ~]# chkconfig --list rpcbind
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@nfs01 ~]# chkconfig --list nfs
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
特别说明:
在不少大企业里,大都是统一按照运维规范将服务的启动命令放到/etc/rc.local文件里的,而不是用chkconfig管理的。把/etc/rc.local文件做为本机的重要服务档案文件,全部服务的开机自启动都必须放入/etc/rc.local。这样规范的好处是,一旦管理此服务器的人员离职,或者业务迁移均可以经过/etc/rc.local很容易的查看到服务器对应的相关服务,能够方便的运维管理。下面是把启动命令放入到/etc/rc.local文件中的配置信息,注意别忘了加上启动服务的注释。
[root@nfs01 ~]# tail -3 /etc/rc.local
#start up nfs service by chensiqi at 20170309
/etc/init.d/rpcbind start
/etc/init.d/nfs start
NFS服务的默认配置文件路径为:/etc/exports,而且默认是空的。
[root@nfs01 ~]# ls -l /etc/exports
-rw-r--r--. 1 root root 0 1月 12 2010 /etc/exports
[root@nfs01 ~]# cat /etc/exports
提示:
NFS默认配置文件/etc/exports实际上是存在的,可是没有内容,须要用户自行配置。
/etc/exports文件位置格式为:
NFS共享的目录 NFS客户端地址1(参1,参2...)客户端地址2(参1,参2...)
NFS共享的目录 NFS客户端地址(参1,参2...)
查看exports语法文件格式帮助的方法为:
执行man exports命令,而后切换到文件结尾,能够快速看以下样例格式:
[root@nfs01 ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync)
命令说明:
/data :nfs的共享目录路径
172.16.1.0/24:容许挂载个人共享目录的IP地址段
(rw):可读可写
(sync):实时同步
修改配置文件之后,必须重启nfs服务
[root@nfs01 ~]# /etc/init.d/nfs reload
[root@nfs01 ~]# showmount -e #查看生效的nfs配置文件规则
Export list for nfs01:
/data 172.16.1.0/24
[root@nfs01 ~]# grep nfs /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data
[root@nfs01 ~]# ll -d /data
drwxr-xr-x. 2 nfsnobody nfsnobody 4096 3月 9 09:43 /data
特别提示:
若是不受权属主属组,那么共享目录挂载之后将不遵循配置文件exports的设定好的读写规则。虽然也能正常挂载,可是会致使写入文件时提示没有权限。
[root@nfs01 ~]# touch /mnt/a
touch: 没法建立"/data/a": 权限不够
[root@nfs01 ~]# mount 172.16.1.31:/data /mnt
提示:
没有报错就说明挂载成功了。
[root@nfs01 ~]# ls /data #查看目录
[root@nfs01 ~]# ls /mnt #查看目录
[root@nfs01 ~]# touch /data/a #在data目录建立文件a
[root@nfs01 ~]# ls /data #data共享目录有a
a
[root@nfs01 ~]# ls /mnt #mnt挂载目录也有a
a
[root@nfs01 ~]# touch /mnt/b #在mnt目录建立文件b
[root@nfs01 ~]# ls /data #data共享目录有b
a b
[root@nfs01 ~]# ls /mnt #mnt挂载目录也有b
a b
提示:
当配置文件exports里设定了(rw,rsync)后,表示目录可读写,而且是实时同步的。也就是说,在其中任意一个挂载目录里改变了里面的内容信息,那么全部挂载目录包含源共享目录的内容信息同步改变。
至此NFS服务器端配置完毕
[root@web01 ~]# yum -y install nfs-utils
提示:不安装则不能挂载nfs共享目录
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
提示:-t nfs 能够省略
[root@web01 ~]# ls /mnt
a b
[root@web01 ~]# touch /mnt/chensiqi #建立文件
[root@web01 ~]# ls /mnt
a b chensiqi
[root@web01 ~]# ssh root@172.16.1.31 "ls /data" #远程看一下nfs服务器端共享目录
root@172.16.1.31's password:
a
b
chensiqi
配置客户端mount挂载命令使挂载开机自动执行,这里有两种方法,以下:
第一种方法:将挂载命令放在/etc/rc.local里
缺点:偶尔开机挂载不上,工做中除了开机自启动配置,还要对是否挂载作监控
echo "mount -t nfs 172.16.1.31:/data /mnt"
第二种方法,将挂载命令放在/etc/fstab里
[root@web01 ~]# tail -1 /etc/fstab
172.16.1.31:/data /mnt nfs defaults 0 0
其实所谓配置方法,这里有一个误区,以下:
例如:
[root@web01 ~]# chkconfig --list netfs
netfs 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
[root@web01 ~]# chkconfig netfs on
[root@web01 ~]# chkconfig --list netfs
netfs 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
如此一来,咱们也能够经过fstab进行开机挂载了nfs网络文件系统了。同窗们能够自行仿照测试。
至此NFS客户端配置完毕
rw | Read-write,表示可读写权限 |
---|---|
ro | Read-only,表示只读权限 |
sync | (同步,实时)请求或吸入数据时,数据同步写入到NFS Server的硬盘后才返回 |
async | (异步)写入时数据会先写到内存缓冲区,只到硬盘有空档才会写入磁盘,这样能够提高写入速率!风险为若服务器挂掉或不正常关机,会损失缓冲区中未写入磁盘的数据 |
no_root_squash | 访问NFS Server共享目录的用户若是是root,它对该共享目录具备root权限。 |
root_squash | 若是访问目录的是root,则它的权限将被压缩成匿名用户。 |
all_squash | 无论访问共享目录的用户身份如何,它的权限都被压缩成匿名用户。 |
anonuid | 指定共享文件夹里文件全部者的uid号:例如:(rw,squash,anonuid=12306,anongid=12306) |
anongid | 指定共享文件夹里文件全部者的gid号:例如:(rw,squash,anonuid=12306,anongid=12306) |
实例一:
共享/data 目录给10.0.0.0/24整个网段可读可写。
实例二:
nfs服务器:172.16.1.31
共享下面两个目录:
/app/w :要求可读可写,同步数据,全部用户压缩为匿名用户
/app/r:要求只读,同步数据,全部用户都压缩为匿名用户
客户端上面的要求:
backup服务器,把nfs服务器的/app/r挂载到/data/r
web01服务器,把nfs服务器的/app/w挂载到/data/w
exports配置文件的相关参数,摘自man exports:
EXAMPLE
# sample /etc/exports file
/ master(rw) trusty(rw,no_root_squash)
/projects proj*.local.domain(rw)
/usr *.local.domain(ro) @trusted(rw)
/home/joe pc001(rw,all_squash,anonuid=150,anongid=100)
/pub *(ro,insecure,all_squash)
上述各个列的参数含义以下:
客户端地址 | 具体地址 | 说明 |
---|---|---|
受权单一客户端访问NFS | 10.0.0.30 | 通常状况,生产环境中此配置很少 |
受权整个网段可访问NFS | 10.0.0.0/24 | 其中的24等同于255.255.255.0,指定网段生产环境中常见的配置。配置简单,维护方便 |
受权整个网段可访问NFS | 10.0.0.* | 指定网段的另外写法(不推荐使用) |
受权某个域名客户端访问 | nfs.chensiqiedu.com | 此方法生产环境中通常不经常使用 |
受权整个余名客户端访问 | *.chensiqiedu.com | 此方法生产环境中通常不经常使用 |
1)(rw,sync) :可读可写,同步传输
2)(ro,async):只读,异步传输。
详细说明:
rw或者ro,主要控制的是全部客户端用户(包含root)的读写权限。若是设置成ro,就算root也只有读权限。它是NFS权限设置的第一道总闸阀门。
sync:同步传输,实时进行。
async:异步传输:攒一会在传输。
3)root_squash:将root帐户在共享目录里的身份下降为匿名者(默认nfsnobody)身份
4)no_root_squash:不下降root帐户在共享目录的身份,身份仍是root
5)all_squash:将全部访问用户在共享目录里的身份都下降为匿名者(默认nfsnobody)身份
详细说明:
- 匿名者身份默认状况下就是NFS服务器端的虚拟帐户角色,也就是nfsnobody。这是最低的身份,全部NFS客户端共享目录的访问者都被附加了这个身份,这也就意味者,若是文件的属主属组是nfsnobody的话,全部访问者对该文件都拥有所有全部权。
- 所谓身份并非访问权限,而是用户在共享目录里建立的文件的属主和属组。
- 一旦身份被下降那么在共享目录里建立的文件的属主和属组就是变成了默认状况下的nfsnobody。这也就意味着,权限系统对你所建立的文件不作任何保护(任何访问者均可以查看,修改,删除)
- 所谓root_squash:
- 使用这个参数意味着root在共享目录里建立的任何文件都不受保护,任何人(全部用户)均可以读取,修改,删除)。
- 而非root用户则不下降权限,在共享目录里建立的文件的属主和属组统一为nobody(身份隐藏了),这种状况下,全部普通用户之间只能互相查看文件,并不能任意修改和删除而且你还没法知道是谁建立的文件,每一个普通用户只能修改或删除本身建立的文件。
- root用户虽然被下降了身份,可是并无下降他的管理者权限,也就是说它仍旧能对全部共享目录里的全部文件进行查看,修改,删除操做。
- 若是这类参数默认为空的话,那么NFS将默认使用这个参数。
- 所谓no_root_squash:
- 使用这个参数意味着不对root进行下降身份的操做,也就是说root在共享目录里建立的文件的属主属组仍旧为root(不能被普通用户修改和删除)。
- 非root用户同root_squash同样,并不下降权限。
- 所谓all_squash:
- 使用这个参数意味着对全部访问NFS共享目录的用户进行下降身份的操做。也就是说,全部用户只要在共享目录里建立文件,那么文件的属主属组就是默认状况下的nfsnobody。
- 在这个模式下,任何nfs客户端的任何访问用户均可以对共享目录里的任何文件进行查看,修改,删除操做
6)anonuid和anongid:指定NFS虚拟帐户的uid或gid
- 这两个参数主要用来修改NFS默认的虚拟帐户nfsnobody。能够经过指定虚拟帐户的uid和gid的方式修改默认的虚拟帐户的帐户名称和所属组。
第二章 NFS企业级优化
2.1 NFS配置文件优化
1)NFS客户端挂载后,往共享目录写入数据时卡住了
2)NFS服务端,重启restart服务,客户端若是写入数据卡住了。解答:
1,nfs服务端重启以后,共享文件夹进入grace time(无敌时间)
2,客户端在服务端重启后写入数据大概要等90秒
3,nfs配置文件:/etc/sysconfig/nfs
[root@backup ~]# sed -n '45,55p' /etc/sysconfig/nfs
# When there are no active clients, changing these values
# can be done in a single server restart.
#
#NFSD_V4_GRACE=90 # 无敌时间
#NFSD_V4_LEASE=90 # 无敌时间
#NLM_GRACE_PERIOD=90 # 无敌时间
#
#
#
# Optional arguments passed to rpc.mountd. See rpc.mountd(8)
#RPCMOUNTDOPTS=""
#说明:
NFSD_V4_GRACE=90 <===>/proc/fs/nfsd/nfsv4gracetime
NFSD_V4_LEASE=90 <===>/proc/fs/nfsd/nfsv4leasetime
NLM_GRACE_PERIOD=90 <===>/proc/fs/nfsd/nfsv4recoverydir
这三条是控制无敌时间的,去掉#直接修改时间便可,改后别忘了重启服务。一旦启用了这三条,/proc临时目录下便会生成对应的临时文件
2.2 NFS客户端mount挂载深刻
在NFS服务端能够经过cat /var/lib/nfs/etab 查看服务端配置参数的细节。在NFS客户端能够经过cat /proc/mounts查看mount的挂载参数细节。
2.2.1 mount挂载说明
经过以下命令在NFS客户端测试挂载获取的默认挂载参数:
[root@backup ~]# grep mnt /proc/mounts
nfs01:/data/ /mnt nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.41,minorversion=0,local_lock=none,addr=172.16.1.31 0 0
NFS Client mount 挂载参数列表
mount参数 参数功能 默认参数 fg;bg 当客户端挂载时,能够选择前台fg挂载或者后台bg挂载,后台挂载不影响前台其余操做,若是网络不稳建议bg比较稳当 fg soft;hard soft短挂载,当timeout出现时可能会形成资料丢失,不建议使用 hard intr 当使用hard挂载的资源timeout后,如有指定intr参数,能够在timeout后把它中断掉,这避免出问题时系统整个被NFS锁死,建议使用intr 无 proto=udp 使用UDP协议来传输资料,在LAN中会有比较好的性能。若要跨越Internet的话,使用pro=tcp多传输的数据会有比较好的纠错能力 proto=tcp mount -o参数对应的选项:
|参数|参数意义|系统默认值|
suid;nosuid 当挂载的文件系统上有任何SUID的程序时,只要使用nosuid就可以取消设置SUID的功能。 suid rw;ro 能够指定文件系统是只读(ro)或可写(rw) rw dev;nodev 是否能够保留装置文件的特殊功能?通常来讲只有/dev才会有特殊的装置,所以能够选择nodev dev exec;noexec 是否具备执行文件的权限?若是想要挂载的仅是普通资源数据区(例如:图片,附件),那么能够选择noexec exec user;nouser 是否容许用户进行文件的挂载与卸载功能?若是要保护文件系统,最好不要提供用户进行挂载与卸载 nouser auto;noauto 这个auto指的是“mount -a”时会不会被卸载的项目,若是不须要这个分区随时被挂载,能够设置为noauto auto 2.3 NFS 客户端mount挂载优化
某网友问:在企业生产环境中,NFS客户端挂载有没有必需要加的参数,好比,加noexec,nosuid,nodev,bg,soft,rsize,wsize等参数。
解答:
这个问题属于mount挂载优化内容(有些参数也适合其余文件系统),通常来讲要适当加挂载参数,可是,最好是先作好测试,用数据来讲话,才能更好的肯定究竟是挂载仍是不挂载。2.3.1 有关系统安全挂载参数选项
在企业工做场景,通常来讲,NFS服务器共享的只是普通静态数据(图片,附件,视频),不须要执行suid,exec等权限,挂载的这个文件系统只能做为数据存取之用,没法执行程序,对于客户端来说增长了安全性,例如:不少木马篡改站点文件都是由上传入口上传的程序到存储目录,而后执行的。
所以在挂载的时候,用下面的命令颇有必要:
mount -t nfs -o nosuid,noexec,nodev,rw 172.16.1.31:/data /mnt
2.3.2 mount挂载性能优化参数选项
下面介绍几个在企业生产环境下,NFS性能优化挂载的例子。
1)禁止更新目录及文件时间戳挂载,命令以下:
mount -t nfs -o noatime,nodiratime 172.16.1.31:/data /mnt
2)安全加优化的挂载方式以下:
mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 172.16.1.31:/data /mnt
3)默认的挂载方式以下:
mount -t nfs 172.16.1.31:/data /mnt
若是是本地文件系统,使用以下命令:
mount /dev/sdb1 /mnt -o defaults,async,noatime,data=writeback,barrier=0
注意:
若是本地文件系统挂载时,若是加入nodiratime会报错2.3.3 NFS网络文件系统优化挂载的参数建议
在CentOS6.5 6.6 6.8等服务器端和客户端环境下,可以使用以下命令参数:
mount -t nfs -o noatime,nodiratime,nosuid,noexec,nodev,rsize=131072 172.16.1.31:/data /mnt
通过实际测试,CentOS6.6 6.8默认的挂载参数性能仍是不错的。
mount -t nfs 172.16.1.31:/data /mnt
注意:非性能的参数越多,速度可能会变慢
2.3.4 NFS内核优化建议
下面是优化选项说明:
- /proc/sys/net/core/rmem_default:该文件指定了接收套接字缓冲区大小的默认值(以字节为单位),默认设置:124928 建议:8388608
- /proc/sys/net/core/rmem_max:该文件指定了接收套接字缓冲区大小的最大值(以字节为单位) 建议:16777216
- /proc/sys/net/core/wmem_default:该文件指定了发送套接字缓冲区大小的默认值(以字节为单位),默认设置:124928 建议:8388608
- /proc/sys/net/core/wmem_max:该文件指定了发送套接字缓冲区大小的最大值(以字节为单位)。默认设置:124928. 建议:16777216
2.4 NFS系统应用的优缺点说明
NFS服务可让不一样的客户端挂载使用同一个共享目录,也就是将其做为共享存储使用,这样能够保证不一样节点客户端数据的一致性,在集群架构环境中常常会用到。若是是windows和Linux混合环境的集群系统,能够用samba来实现。
优势:
- 简单,容易上手,容易掌握
- NFS 文件系统内数据是在文件系统之上的,即数据是能看得见的。
- 部署快速,维护简单方便,且可控,知足需求的就是最好的。
- 可靠,从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的。
- 服务很是稳定
局限:
- 存在单点故障,若是NFS Server宕机了,全部客户端都不能访问共享目录。这个须要负载均衡及高可用来弥补
- 在大数据高并发的场合,NFS效率,性能有限(2千万/日如下PV(page view)的网站不是瓶颈,除非网站架构设计太差。)
- 客户端认证是基于IP和主机名的,权限要根据ID识别,安全性通常(用于内网则问题不大)。
- NFS数据是明文的,NFS自己不对数据完整性作验证。
- 多台客户机器挂载一个NFS服务器时,链接管理维护麻烦(耦合度高)。尤为NFS服务端出问题后,全部NFS客户端都处于挂掉状态(测试环境可以使用autofs自动挂载解决,正式环境可修复NFS服务或强制卸载)
- 涉及了同步(实时等待)和异步(解耦)的概念,NFS服务端和客户端相对来讲就是耦合度有些高。网站程序也是同样,尽可能不要耦合度过高,系统及程序架构师的重要职责就是为程序及架构解耦,让网站的扩展性变得更好。
应用建议:
大中小型网站(参考点2000万/日PV如下)线上应用,都有用武之地。门户站也会有应用,生产场景应该多把数据的访问往前推,即尽可能把静态存储里的资源经过CDN或缓存服务器提供服务,若是没有缓存服务或架构很差,存储服务器数量再多也是扛不住压力的,并且用户体验会不好。
附录1 【nfs挂载加入fstab案例】
NFS客户端实现fstab开机自启动挂载
现象:在/etc/fstab中配置了nfs开机自动挂载,结果没法开机自动挂载nfs
解答:
1,nfs客户端挂载命令放在/etc/rc.local实现自动挂载
2,开机自启动netfs服务,而后才能实现fstab的开机自动挂载nfs文件系统(linux开机时在加载网络以前就会加载/etc/fstab)附录2 fstab误操做致使没法开机
1,fstab文件被错误修改,致使在开机启动linux时候出现错误,提示让你恢复系统设置。
1)开机时出现错误提示
2)输入root用户密码后,进入到用户操做界面
3)打开vim /etc/fstab 文件,咱们发现fstab文件是只读的。也就是说目前只能看不能改。
4)退出/etc/fstab。在命令行输入命令
mount -o remount,rw /
的意思是将整个根目录已可读可写rw的方式从新挂载一边remount5)咱们再打开/etc/fstab 就会发现只读模式没了
6)赶忙修改fstab而后重启服务器。
2,光盘救援模式恢复(用linux光盘修复系统)
1)调整开机bios设置光盘启动,而后挂载光盘
2)重启系统,进入光盘救援模式
3)一路回车,不加在网络模式
4)一路回车,选择第一个
进入这个页面
5)输入命令