NFS 是Network File System的缩写,中文意思是网络文件系统。它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从客户端本地看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
NFS网络文件系统就像windows系统的网络共享,安全功能、网络驱动器映射,这也和Linux系统里的Samba服务类似。只不过一般情况下,windows网络共享服务或Samba服务用于办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享,如果是大型网站,那么有可能还会用到更为复杂的分布式文件系统,例如:Moosefs(mfs)、GlusterFS、FastDFS。
第一个网络文件系统成为File Sccess Listener,由Digital Equipment Corporation
(DEC)在1976年开发。
NFS是第一个构建与IP协议智商的现代网络文件系统。在20世纪80年代,它首先作为实验的文件系统,由Sun Microsystems在内部完成开发。NFS协议终归于Request for Comments(RFC)标准,并且随后演化为了NFSv2.作为一个标准,由于NFS与其他客户端和服务器的互操作能力很好而发展快速。
之后,标准继续演化,称为NFSv3,在RFC1813中有定义。这一新的协议比以前的版本具有更好的可扩展性,支持大文件(超过2GB),异步写入,并且将TCP作为了传输协议,为文件系统在更广泛的网络中使用铺平了道路。在2000年,RFC3010(由RFC3530修订)将NFS带入企业级应用。此时,Sum引入了具有较高安全性带有状态协议的NFSv4(NFS之前的版本都是无状态的)。今天,NFS版本的4.1(由RFC5661定义)增加了对跨越分布式服务器并行访问的支持(称之为PNFS extension)。
NFS系统发展的时间表,包括记录器特性的特定RFC,如下图
NFS系统已经历了近30年的发展,它代表了一个非常稳定的(及可移植)网络文件系统,具备可扩展、高性能等特性,并达到了企业级应用质量标准。由于网络速度的增加和延迟的降低,NFS系统一直是通过网络提供文件系统服务的有竞争力的选择,特别是在中小型互联网企业中,应用十分广泛。
在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,通常网站用户上传到的文件都会放到NFS共享里,例如BBS产品的图片、附件、头像(注意网站BBS程序不要放NFS共享里),然后前端所有的节点访问这些静态资源时都会读取NFS存储上的资源。NFS是当前互联网系统架构中最常用的数据存储服务器之一,前面说过,中小型网站公司应用频率更高,大公司或门户除了使用NFS外,还可能会使用更为复杂的分布式文件系统,比如Moosefs(mfs)、GlusterFS、FastDF等。
在企业生产集群架构中,NFS作为所有前端web服务的共享存储,存储的内容一般包括网站用户上传的图片、附件头像等,注意,网站的程序代码不要放NFS共享里,因为网站程序是开发运维人员统一发布的,不存在发布延迟问题,直接批量发布到web节点提供访问比共享到NFS里访问效率更高。
这里通过图解给大家展示一下集群架构需要共享存储服务的理由。例如:A用户传图片到web服务器,然后让B用户访问这张图片,结果B用户访问的请求分发到了web2,因为web2上没有这张图片,这就导致它无法看到A用户上传的图片,如果此时有一个共享存储,A用户上传图片的请求无论是分发到web1还是web2上,最终都会存储到共享存储上,而在B用户访问图片是,无论请求分发到web1还是web2行,最终也都会去共享存储上找,这样就可以访问到需要的资源了。这个共享存储的位置可以通过开源软件和商业硬件实现,互联网中小型集群架构会用普通PC服务器配置NFS网络文件系统实现。
中小型互联网企业一般不会买硬件存储,因为太贵,大公司如果业务发展很快的话,可能会临时买硬件存储顶一下网站的压力,当网站并发继续加大时,硬件存储的扩展相对就会很费劲,且价格成几何级数增加。例如:淘宝网就曾替换掉了很多硬件设备,比如,用lvs+haproxy替换了netscaler负载均衡设备,用FastDFS、TFS配合PC服务器替换了netapp、emc等商业存储设备,去IOE正在成为互联网公司的主流。
如上图所示,在NFS服务器端设置好一个共享目录/video后,其他有权限访问NFS服务器端的客户端就可以将这个共享目录/video挂载到客户端本地的某个挂载点(其实就是一个目录,这个挂载点目录可以自己随意指定),上图中的两个NFS客户端本地的挂载点分别为/v/video和/video,不同客户端的挂载点可以不相同。
客户端正确挂载完毕后,就进入到了nfs客户端的挂载点所在的/v/video或/video目录,此时就可以看到NFS服务器端/video共享出来的目录下的所有数据。在客户端上查看是,NFS服务器端的/video目录就相当于客户端本地的磁盘分区或目录,几乎感觉不到使用上的区别,根据NFS服务端授予的NFS共享权限以及共享目录的本地系统权限,只要是指定的NFS客户端操作挂载/v/video或/video的目录,就可以将数据轻松地存储到NFS服务器端的/video目录中了。
客户端挂载NFS后,本地挂载基本信息显示如下:
[root@web02 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.9G 1.5G 5.1G 23% /
tmpfs 242M 0 242M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
172.16.1.31:/data 6.9G 1.5G 5.1G 23% /mnt<===172.16.1.31为nfs server的ip地址
提示:mount 源 目标
mount 712.16.1.31:/video /video
从挂载信息来看,和本地的磁盘分区几乎没什么差别,只是文件系统对应列的开头是以IP地址开头的形式了。
大家必须知道,NFS在传输数据时使用的端口会随机选择,那NFS客户端是怎么知道NFS服务端使用的是哪个客户端呢?
答案:就是通过RPC(中文意思远程过程调用,英文Remote Procedure Call简称RPC)协议/服务来实现,这个RPC服务的应用在门户级的网站有很多,例如:百度。接下来,就来谈谈什么是RPC协议/服务。
如图所以,PRC服务就像买房与卖房之间的中介一样,RPC也就是服务端与客户端的中介。
NFS需要有RPC服务(rpcbind服务)的协助才能成功对外提供服务。无论是NFS客户端还是NFS服务器端,当要使用NFS时,都需要首先启动RPC服务(rpbind服务),NFS服务必须在RPC服务启动之后启动,客户端无需启动NFS服务,但需要启动RPC服务。
注意:NFS的RPC服务,在CentOS5.5.X名称为portmap,在CentOS6.X下名称为rpcbind。
参考资料:
http://www.tldp.org/HOWTO/NFS-HOWTO/indes.html
http://www.citi.umich.edu/projects/nfsv4/linux/
http://www.vanemery.com/Linux/NFSv4/NFSv4-no-rpcsec.html
http://www.ibm.com/developerworks/cn/linux/l-network-filesystems/
1、安装软件
yum install nfs-utils dos2unix rpcbind -y
yum
2、启动服务(注意先后顺序)
/etc/init.d/rpcbind start
rpcinfo -p localhost
/etc/init.d/nfs start
rpcinfo -p localhost
3、设置开机自启动
chkconfig nfs on
chkconfig rpcbind on
4、配置nfs服务
echo " /data 172.16.1.0/21(rw,sync)">>/etc/exports
mkdir -p /data
chown -R nfsnobody.nfsnobody /data
(查看nfs默认使用的用户以及共享的参数cat /var/lib/nfs/etab)
5、重新加载服务(优雅重启)
/etc/init.d/nfs reload =====exportfs -rv
6、检查或测试挂载
showmount -e 127.0.0.1
老男孩教育NFS客户端:
1、安装软件
yum install nfs-utils rpcbind -y
2、启动rpcbind
/etc/init.d/rpcbind start
3、配置开机自启动
chkconfig rpcbind on
4、测试服务端共享情况
showmount -e 172.16.1.31
5、挂载
mkdir -p /data
mount -t nfs 172.16.1.31:data /data
6、测试读,写
NFS服务端与web端都安装nfs与rpc
[root@wangtian ~]# yum install nfs-utils rpcbind -y
[root@web01 ~]# yum install nfs-utils rpcbind -y
NFS服务端
[root@nfs01 ~]#/etc/init.d/rpcbind start
[root@nfs01 ~]# /etc/init.d/nfs start
加入开机启动
[root@nfs01 ~]# chkconfig nfs on
[root@nfs01 ~]# chkconfig rpcbind on
web客户端
[root@web01 ~]# /etc/init.d/rpcbind start
加入开机启动
[root@web01 ~]#chkconfig rpcbind on
要部署NFS服务,需要安装下面的软件包:
q nfs-utils:NFS服务的主程序,包括rpc.nfsd、rpc.mountd这两个daemons和相关文档说明,以及执行命令文件等。
q rpcbind:CentOS6.X下面的RPC的主程序。NFS可以视为一个RPC程序,再启动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由rpcbind服务来完成的。因此,在提供NFS服务之前必须先启动rpcbind服务才行
可使用如下命令查看默认情况下CentOS5.8/6.6里NFS软件的安装情况。
[root@nfs01 ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-11.el6_7.x86_64
nfs-utils-1.2.3-64.el6.x86_64
CentOS6.6默认没有安装NFS软件包(CentOS5默认会安装),可以使用yum install nfs-utils rpcbind -y命令来安装NFS软件。
因为NFS及其辅助程序都是基于RPC协议的(使用的端口为111),所有首先要确保系统中运行了rpcbind服务。
[root@nfs01 ~]# LANG=en #临时调整系统位英文字符集,便于grep过滤
[root@nfs01 ~]# /etc/init.d/rpcbind status #检查rpcbind服务状态
rpcbind (pid 27427) is running...
[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
...省略部分
100021 1 tcp 37256 nlockmgr
100021 3 tcp 37256 nlockmgr
100021 4 tcp 37256 nlockmgr
[root@nfs01 ~]# /etc/init.d/rpcbind start #启动rpcbind服务
[root@nfs01 ~]# ps -ef|grep "rpc|nfs"
root 29325 28803 0 22:09 pts/1 00:00:00 grep rpc|nfs
[root@nfs01 ~]# ps -ef|egrep "rpc|nfs"
rpc 27427 1 0 12:53 ? 00:00:00 rpcbind
root 27474 2 0 12:53 ? 00:00:00 [rpciod/0]
root 27483 1 0 12:53 ? 00:00:00 rpc.rquotad
root 27488 1 0 12:53 ? 00:00:00 rpc.mountd
root 27495 2 0 12:53 ? 00:00:00 [nfsd4]
root 27496 2 0 12:53 ? 00:00:00 [nfsd4_callbacks]
root 27497 2 0 12:53 ? 00:00:00 [nfsd]
root 27498 2 0 12:53 ? 00:00:00 [nfsd]
root 27499 2 0 12:53 ? 00:00:00 [nfsd]
root 27500 2 0 12:53 ? 00:00:00 [nfsd]
root 27501 2 0 12:53 ? 00:00:00 [nfsd]
root 27502 2 0 12:53 ? 00:00:00 [nfsd]
root 27503 2 0 12:53 ? 00:00:00 [nfsd]
root 27504 2 0 12:53 ? 00:00:00 [nfsd]
root 27535 1 0 12:53 ? 00:00:00 rpc.idmapd
root 28257 2 0 15:31 ? 00:00:00 [nfsiod]
root 28258 2 0 15:31 ? 00:00:00 [nfsv4.0-svc]
加入开机自启动
[root@nfs01 ~]# chkconfig rpcbind on
[root@nfs01 ~]# less /etc/init.d/rpcbind
#! /bin/sh
#
# rpcbind Start/Stop RPCbind
#
# chkconfig: 2345 13 87
[root@nfs01 ~]# less /etc/init.d/nfs
#!/bin/sh
#
# nfs This shell script takes care of starting and stopping
# the NFS services.
#
# chkconfig: - 30 60
可以看到他们启动的先后次序分别是rpcbind13和nfs30。如果是放进rc.local里面的话就一定要注意启动先后次序。也可以把服务统一放进rc.local里面,这样自己跑什么服务都知道
[root@nfs01 ~]# /etc/init.d/rpcbind start #开启服务
[root@nfs01 ~]# /etc/init.d/rpcbind statis
Usage: /etc/init.d/rpcbind {start|stop|status|restart|reload|force-reload|condrestart|try-restart}
[root@nfs01 ~]# /etc/init.d/rpcbind status #查看服务状态
rpcbind (pid 27427) is running...
[root@nfs01 ~]# lsof -i :111 #查看端口号
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 27427 rpc 6u IPv4 40188 0t0 UDP *:sunrpc
rpcbind 27427 rpc 8u IPv4 40191 0t0 TCP *:sunrpc (LISTEN)
rpcbind 27427 rpc 9u IPv6 40193 0t0 UDP *:sunrpc
rpcbind 27427 rpc 11u IPv6 40196 0t0 TCP *:sunrpc (LISTEN)
[root@nfs01 ~]#
共享/data目录给172.16.1.0整个网段的主机读写,实现把nfs server上的/data目录共享给172.16.1.0整个网段的主机,且可读写。
1)查看系统环境
[root@nfs01 ~]# cat /etc/redhat-release
CentOS release 6.7 (Final)
[root@nfs01 ~]# uname -r
2.6.32-573.el6.x86_64
编辑 /etc/exports
[root@nfs01 ~]# vim /etc/exports
#data shared by wangtian at 20160424
/data 172.16.1.0/21(rw,sync)
~
~
~
~
~
[root@nfs01 ~]# tail /etc/exports
#data shared by wangtian at 20160424
/data 172.16.1.0/21(rw,sync
平滑重启
[root@nfs01 ~]# /etc/init.d/nfs reload====》exportfs -rv
先进行域名解析,再挂载,速度就很快。
[root@nfs01 ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.loca
ldomain4
::1 localhost localhost.localdomain localhost6 localhost6.loca
ldomain6
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web02
172.16.1.8 web01
172.16.1.51 db01
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
把下面的IP与主机名加进去
然后进行挂载
[root@nfs01 ~]# mount -t nfs 172.16.1.31:/data /mnt
查看挂载结果
[root@nfs01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.9G 1.5G 5.1G 23% /
tmpfs 242M 0 242M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
172.16.1.31:/data 6.9G 1.5G 5.1G 23% /mnt
[root@nfs01 ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.loca
ldomain4
::1 localhost localhost.localdomain localhost6 localhost6.loca
ldomain6
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web02
172.16.1.8 web01
172.16.1.51 db01
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
[root@web01 ~]# /etc/init.d/rpcbind start
Starting rpcbind: [ OK ]
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/21
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.9G 1.5G 5.1G 22% /
tmpfs 242M 0 242M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
172.16.1.31:/data 6.9G 1.5G 5.1G 23% /mnt
[root@web01 ~]#
开始在nfs服务端写入文件
[root@nfs01 data]# cd /data/
[root@nfs01 data]# touch {a..z}
[root@nfs01 data]# ls
a c e g i k m o q s u w y
b d f h j l n p r t v x z
可以看到客户端已经同步了
[root@web01 mnt]# ls
a c e g i k m o q s u w y
b d f h j l n p r t v x z
此时客户端还不能写,权限不够,要回到服务端更改nfsnobody权限
[root@nfs01 data]# grep nfsnobody /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfs01 data]# chown -R nfsnobody.nfsnobody /data
再回到客户端就可以写了
[root@web01 mnt]# rm -f *
[root@web01 mnt]# ls
[root@web01 mnt]# touch {1..3}
[root@web01 mnt]# ls
1 2 3
[root@web01 mnt]#
再到服务端查看
[root@nfs01 data]# ls
1 2 3
服务端vim /etc/exports
#data shared by wangtian at 20160424
/data 172.16.1.0/21(rw,sync)
查看tail /etc/export
#data shared by wangtian at 20160424
/data 172.16.1.0/21(rw,sync)
平滑重启,优雅重启
/etc/init.d/nfs reload
域名解析(服务端,客户端都要解析)
cat >>/etc/hosts<<EOF
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web02
172.16.1.8 web01
172.16.1.51 db01 db01.etiantian.org
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
EOF
vi /etc/hosts
把ip 主机名追加进去
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web02
172.16.1.8 web01
172.16.1.51 db01
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
查看服务有没有
[root@nfs01 /]# showmount -e 127.0.0.1
不放心,可以自己挂载自己
[root@nfs01 /]# mount -t nfs 172.16.1.31:/data /mnt
然后df -h 查看
[root@nfs01 /]# df -h
客户端
查看有没有
[root@web01 ~]#showmount -e 172.16.1.31
然后挂载
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
在查看
[root@web01 ~]# df -h
在服务端
[root@nfs01 /]# cd /data/
[root@nfs01 data]# touch {a..z}
[root@nfs01 data]# ls
a b c d e f g h i j k l m n o p q r s t u v w x y z
在客户端查看
[root@web01 ~]# ls /mnt/
a b c d e f g h i j k l m n o p q r s t u v w x y z
如果想再客户端可以写,就要在服务端给相应目录权限
[root@nfs01 data]# chown -R nfsnobody.nfsnobody /data
当多个NFS客户端访问服务器端的读写文件时,需要具有以下几个权限:
q NFS服务器/etc/exports设置需要开放可写入的权限,及服务端的共享目录权限。
q NFS服务器实际要共享的NFS目录权限具有可写入w的权限,及服务端本地目录的安全权限。
q 每台机器都对应存在和NFS摩恩配置UID的相同UID65534的nfsnobody用户(确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)。
只有满足上述三个条件,多个NFS客户端才能具有查看、修改、删除其他任意NFS客户端上传文件的权限,这在大规模的集群环境中作为集群共享存储时尤为重要。
下面是优化选项说明
q /proc/sys/net/core/rmem_default:该文件指定了接受套接字缓冲区大小的默认值(以字节为单位),默认设置:124928.
q /proc/sys/net/core/rmem_maxt:该文件指定了接受套接字缓冲区大小的最大值(以字节为单位),默认设置:124928.
q /proc/sys/net/core/rmem_default:该文件指定了发送套接字缓冲区大小的默认值(以字节为单位),默认设置:124928.
q /proc/sys/net/core/rmem_default:该文件指定了接受套接字缓冲区大小的最大值(以字节为单位),默认设置:124928.
上述文件对应的具体内核优化命令如下:
cat >>/etc/sysctl.conf<<EOF
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
EOF
sysctl -p
q 硬件:sas/ssd磁盘,买多块,raid0/raid10。网卡吞吐量要大,至少千兆(多块bond)。
q NFS服务器端配置:/data 172.16.1.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534)
q NFS客户端挂载优化配置命令:
mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,rsize=131072,wsize=131072 172.16.1.7:/data/ /mnt #兼顾安全性能
q 对NFS服务的所有服务器内核进行优化时,执行如下命令:
cat >>/etc/sysctl.conf<<EOF
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
执行sysctl -p生效。
q 如果卸载的时候提示“umount:/mnt:device is busy”,需要退出挂载目录再进行卸载,如果是NFS Server宕机了,则需要强制卸载,可执行umount -lf /mnt.
q 大型网站NFS网络文件系统的替代软件为分布式文件系统Moosefs(mfs)、GlusterFS、FastDFS。
q 放进/etc/fstab生效的方法:chkconfig netfs on 让网卡先启动,再挂载
NFS服务可以让不同的客户端挂载使用同一个共享目录,也就是将其作为共享存储使用,这样可以保证不同节点客户端数据一致性,在集群架构环境中经常会用到。如果是windows和linux混合环境的集群系统,可以用samba来实现。
优点:
q 简单,容易上手,容易掌握。
q NFS文件系统内数据是在文件系统之上的,即数据是能看见的。
q 部署快速,维护简单方便,且可靠那个,满足需求就是最好的。
q 可靠,从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的。
q 服务非常稳定
局限:
q 存在单点故障,如果NFS Server宕机了,所有客户端都不能访问共享目录。这个在后期的课程会通过负载均衡及高可用方案弥补。
q 在大数据高并发的场合,NFS效率、性能有限(2千万/日一下PV的网站不是瓶颈,除非网站架构设计太差)。
q 客户端认证是基于IP和主机名的,权限要根据ID识别,安全性一般(用于内网则问题不大)。
q NFS数据时是明文的,NFS本事不对数据完整性做验证。
q 多台客户机器挂载一个NFS服务器时,连接管理维护麻烦(耦合度多高。)尤其NFS服务端出问题后,所有NFS客户端都处于挂掉状态(测试环境可使用autofs自动挂在解决,正式环境可修复NFS服务或强制卸载)
q 设计了同步(实时等待)和异步(解耦)的概念,NFS服务端和客户端相对来说就是耦合度有些高。网站程序也是一样,尽量不要耦合度太高,系统及程序架构师的重要职责就是为程序及架构解耦,让网站的扩展性变得更好。
应用建议:
大中小型网站(参考的2千万/日一下PV以下)线上应用,都有用武之地。门户站也会有应用,生产场景应该多把数据的访问往前推,即尽量把静态存储里的资源通过CDN或缓存服务器提供服务,如果没有缓存服务或架构不好,存储服务器数量再多也是扛不住压力的,而且用户体验会很差。
exports配置文件格式:
NFS共享的目录 NFS客户端地址1(参1、参2...) 客户端地址(参1、参2...)
例:
/data 172.16.1.0/21(rw,sync)
参数含义:
NFS共享的目录:为NFS服务端要共享的实际目录,要用绝对路径,如(/data)。注意共享目录的本地权限,如果需要读写共享,一定要让本地目录被NFS客户端的用户(nfsnobody)可以读写。
NFS客户端地址:为NFS服务端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段地址,还可以用“*”来匹配所有客户端服务器,这里所谓的客户端一遍来说是前段的业务服务器,例如:web服务。
指定NFS客户端之地的配置详细说明
客户端地址 |
具体地址 |
说明 |
授权单一客户端访问NFS |
10.0.0.30 |
一般强开下,生产环境中此配置不多。 |
授权整个网段可访问NFS |
10.0.0.0/24 |
其中的24等同于255.255.255.0,指定网段为生产环境中最常见的配置。配置简单,维护方便。 |
授权整个网段可访问NFS |
10.0.0.* |
指定网段的另外写法(不推荐使用)。 |
授权某个域名客户端访问 |
nfs.oldboyedu.con |
此方法生产环境中一般情况不常用 |
授权整个域名客户端访问 |
*.oldboyedu.com |
此方法生产环境中一般情况不常用 |
提示:NFS默认配置文件/etc/exports其实是存在的,但是没有内容,需要自行配置。
NFS配置权限设置常用参数说明
参数名称 |
参数用途 |
rw |
read-write,表示可读写权限 |
ro |
read-only,表示只读权限 |
sync |
请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。 优点:数据安全不会丢。缺点:性能比不启动该参数差 |
async |
写入时数据会先写到内存缓冲区,直到硬盘有空档才会写入磁盘,这样可以提升写如下效率!风险:若服务器宕机或不正常关机,会损失缓冲区中未写入磁盘的数据(解决办法:服务器主板电池或加UPS不间断电源) |
no_root_squash |
访问NFS Server共享目录的用户如果是root的话,它对该共享目录具有root权限。这个配置原本是为无盘客户端准备的。用户应避免使用 |
all_squash |
不管访问NFS Server共享目录的身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账号身份。在早期多个NFS客户端同时写入NFS Server数据时,这个参数很有用。 |
root_squash |
如果访问NFS Server共享目录的用户如果是root,则它的权限将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账号身份。 |
anonuid |
参数以anon*开头即指anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然也可以自行这个UID值。但是UID必须存在于/etc/passwd中。在多NFS Clients时,如多台web server共享一个NFS目录,通过这个参数可以使得不同的NFS Clients写入的数据对有所NFSClients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用,一般默认即可。 |
anongid |
同anonuid,区别就是把uid(用户id)换成gid(组id)。 |
在生产中配置NFS的重要技巧:
1)确保所有客户端服务器对NFS共享目录具有相同的用户访问权限。
a.all_squash把所有客户端都压缩成固定的匿名用户(UID相同)。
b.就是anonuid,anongie指定的UID和GID的用户
2)所有的客户端和服务端都需要一个相同的UID和GID的用户,即nfsnobody(UID必须相同)
NFS常用路径 |
说明 |
/etc/exports |
NFS服务主配置文件,配置NFS具体共享服务的地点,默认内容诶空。以行为单位。 [root@nfs01 ~]# cat /etc/export #data shared by wangtian at 20160424 /data 172.16.1.0/21(rw,sync) |
/usr/sbin/exportfs |
NFS服务的管理命令。例如:可以加载NFS配置生效,还可以直接配置NFS共享目录,即无需配置/etc/exports实现共享。[root@nfs01 ~]#exportfs -rv加载配置生效,等价优雅重启(平滑重启)/etc/init.d/nfs reload |
/usr/sbin/showmount |
常用来在客户端,查看NFS配置及挂载结果的命令show mount information for an NFS server配置nfsserver,分别在服务端及客户端查看挂载情况。 |
/var/lib/nfs/etab |
NFS配置文件的完整参数设定的文件(有很多没有配置但是默认就有的NFS参数)/var/lib/nfs/etab maset table of exports |
/var/lib/nfs/xtab |
适合C5.x记录曾经挂载过NFS客户端的信息,包括IP地址等,CentOS6.6没有此文件了。 |
/proc/mounts |
客户端挂载参数[root@nfs01 ~]#grep mnt/proc/mounts |
/var/lib/nfs/rmtab |
客户端访问服务器exports的信息列表 |
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.9G 1.5G 5.1G 23% /
tmpfs 242M 0 242M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
172.16.1.31:/data 6.9G 1.5G 5.0G 23% /mnt
当服务端挂掉的时候,客户端df -h 会失效,此时就要使用mount查看挂载信息
q NFS服务的访问原理流程(会口述)*****
q NFS作为集群共享存储角色的搭建、部署。
q NFS作为集群共享角色的排障,高级优化(会口述)*****
q mount命令的知识及参数,如-o(noatime,nodirtime,noexec,nosuid,nodec,rsize,wsize)等。
q fstab文件的知识。
q 常用命令showmount,exportfs,umount(-lf),rpcinfo,
q NFS的优缺点,适合的应用场景*****
q 替代产品(Moosefs(mfs)、GlusterFS、FastDFS)*****。
q 了解autofs