文章目录
1 什么是NFS
(本文篇幅过长,写了好长时间,望读者略有耐心)NFS是Network File System的缩写,中文意思是网络文件系统。它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,例如Web)可以通过挂载(mount)的方式将NFS服务器端共享的数据目录挂载带NFS客户端本地系统中(就是某一个挂载点下)。从客户端本地看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或目录一样,而实际上确实远端的NFS服务器的目录。
NFS网络文件系统很像Windows系统的网络共享、安全功能、网络驱动器映射,这也和Linux系统里的samba服务类似。只不过一般情况下,Windows网络共享服务或samba服务用于办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享,如果是大型网站,那么有可能还会用到更复杂的分布式文件系统,例如:Moosefs(mfs)、GlusterFS、FastDFS.
NFS系统已经历经了30年的发展,是一个非常稳定的(可移植)网络文件系统。在中小型互联网企业中,应用十分广泛。
中小型互联网公司一般不会买硬件存储,因为太贵,大公司如果业务发展很快的话,肯能会临时买硬件存储顶一下网站的压力,当网站并发继续加大时,硬件存储的扩展相对就会很费劲,且价格成几何级数增加。例如:淘宝网站曾替换掉了很多硬件设备,比如,用lvs+haproxy替换了netscaler负载均衡设备,用FastDFS、TFS配合PC服务器替换了netapp、emc等商业存储设备,去IOE正在成为互联网公司的主流。
2、NFS工作原理
2.1 NFS共享与客户端挂载结构图
在NFS服务器端设置好一个共享目录/video后,其他有权限访问NFS服务器端的客户端都可以将这个共享目录/video挂载到客户端本地的某个挂载点(其实就是一个目录,这个挂载点目录可以自己随意指定),图中的两个NFS客户端本地的挂载点分别为/v/video和/video,不同客户端的挂载点可以不相同。
客户端正确挂载完毕后,就进入到了nfs客户端的挂载点所在的/v/video或/video目录,此时就可以看到NFS服务器端/video共享出来的目录下的所有数据。在客户端上查看时,NFS服务器端的/video目录就相当于客户端本地的磁盘分区或目录,几乎感觉不到使用上的区别。
已经挂载完后用df -h可以看到本地挂载信息,和本地的磁盘分区几乎没什么差别,只是文件系统的开始是以IP地址开头而已。
NFS服务所使用的端口号在每次启动的时候是不同的,通过RPC(中文意思是远程过程调用,英文Remote
Procedure Call简称RPC)协议/服务来实现,这个RPC服务的应用在门户级的网站有很多。例如:百度。
2.2 什么是RPC
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口无法固定,它会随机取用一些未被使用的端口来作为传输之用,其中CentOS5.x的随机端口都小于1024,而CentOS6.x的随机端口都是较大的。
因为端口不固定,这样一来就会造成NFS客户端与NFS服务端的通信障碍,因为NFS客户端必须要知道NFS服务器端的数据传输端口才能进行通信,才能交互数据。
要解决上面的困扰,就需要通过远程过程调用RPC服务来帮忙了,NFS的RPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口上去,达到实现数据传输交互数据目的。
2.3 NFS工作流程
2.4 NFS参考资料
可以参考以下网站:
http://www.tldp.org/HOWTO/NFS-HOWTO/indes.html
http://www.citi.umich.edu/projects/nfsv4/linux/
http://www.ibm.com/developerworks/cn/linux/l-network-filesystems/
3 搭建NFS共享存储服务
3.1 配置环境
1、克隆模板机,由于之前存在nfs01这个机器,故再克隆一个Client客户端(web01)
2、修改客户端的IP地址(eth0:192.168.90.8/24,eth1:172.16.1.8/24)
3、重启系统
三个虚拟机做实验(一个nfs服务端,两个Client客户端)
Server:nfs01
eth0:192.168.90.31/24
eth1:172.16.1.31/24
Client1:backup
eth0:192.168.90.41/24
eth1:172.16.1.41/24
Client2:web01
eth0:192.168.90.8/24
eth1:172.16.1.8/24
3.2 nfs多个进程功能介绍
[root@nfs01 ~]# ps -ef|egrep “rpcbind|nfs”|egrep -v “egrep”
rpc 8642 1 0 12:25 ? 00:00:00 rpcbind
root 8703 2 0 12:27 ? 00:00:00 [nfsd4]
root 8704 2 0 12:27 ? 00:00:00 [nfsd4_callbacks]
root 8705 2 0 12:27 ? 00:00:00 [nfsd]
root 8706 2 0 12:27 ? 00:00:00 [nfsd]
root 8707 2 0 12:27 ? 00:00:00 [nfsd]
root 8708 2 0 12:27 ? 00:00:00 [nfsd]
root 8709 2 0 12:27 ? 00:00:00 [nfsd]
root 8710 2 0 12:27 ? 00:00:00 [nfsd]
root 8711 2 0 12:27 ? 00:00:00 [nfsd]
root 8712 2 0 12:27 ? 00:00:00 [nfsd]
3.3 NFS服务启动的进程说明
服务或进程名 | 用途说明 |
---|---|
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(非必要) | 可以来锁定文件,用于多客户端同时写入。 |
rpc.statd(非必要) | 检查文件的一致性,与rpc.lockd有关。c、d两个服务需要客户端服务器端同时开启才可以;rpc.statd:监听来自其它主机重启的通知,并且管理本地系统重启时主机列表。 |
rpc.idmapd | 名字映射后台进程。 |
想看哪个进程区别可以直接man帮助 |
3.3 NFS Server端的配置
要部署NFS服务,需要安装下面的软件包:
nfs-utils: NFS服务的主程序,包括rpc.nfsd、rpc.mountd这两个daemon和相关文档说明,以及执行命令文件等。
rpcbind: Centos6.X下面RPC的主程序。NFS可以视为一个RPC程序。
yum -y install nfs-utils rpcbind
rpm -qa nfs-utils rpcbind
3.2.1 启动rpcbind、nfs服务
#先启动rpcbind服务,再启动nfs服务
[root@nfs01 ~]# /etc/init.d/rpcbind start
[root@nfs01 ~]# /etc/init.d/nfs start #主端口2049
3.2.2 查看端口监听状态及服务状态
[root@nfs01 ~]# netstat -lntup|grep rpcbind
[root@nfs01 ~]# rpcinfo -p localhost #查看rpcinfo信息
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
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 49207 mountd
100005 1 tcp 35429 mountd
100005 2 udp 37870 mountd
100005 2 tcp 59870 mountd
100005 3 udp 45798 mountd
100005 3 tcp 53473 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 41544 nlockmgr
100021 3 udp 41544 nlockmgr
100021 4 udp 41544 nlockmgr
100021 1 tcp 41275 nlockmgr
100021 3 tcp 41275 nlockmgr
100021 4 tcp 41275 nlockmgr
#提示:111端口为rpcbind服务对外提供服务的主端口
[root@nfs01 ~]# service nfs status
rpc.svcgssd 已停
rpc.mountd (pid 8696) 正在运行...
nfsd (pid 8712 8711 8710 8709 8708 8707 8706 8705) 正在运行...
rpc.rquotad (pid 8691) 正在运行...
#设置服务开机自启动
[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
3.3.3 配置服务端
NFS配置文件/etc/exports(默认是空的)
[root@nfs01 ~]# ls -l /etc/exports
-rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports
#执行man exports命令,然后切换到文件结尾,可以快速查看如下样例格式:
[root@nfs01 ~]# 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)
/srv/www -sync,rw server @trusted @external(ro)
/foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
/build buildhost[0-9].local.domain(rw)
共分为三段:
NFS要共享的目录 NFS客户端地址(权限参数)
**NFS共享的目录:**为NFS服务端要共享的实际目录,要用绝对路径,如(/data)。注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。
**NFS客户端地址:**为NFS服务端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段地址,还可以用“*”来匹配所有客户端服务器,这里所谓的客户端一般来说就是前端的业务服务器,例如:Web服务,详见下表。
**权限参数集:**对授权的NFS客户端的访问权限设置。
3.3.4 指定NFS客户端地址的配置详细说明
客户端地址 | 具体地址 | 说明 |
---|---|---|
授权单一客户端访问NFS | 172.16.1.8 | 一般情况下,生产环境中此配置不多 |
授权整个网段可访问NFS | 172.16.1.0/24 | 其中的24等同于255.255.255.0,指定网段为生产环境中最常见的配置。配置简单、维护方便 |
授权整个网段可访问NFS | 172.0.0.* | 指定网段的另外写法(不推荐使用) |
授权某个域名客户端访问 | nfs.oldboyedu.com | 此方法生产环境中一般情况不常用 |
授权某个域名客户端访问 | *.oldbotedu.com | 此方法生产环境中一般情况不常用 |
3.3.5 配置/etc/exports
[root@nfs01 ~]# mkdir /data -p
[root@nfs01 ~]# ls -l /data/ -d
drwxr-xr-x. 2 root root 4096 Jan 27 13:02 /data/
[root@nfs01 ~]# chown -R nfsnobody. /data #此nfsnobody用户会在yum装完后自动创建
[root@nfs01 ~]# ls -l /data/ -d
drwxr-xr-x. 2 nfsnobody nfsnobody 4096 Jan 27 13:02 /data/
[root@nfs01 ~]# vim /etc/exports
# share /data by rsq for everyone at 20180127
/data 172.16.1.0/24(rw,sync)
#<==允许客户端读写,并且数据同步写到服务端的磁盘里,注意,带底纹部分之间不能有空格。
#可以查看系统默认配置参数
[root@nfs01 ~]# cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)
#重载nfs服务,用reload而不是restart
#修改完/etc/exports后,需执行/etc/init.d/nfs reload或exportfs -rv重新加载NFS配置,但不需要restart NFS。在生产环境中,此操作要注意。
reload(把已经到服务器的请求给处理掉,平滑重启服务,不会影响已经有请求用户的访问)
[root@nfs01 ~]# /etc/init.d/nfs reload <====> exportfs -rv
[root@nfs01 ~]# showmount -e 172.16.1.31
#若出现以下情况即服务已经可以正常使用了
Export list for 172.16.1.31:
/data 172.16.1.0/24
3.3.6 NFS直接挂载
下面演示不通过/etc/exportfs文件,而是通过exportfs命令来共享NFS存储目录,具体操作命令如下:
[root@nfs01 ~]# showmount -e localhost
Export list for localhost:
/data 172.16.1.0/24
[root@nfs01 ~]# exportfs -o rw,sync 192.168.90.41:/data/
[root@nfs01 ~]# showmount -e localhost
Export list for localhost:
/data 172.16.1.0/24,192.168.90.41
# exportfs命令共享的目录并没有写入到/etc/exports文件中,若是想要取消刚才共享的目录可直接使用-u参数。详细参数可参照man帮助。
exportfs -u 192.168.90.41:/data/
还可以指定其它参数共享/data目录,例如增加了“all_squash,anonuid=888,anongid=888”三个参数,设置NFS共享的命令为:
[root@nfs01 ~]# exportfs -o rw,sync,all_squash,anonuid=888,anongid=888 192.168.90.41:/data/
[root@nfs01 ~]# showmount -e localhost | grep data
3.4 NFS Client端配置测试
Centos6.6版本及以上的系统需要安装nfs-utils软件,否则再挂载的时候会报错
Centos6.5以前的没有这个问题。
客户端只需要启动rpcbind服务即可
[root@web01 ~]# /etc/init.d/rpcbind start
正在启动 rpcbind: [确定]
[root@web01 ~]# /etc/init.d/rpcbind status
rpcbind (pid 2644) 正在运行...
[root@web01 ~]# chkconfig rpcbind on
[root@web01 ~]# chkconfig --list rpcbind
rpcbind 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@web01 ~]# showmount -e 172.16.1.31
#先用showmount测试一下是否通,再挂载**
Export list for 172.16.1.31:
/data 172.16.1.0/24
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
172.16.1.31:/data 8.8G 1.6G 6.8G 19% /mnt
[root@web01 ~]# cd /mnt/
[root@web01 mnt]# ls
#在客户端创建一个文件
[root@web01 mnt]# echo "good" > oldboy.txt
[root@web01 mnt]# ls
oldboy.txt
#去服务端查看是否有此文件存在
[root@nfs01 ~]# cd /data/
[root@nfs01 data]# ls
oldboy.txt
[root@nfs01 data]# cat oldboy.txt
good
#也可以进行一些删除等操作,这里不再测试,现在已经挂载成功
#设置开机自动挂载(最好放在/etc/rc.local文件中而不是/etc/fstab文件),由于正常情况下系统开机是先挂载文件系统,后启动网络服务,而NFS网络文件系统服务是先要网络互通才能挂载,若写到/etc/fstab文件中会出现连接失败的错误,故最好放在rc.local文件中。当然也可以放在/etc/fstab文件中,只不过需要改变系统启动中挂载文件系统和启动网络服务的顺序,可以在系统中启动netfs服务并设置开机自启(chkconfig netfs on),这样系统在开机就会先启动网络服务,后挂载文件系统。
[root@web01 ~]# echo "mount -t nfs 172.16.1.31:/data /mnt" >> /etc/rc.local
[root@web01 ~]# tail -1 /etc/rc.local
mount -t nfs 172.16.1.31:/data /mnt
3.4.1 NFS Client挂载参数详解
参数 | 参数功能 | 默认参数 |
---|---|---|
fg、bg | 当在客户端执行挂载时,可选择是前台(fg)还是在后台(bg)执行。若在前台执行,则mount会持续尝试挂载,直到成功或挂载时间超时为止,若在后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的其他程序操作。如果网络联机不稳定,或是服务器常常需要开关机,建议使用bg比较妥当。 | fg |
soft、hard | 当NFS Client以soft挂载Server时,若网络或Server出现问题,造成Client和Server无法传输资料,Client就会一直尝试,直到timeout后显示错误才停止.若使用soft mount的话,可能会在timeout出现时造成资料丢失,故一般不建议使用。 若用hard模式挂载硬盘时,刚好和soft相反,此时Client会一直尝试连线到Server,若Server有回应就继续刚才的操作,若没有回应NFS Client会一直尝试,此时无法umount或kill,所以常常会配合intr使用。这是默认值。 | hard |
intr | 当时用hard挂载的资源timeout后,若有指定intr参数,可以在timeout后把它中断掉,者避免出问题时系统整个被NFS锁死,建议使用intr。 | 无 |
rsize、wsize | 读出(rsize)与写入(wsize)的区块大小(block size),这个设置值可以影响客户端与服务器端传输数据的缓冲存储量,一般来说,如果在局域网内(LAN),并且客户端与服务器端都具有足够的内存,这个值可以设置大一点,比如说65535(bytes),提升缓冲区块将可提升NFS 文件系统的传输能力。但设置的值也不要太大,最好以网络能够传输的最大值为限。 | Centos6 默认值: rsize=131072 wsize=131072 |
proto=udp | 使用UDP协定来传输资料,在LAN中会有比较好的性能。若要跨越Internet的话,使用proto=udp多传输的数据会有比较好的纠错能力。 | proto=udp |
可通过man nfs查看上述参数信息。如果追求极致,可以使用如下挂载参数: mount -t nfs -o fg,hard,intr,rsize=131072,wsize=131072 172.16.1.31:/data/ /mnt | ||
但是如果考虑以简单、易用为原则,可直接选择默认值就可以 mount -t nfs 172.16.1.31:/data/ /mnt |
3.4.2 mount -o 参数对应选项
下面是mount命令-o选项后面可以接的参数,注意,有些选项只有出现在/etc/fstab里面才有效,下面这些选项可以应用在绝大多数文件系统上,但是sync仅适合ext2、ext3、fat、vfat和ufs等文件系统。
参数 | 参数意义 | 系统默认值 |
---|---|---|
suid、nosuid | 当挂载的文件系统上有任何SUID的程序时,只要使用nosuid就能取消设置SUID的功能。 | suid |
rw、 ro | 可以指定文件系统是只读(ro)或读写(rw)。 | rw |
dev、nodev | 是否可以保留装置文件的特殊功能,一般来说只有/dev才会有特殊的装置,因此可以选择nodev。 | dev |
exec、noexec | 是否具有执行文件的权限,如果想要挂载的仅是普通资源数据区(如:图片、附件),那么可以选择noexec。 | exec |
user、nuser | 是否允许用户进行文件的挂载与卸载功能,如果要保护文件系统,最好不要提供用户进行挂载与卸载。 | nouser |
auto、noauto | 这个auto指的是“mount -a”时会不会被挂载的项目,如果不需要这个分区随时被挂载,可以设置为noauto | auto |
async | 涉及文件系统I/O的操作都是异步处理,即不会同步写到磁盘,此参数会提高性能,但会降低数据的安全性,一般情况下,生产环境下不推荐使用,除非对性能要求很高,但是对数据可靠性不太要求的场合。 | |
sync | 该参数和async相反。有I/O操作时,都会同步处理I/O,即把数据同步写入吸盘,此参数会牺牲一点I/O性能,但是,换来的是掉电后数据的安全性。 | |
atime | 在每一次数据访问时,会同步更新访问文件的inode时间戳,是默认选项。 在高并发的情况下,建议通过明确加上noatime,来取消这个默认选项,以达到提升I/O性能,优化I/O的目的。 | atime |
defaults | 这个是fstab里的默认值,包括rw、suid、dev、exec、auto、nouser、and async,默认情况大部分都是默认值。 | |
nodirname | 不更新文件系统上的directory inode时间戳,高并发环境,推荐显示应用该选项,可以提高系统I/O性能。 | |
remount | 尝试重新挂载一个已经挂载了的文件系统,这通常被用来改变一个文件系统的挂载标志,从而使得一个只读文件系统变的可写,这个动作不会改变设备或者挂载点。当系统故障时进入single或rescue模式修复系统时,会发现根文件系统经常会变成只读文件系统,不允许修改,此时该命令就派上用场了。具体命令为:“mount -o remount,rw /”表示将根文件系统重新挂载使得可写。single或rescue模式修复系统时这个命令十分重要。 | |
dirsync | 目录更新时间同步写入磁盘 |
因此在挂载的时候,用下面的命令很有必要:
mount -t nfs -o nosuid,noexec,nodev,rw x.x.x.x:/data/mnt
3.4.3 mount挂载性能优化参数
下面介绍几个在企业生产环境下,NFS性能优化挂载的例子。
1)禁止更新目录及文件时间戳挂载,命令如下:
mount -t nfs -o noatime,nodiratime x.x.x.x:/data /mnt
2)安全加优化的挂载方式如下:
mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 x.x.x.x:/data /mnt
3)默认的挂载方式如下:
mount -t nfs x.x.x.x:/data /mnt
如果是本地文件系统,使用如下命令:
mount /dev/sdb1 /mnt -o defaults,async,noatime,data=writeback,barrier=0
df -h
grep mnt /proc/mounts
注意:本地文件系统挂载时,如果加nodirtime会报错。
Centos 6.x 默认的挂载参数就很优秀
3.4.4 文件系统故障修复案例
1、fstab修改错误导致系统无法启动故障修复案例
维护模式或救援模式:
mount -o rw,remount /
然后修改/etc/fstab
2、文件系统只读故障修复案例
原因:
1)RSYNC的bug
2)文件系统内部自动一致性(只读)
维护模式或救援模式:
mount -o rw,remount /
案例:
http://blog.sina.com.cn/s/blog_4a2fadfb010131jf.html
3.5 NFS企业级优化
3.5.1 NFS企业级挂载优化
在Centos6.6 x86_64服务器端和客户端环境下,可使用如下命令参数:
mount -t nfs -o noatime,nodiratime,nosuid,noexec,nodev,rsizw=131072,wsize=131072 x.x.x.x:/data /mnt
经过实际测试,Centos6.6 x86_64默认的挂载参数性能还是不错的。
mount -t nfs x.x.x.x:/data /mnt
注意:非性能的参数越多,速度可能会越慢,故要根据实际业务需要来设置挂载参数。
3.5.2 NFS企业级内核优化建议(Server端)
**/proc/sys/net/core/rmem_default:**该文件指定了接收套接字缓冲区大小的默认值(以字节为单位),默认值:124928。
**/proc/sys/net/core/rmem_max:**该文件指定了接收套接字缓冲区大小的最大值(以字节为单位),默认值:124928。
**/proc/sys/net/core/wmem_default:**该文件指定了发送套接字缓冲区大小的默认值(以字节为单位),默认值:124928。
**/proc/sys/net/core/wmem_max:**该文件指定了发送套接字缓冲区大小的最大值(以字节为单位),默认值:124928。
修改以上参数:
cat >>/etc/sysctl.conf<<EOF
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 1677216
net.core.wmem_max = 1677216
EOF
sysctl -p 生效
3.5.3 企业场景NFS共享存储优化小结
1、硬件:ssa/ssd磁盘,买多块,硬件raid5/raid10。网卡吞吐量要大,至少千兆(多块网卡绑定bond)
2、NFS服务端配置:/data 192.168.90.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534)
3、NFS客户端挂载优化配置命令
mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,rsize=131072,wsize=131072 192.168.90.41:/data/ /mnt <--兼顾安全性能
4、对NFS服务的所有服务器内核进行优化时,执行如下命令:
cat >>/etc/sysctl.conf<<EOF
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 1677216
net.core.wmem_max = 1677216
EOF
#执行sysctl -p生效
5、如果卸载的时候提示“umount:/mnt device is busy”,需要退出挂载目录再进行卸载,如果是NFS Server宕机了,则需要强制卸载,可执行umount -lf /mnt。
6、大型网站NFS网络文件系统的替代软件为分布式文件系统Moosefs(mfs)、GlusterFS、FastDFS。
3.6 NFS配置权限设置常用参数说明
参数名称 | 参数用途 |
---|---|
rw | 读写权限 |
ro | 只读权限 |
sync | 请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。优点:数据安全不会丢;缺点:性能比不启动该参数要差 |
async | 写入时数据会先写入到内存缓冲区,直到硬盘有空档才会再写入磁盘,这样可以提升写入效率!风险为若服务器宕机或不正常关机,不会缓冲未写入磁盘的数据(解决办法:服务器主板电池或UPS不间断电源) |
no_root_squash | 访问NFS Server共享目录的用户如果是root的话,它对该共享目录具有root权限。这个配置原本是为无盘客户端准备的。用户应避免使用。 |
root_squash | 如果访问NFS Server共享目录的用户时root,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份。 |
all_squash | 不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody帐号身份。在早期多个NFS 客户端同时读写NFS Server数据时,这个参数很有用。 在生产中配置NFS 的重要技巧: l)确保所有客户端服务器对NFS共享目录具备相同的用户访问权限 a.all_squash 把所有客户端都压缩成固定的匿名用户(UID相同) b.就是anonuid,anongid 指定的UID和GID的用户。 2)所有的客户端和服务端都需要有一个相同的UID和GID的用户,即nfsnobody(UID必须相同)。 |
anonuid | 参数以anon*开头即指anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd 中。在多NFS Clients时,如多台Web Server共享一个NFS目录,通过这个参数可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用,一般默认即可。 |
anongid | 同anonuid,区别就是把uid(用户id)换成gid(组id)。 |
带底纹标记的表示为常用参数,更多可以参考man exports |
3.7 NFS配置权限设置常用参数关系图
3.8 NFS的优缺点
NFS服务可以让不同的客户端挂载使用同一个共享目录,也就是讲其作为共享存储使用,这样可以保证不同节点客户端数据的一致性,在集群架构环境中经常会使用到(仅支持类UNIX系统)。如果是Windows和Linux混合环境的集群系统,可以使用samba来实现。
优点:
1、简单,容易上手,容易掌握。
2、NFS文件系统内数据是在文件系统之上的,即数据是能看得见的。
3、部署快速,维护简单方便,且可控,满足需求就是最好的。
4、可靠,从软件层面上看,数据可靠性高,经久耐用。
5、服务非常稳定。
缺点:
1、存在单点故障,如NFS Server宕机了,所有客户端都不能访问共享目录,后期会通过负载均衡及高可用方案弥补
2、在大数据高并发的唱场合,NFS效率、性能有限(2千万/日 以下PV的网站不是平静,除非网站架构设计太差)
3、客户端认证是基于IP和主机名的,权限需要根据ID识别,安全性一般(用于内网则问题不大)
4、NFS数据是明文的,NFS本身不对数据完整性作验证。
5、多台客户机器挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。尤其NFS服务端出问题后,所有NFS客户端都处于挂掉状态(测试环境可使用autofs自动挂载解决,正式环境可修复NFS服务或强制卸载umount -lf)
6、涉及了同步(实时等待)和异步(解耦)的概念,NFS服务端和客户端相对来说就是耦合度有些高。网站程序也是一样,尽量不要耦合度太高,系统及程序架构师的重要职责就是为了解决程序及架构解耦,让网站的可扩展性变得更好。
应用建议
大中小型网站(参考200万/日 PV以下)线上应用,都有用武之地。门户站也会有应用,生产场景应该多把数据的访问往前推,即尽量把静态存储里的资源通过CDN或缓存服务器提供服务,如果没有缓存服务或架构不好,存储服务器数量再多也是抗不住压力的,而且用户体验会很差。
4 实验测试时可能出错原因
1、selinux没有处于disabled状态
2、iptables没关(telnet 172.16.1.31 111)
3、命令敲错
4、配置文件搞错
5、共享目录没有授权
6、客户端没有安装nfs-utils(会导致没有showmount命令)
7、网段搞错了
8、网络不通(ping)
9、nfs and rpcbind启动顺序不对
5 NFS服务的重点知识梳理
当多个NFS客户端访问服务器端的读写文件时,需要具有以下几个权限:
1、NFS服务器/etc/exports设置需要开放可写入的权限,即服务端的共享权限。
2、NFS服务器实际要共享的NFS目录权限具有可写入w权限,即服务端本地目录的安全权限。
3、每台机器都对应存在和NFS默认配置UID的相同UID65534的nfsnobody用户(确保所有客户端的服务权限统一,否则每隔机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)。
只有满足上述三个条件,多个NFS客户端才能具有查看、修改、删除其他任意NFS客户端上传文件的权限,这在大规模的集群环境中作为集群共享存储时尤为重要。
6 NFS服务文件或命令的说明
NFS常用路径 | 说明 |
---|---|
/etc/exports | NFS服务主配置文件,配置NFS具体共享服务的站点,默认内容为空。以单行为单位。 [root@nfs01 ~]# cat /etc/exports # share /data by rsq for everyone at 20180127 /data 172.16.1.0/24(rw,sync) |
/usr/sbin/exportfs | NFS服务的管理命令。例如:可以加载NFS配置生效,还可以直接配置NFS共享目录,即无需配置/etc/exports实现共享. [root@nfs01 ~]# /usr/sbin/exportfs -rv <==加载配置生效,等价优雅重启/etc/init.d/nfs reload exporting 172.16.1.0/24:/data 这里有一个服务平滑重启的概念,即超市、银行到了关门时间了,但还是会继续提供服务给已经在门里的人,但是新来的就会被挡在门外了。网站服务平滑重启,是提升用户体验必须要考虑的。 exportfs不但可以加载配置生效,也可以通过命令直接共享目录。越过/etc/exportfs,但是重启失效。 |
/usr/sbin/showmount | 常用在客户端,查看NFS配置及挂载结果的命令。 show mount information for an NFS server 配置nfsserver,分贝在服务器及客户端查看挂载情况。 |
/var/lib/nfs/etab | NFS配置文件的完整参数设定的文件(有很多没有配置但是默认就有的NFS参数)。 |
/proc/mounts | 客户端挂载参数 [root@web01 ~]# grep “mnt” /proc/mounts 172.16.1.31:/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.8,minorversion=0,local_lock=none,addr=172.16.1.31 0 0 |
/var/lib/nfs/rmtab | 客户端访问服务器exports的信息列表 |