NFS共享存储服务

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客户端地址的配置详细说明

客户端地址具体地址说明
授权单一客户端访问NFS172.16.1.8一般情况下,生产环境中此配置不多
授权整个网段可访问NFS172.16.1.0/24其中的24等同于255.255.255.0,指定网段为生产环境中最常见的配置。配置简单、维护方便
授权整个网段可访问NFS172.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”时会不会被挂载的项目,如果不需要这个分区随时被挂载,可以设置为noautoauto
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/exportsNFS服务主配置文件,配置NFS具体共享服务的站点,默认内容为空。以单行为单位。 [root@nfs01 ~]# cat /etc/exports # share /data by rsq for everyone at 20180127 /data 172.16.1.0/24(rw,sync)
/usr/sbin/exportfsNFS服务的管理命令。例如:可以加载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/etabNFS配置文件的完整参数设定的文件(有很多没有配置但是默认就有的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的信息列表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RSQ博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值