Centos7学习笔记(十一)- nfs服务器搭建
nfs服务本质上是通过rpc调用提供服务的,所以,其依赖rpcbind程序相关组件运行。而且,rpc服务必须先启动,nfs服务才能正常使用。以下是安装配置:
1、服务端
a)安装软件
yum -y install nfs-utils rpcbind #《=======yum安装nfs-utils和rpcbind软件
b)优先启动rpcbind服务
systemctl start rpcbind
systemctl enable rpcbind
(/etc/rpc文件定义rpc支持的服务)
(/etc/sysconfig/rpcbind是rpcbind自身的配置文件)
c)先检查rpc服务状态
rpcinfo -p 127.0.0.1 #《=========当不加参数时,rpcinfo列出所有信息
d)创建nfs共享目录并授权
mkdir /data -p
chown -R nfsnobody:nfsnobody /data
e)修改nfs配置文件
/etc/exports
exprots文件格式说明:
基本格式——共享目录 远程访问主机(权限) #《======远程访问主机可以是单IP,也可以是带掩码网络段,也可以是域名,见下方官方示例文件内容
# 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)
权限说明:
rw——可读写
ro——只读
sync——同步写入磁盘
rsync——异步写入,先写入buffer
root_squash——将root用户及其所属组都映射为匿名用户or用户组(默认)
no_root-squash——与root_squash相反
all_squash——将远程访问的所有普通用户及所属组都映射为匿名用户或者用户组(nfsnobody)
no_all_squash——与all_squash相反(默认)
secure——将远程访问的发起端口限定于1024以下,这是默认设定
insecure——与securex相反,将端口限定于1024以上
anonuid=xxx——将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户
anongid=xxx——将远程访问的所有用户组都映射为匿名用户组帐号,并指定该匿名用户组账户为本地用户组账户
wdelay—— 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay—— 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide——在NFS共享目录中不共享其子目录
no_hide——共享NFS目录的子目录
subtree_check——如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check——和上面相对,不检查父目录权限
配置完成后,在/var/lib/nfs/etab文件中,可以查看nfs共享的全部设定权限。
f)启动nfs服务
systemctl start nfs
systemctl enable nfs
(生产场景,如果修改了/etc/exports文件增删或修改主机权限,需要用systemctl reload nfs 或者 exportfs -r来重启)
g)检查nfs状况
showmount -e 本机IP
2、客户端
a)安装并启动
yum install -y rpcbind
systemctl start rpcbind
systemctl enable rpcbind
b)创建挂载点目录
mkdir -p /nfsdata
c)挂载服务器共享目录
mount -t nfs xxx.xxx.xxx:/data /nfsdata
(这里会出错,“wrong fs type, bad option, bad superblock”之类,其实是nfs-utils没有安装,所以不支持挂载为nfs类型。解决办法:apt-get install nfs-common或者yum -y install nfs-utils(坑爹,既然客户端不需要nfs服务软件,为何挂载的时候需要安装)
以下是rpc相关进程服务的用途说明:

nfsstat命令显示关于NFS和到内核的远程过程调用(RPC)接口的统计信息,也可以使用该命令重新初始化该信息。如果未给定标志,默认是nfsstat -csnr命令。使用该命令显示每条信息,但不能重新初始化任何信息。
(1)-b:显示NFS V4服务器的其他统计信息。
(2)c:只显示客户机端的NFS和RPC信息,允许用户仅查看客户机数据的报告。nfsstat命令提供关于被客户机发送和拒绝的RPC和NFS调用数目的信息。
要只显示客户机NFS或者RPC信息,将该参数与-n或者-r参数结合。
(3)-d:显示与NFS V4授权相关的信息。
(4)-g:显示RPCSEC_GSS信息。
(5)-m:显示每个NFS文件系统的统计信息,该文件系统和服务器名称、地址、安装标志、当前读和写大小,以及重新传输计数
(6)-n:为客户机和服务器显示NFS信息。要只显示NFS客户机或服务器信息,将该参数与-c和-s参数结合。
(7)-r:显示RPC信息。
(8)-s:显示服务器信息。
(9)-t:显示与NFS标识映射子系统的转换请求相关的统计信息,要只显示NFS客户机或服务器信息,将-c和-s<br />选项结合。
(10)-4:当与-c、-n、-s或-z参数组合使用时,将包含NFS V4客户机或服务器的信息,以及现有的NFS V2和V3数据<br />。
(11)-z:重新初始化统计信息。该参数仅供root用户使用,并且在显示上面的标志后可以和那些标志中的任何一个组合到<br />统计信息的零特殊集合。
要显示关于客户机发送和拒绝的RPC和NFS调用数目的信息,输入:
nfsstat -c
要显示和打印与客户机NFS调用相关的信息,输入如下命令:
nfsstat -cn
要显示和打印客户机和服务器的与RPC调用相关的信息,输入如下命令:
nfsstat -r
要显示关于服务器接收和拒绝的RPC和NFS调用数目的信息,输入如下命令:
nfsstat –s
4、实现开机自动挂载(fstab)
通过fstab方式实现开机自动挂载的话(当然,也可以通过autofs软件的方式实现自动挂载),/etc/fstab内容格式写法如下(跟一般常规挂载写法没什么不同):
server:path /mountpoint fstype option,option,... 0 0 #《==========这仅仅是示例
注意:若想fstab方式成功挂载,系统必须自启动remot-fs.target服务。
关于需要使用的option选项,具体说明如下:
(额外说明一下,由于fstab本质上也是mount命令来实现挂载的,所以,关于mount命令本身支持的一些挂载选项,比如exec、noexec、dev、nodev、user、nouser、realtime、norealtime、suid、nosuid、auto、noauto等,也都支持使用)
a1 、NFS各版本通用参数
soft/hard
【参数说明】软挂载方式挂载系统,若NFS请求超时,则客户端向调用程序返回错误;如果使用硬连接方式则客户端一直重新请求直至成功。默认为hard。
【使用建议】对于关键数据业务,不希望业务由于网络延迟或服务器服务重启或短暂的过载等情况而中断,建议挂载时使用hard参数;对于非关键数据业务,希望客户端程序能尽快响应,可以使用soft参数。
timeo=n
【参数说明】客户端重传请求前等待时间。对于基于TCP的NFS服务,默认等待重传时间为60s。使用TCP协议时,NFS Client不执行任何超时backoff。对于UDP协议,client使用一个合适的算法,为常用的请求类型estimate合适的超时时间。但对不常用的请求类型使用timeo设置。如果timeo没有设置,不常用的请求类型1.1秒以后重试。在每次重发后,NFS Client会将timeout时间加倍,直到最大的60秒。
retrans=n
客户端返回错误前的重传次数。默认为重传3次。retrans与soft参数一起使用时才有效。
【使用建议】timeo、retrans这两个参数选择主要取决于网络性能。对于网络吞吐量小,延时高,抖动高,丢包率大的情况,建议将timeo,retrans两个参数值设置大一些。对于网络吞吐量大,延时低,抖动低,丢包率小的情况,建议将timeo,retrans两个参数值设置小一些。具体设置值因网络状况而定。
resize=n
【参数说明】每个READ命令字向服务器读取文件的最大字节数。实际数据小于或等于此值。resize必须是1024倍数的正整数,小于1024时自动设为4096,大于1048576时自动设为1048576。默认时,服务器和客户端进行协商后设置。
【使用建议】通常使用默认值,由客户端和服务器协商设置。对于拥塞的低速网络,可以将该值调小,向服务器发送较短的请求包来提高NFS性能。对于高速网络,可以将该值增大,减少向服务器发送的请求包,获得性能的提升。
wsize=n
【参数说明】每个WRITE命令字向服务器写入文件的最大字节数。实际数据小于或等于此值。resize必须是1024倍数的正整数,小于1024时自动设为4096,大于1048576时自动设为1048576。默认时,服务器和客户端进行协商后设置。
【使用建议】通常使用默认值,由客户端和服务器协商设置。对于拥塞的低速网络,可以将该值调小,向服务器发送较小的请求包来提高NFS性能。对于高速网络,可以将该值增大,减少向服务器发送的请求包,获得性能的提升。
async/sync
【参数说明】同步、异步挂载,客户端默认异步(async)。对于异步挂载,客户端下发的写数据会先缓存在内存中,达到一定大小或者其他条件(与客户端设置,状态有关),再一起发往服务端。而同步挂载,每次下发的写数据马上发到服务端。
【使用建议】建议用默认的异步挂载,可以提高业务性能。对于客户端应用层来说,完全感知不到数据是否发往服务端,只能感知数据已经写成功。同步挂载要求每个请求立即发到服务端,增加了请求连接、发送次数,对于小io场景性能差异很明显(io越小,差异越大,一般都能达到几倍甚至更大的差异)。
注:对于异步挂载,可能在查看io性能显现为性能波动。在客户端写入缓存期间iops可能就低,因为数据还未发到服务端。但是性能是完全正常的,应该说比同步更好。如果是要要追求界面上的平稳,那就建议改为同步挂载。(补充:追求一次小io的数据全部刷到服务端稳定存储时间小,不仅要求客户端同步挂载,还需要服务端共享也是同步导出,否则需要加上手动commit刷盘——flush)。
acregmin/acregmax
【参数说明】设置NFS客户端缓存普通文件属性的最短时间和最长时间,单位为秒。超过此时间后对其进行更新。默认最短时间是3s,最长时间是60s。
acdirmin/acdirmax
【参数说明】设置NFS客户端缓存目录属性的最短时间和最长时间,单位为秒。超过此时间后对其进行更新。默认最短时间是3s,最长时间是60s。
ac/noac
【参数说明】设置是否缓存文件属性。为了提高性能,NFS客户端缓存文件属性(默认ac),然后每隔一段时间去检查文件属性后更新。在缓存有效期内,客户端不检测服务器上文件属性是否改变。默认为ac。
【使用建议】当服务器上共享文件的属性频繁地被多个客户端改变时,建议使用noac选项,或者使用ac并配合使用较小的acregmin/acregmax/acdirmin/acdirmax设置,这样就能获得较好的属性一致性。当服务器上共享文件的属性不会被频繁改变时,例如文件共享为只读,或者网络性能较好,建议使用默认的ac选项,然后根据实际的网络状况来调整acregmin/acregmax/acdirmin/acdirmax设置。
Actimeo
【参数说明】将acregmin/acregmax/acdirmin/acdirmax四个参数设置为相同时间,单位为秒。
bg/fg
【参数说明】设置挂载失败后的行为方式。默认的fg方式将立刻退出返回错误状态,bg方式是退出前将产生一个子进程在后台继续尝试挂载。
sharecache/nosharecache
【参数说明】设置客户端并发挂载同一文件系统时数据缓存和属性缓存的共享方式。设置为sharecache时,多个挂载共享共享同一缓存。设为nosharecache时,每个挂载各有一个缓存。默认为sharecache。
使用建议:该参数用于客户端多次挂载同一共享目录的情况,建议使用默认的sharecache选项。
resvport/noresvport
【参数说明】设置连接服务器是否使用保密源端口。默认的resvport设置保密端口,noresvport设置为非保密端口。内核2.6.28及以后版本支持。
lookupcache=mode
【参数说明】设置内核管理给定挂载点的目录项缓存方式。其中包括all/none/pos几种方式。客户端缓存LOOKUP命令字请求结果。如果请求的目录项在服务器上,则返回结果为正,否则为负。all的管理方式是在父目录缓存的属性失效前客户端缓存这两种目录项;pos是在父目录缓存的属性失效前客户端缓存结果为正的查询结果,总是重新验证结果为负的查询结果。none总是重新验证目录缓存项。默认为all管理方式,内核2.6.28及以后版本支持。
【使用建议】LOOKUP命令字的作用是将文件名转换文件句柄。对于多个客户端经常创建或删除文件的情况,建议使用none。其它情况选用all或者pos。
intr/nointr
【参数说明】设置是否允许信号中断挂载点的文件操作。如果指定intr,当NFS操作被信号中断时系统返回EINTR。指定nointr,信号不会中断NFS文件操作。默认为nointr。指定intr时,通常同时使用soft选项,防止数据损坏。内核2.6.25及以后不再支持。
cto/nocto
【参数说明】设置是否使用“关闭打开”缓存一致的特性。通常客户端打开文件时检查是否存在以及是否有权限,当关闭文件时刷新更改。当设置为nocto时,客户端使用非标准的试探来检查服务器上文件是否改变,对于只读和文件更改较少时情形有助于提高性能。
【使用建议】对于文件内容改变很少的情况,如服务器提供只读共享权限(文件系统以RO权限导出)给客户使用,建议使用nocto选项,这样可以提高性能。对于文件内容经常改变,客户端对文件缓存一致性要求较高,建议使用cto参数。
a2 、对NFS(NFS2/NFS3)有效的选项
proto=transport
【参数说明】客户端向服务器发起传输请求使用的协议,可以为UDP或者TCP。未指定时,mount命令选择服务器支持的协议。
tcp/udp
【参数说明】等价于proto=tcp和proto=udp选项。
【使用建议】在不稳定的复杂网络环境中建议使用tcp参数,在稳定的网络下可以使用udp参数。NFSv3/NFSv4支持tcp/udp,NFSv2只支持udp。
port=n
【参数说明】指定服务器NFS服务端口。如果NFS服务端口不在port上,则mount请求失败。未指定或设为0,mount命令根据服务器的rpcbind服务选择服务端口。
mountport=n
【参数说明】指定服务器上mountd的端口。如果mountd服务端口不在port上,则mount请求失败。未指定或设为0,mount命令根据服务器的rpcbind服务选择服务端口。该参数用于即使防火墙屏蔽rpcbind协议也能正常mount到服务器。
mountproto=transport
【参数说明】客户端向服务器发起MNT请求时和UMNT使用的协议,可以为udp或者tcp。该参数用于防火墙屏蔽特定的协议也能正常mount到服务器。
mounthost=name
【参数说明】设置开启mountd主机名。未指定时,mount命令认为mountd服务和NFS服务在同一主机上。
mountvers=n
【参数说明】设置连接服务器mountd时的RPC版本号。未指定时使用与请求的NFS版本相适应的版本号。该参数用于多个NFS服务运行于同一远程主机上。
namlen=n
【参数说明】设置挂载路径名的最大长度。未指定时,通过与服务器协商设定。大多数情况为255字节。
nfsvers/vers=n
【参数说明】设置使用NFS服务的NFS协议版本号。当文件系统为nfs时,Linux客户端支持NFS2和NFS3。如果不支持请求的版本,mount失败。未指定时,客户端先尝试使用NFS3,若失败再与服务器进行协商。
lock/nolock
【参数说明】选择是否使用NLM协议在服务器上锁文件。当选择nolock选项时,锁对于同一主机的应用有效,对不同主机不受锁的影响。默认为lock。
acl/noacl
【参数说明】设置是否在挂载时使用NFSACL协议。NFSACL协议不属于标准NFS协议,而是Solaris上的实现。未指定时,客户端与服务器协商检查服务器是否支持,如果支持则使用NFSACL。
rdirplus/nordirplus
【参数说明】设置是否使用NFS3的REAADDIRPLUS请求。默认为readdirplus。
a3、 对NFS4有效的选项:
proto=transpro
【参数说明】客户端向服务器发起传输请求使用的协议,可以为UDP或者TCP。未指定时,选用TCP。
port=n
【参数说明】指定服务器NFS服务端口。如果NFS服务端口不在port上,则mount请求失败。未指定时,客户端使用NFS标准的2049号端口。指定为0时,客户端选用服务器rpcbind服务支持的端口。
clientaddr=n.n.n.n
【参数说明】指定一个IPv4的主机地址使服务器能执行NFS4的回调请求。未指定时,mount命令尝试自己发现一个合适的回调地址。
——注1:所有的参数说明都可以在linux系统用man nfs参看含义,对于有差异的客户端,请用此确认。
——注2:为了描述简单明了,可能转义有差异,具体参见系统标准描述。
——注3:没有“使用建议”的参数推荐使用默认参数。
5、针对匿名挂载用户一致性的优化
1)设定统一的匿名用户名,比如均是为http服务共享的,那么统一设定为用户www,并指定其uid。
在服务端和客户端,均执行
useradd -u 111 www -s /sbin/nologin -M
2)修改/etc/exports文件
权限处,要增加“all_squash,anonuid=111,anongid=111”
3)修改原本共享的目录/data的权限(原本赋给nfsnobody)
chown -R www:www /data
4)systemctl reload nfs
5)客户端remount
mount -o remount -t nfs xxx.xxx.xxx:/data /nfsdata #《============这里的挂载点/nfsdata目录,对于apache之类,一般都对应 /var/www/html之类的目录。
6)修改apache之类的软件以www用户启用并restart软件。
6、生产场景mount的优化
主要是针对mount选项的选择,要根据实际具体的情况,选择不同的参数选项。
比如仅做读取挂载的nfs共享,可以选择 “nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072”选项。
7、nfs优缺点
优点:
简单、容易配置;
nfs文件系统内数据是在文件系统之上的,数据是可见的。
部署快速,维护简单方便,且可控,满足一定量的并发访问。
可靠,从软件层面上讲,数据可靠性高,经久耐用。
服务稳定。
缺点:
存在单点故障。如果nfs服务器宕机,所有客户端不能访问目录。(可通过负载均衡及高可用弥补)
在大数据高并发场合,NFS效率、性能有限。
客户端认证是基于IP和主机名的,权限要根据ID识别,安全性一般(由于多用于内网,问题不是很大)
NFS数据是明文的,NFS本身不对数据完整性验证。
多台客户机挂载一个服务器时,连接管理维护麻烦(耦合度高)
由于涉及同步和异步等概念,服务器和客户端耦合度有些高,扩展性一般。
解决NFS性能的几个方式:
使用CDN加速以及在web前段再架构web缓存服务器,尽可能分流访问流量,减轻nfs读写压力。
把不同目录的挂载,放置于多台nfs服务器上,让访问带来的读写压力,由不同服务器分摊。
弃用nfs——其本质上是将nfs的读写分离。读,不再从nfs读,写数据,可写入nfs。将nfs数据实时同步大硬盘空间的web服务器上,实现读数据在web端。
采用分布式文件系统。
8、nfs使用的自身优化
硬件:尽可能采用高转速高缓存sas盘甚至高速大容量SSD盘,并做硬件raid,尽量做raid5、raid10以上级别。如可能,网卡采用万兆网卡,如是千兆网卡,需做bond。
nfs服务端配置的优化:做好all_squash,anonuid,anongid在exports中的设置,做好匿名用户访问一致性优化
nfs挂载的优化,根据实际应用场景,测试优选mount参数选项。
对所有服务器端和客户端,做好内核net.core.rmem_default、net.core.wmem_default、net.core.rmem_max、net.core.wmem_max四个参数的优化设置。
9、nfs真实全挂载参数查询
分区或文件系统在系统中的全部挂载参数,可以在/proc/mounts文件中查询
172.16.1.31:/nfsdata /mnt/nfsdata nfs4 rw,nosuid,nodev,noexec,noatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,soft,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.7,local_lock=none,addr=172.16.1.31 0 0

