20~21.NFS网络文件系统
unit 20 中小型网站搭建之NFS网络文件系统
1.NFS网络文件系统简介
NFS--文件系统(装修的方格)--怎么来存放文件。
磁盘-raid-分区-格式化(文件系统)-挂载使用。
NFS(network file system)网络文件系统,主要功能是:通过网络(一般是局域网)让不同的主机系统之间可以共享文件或者目录。
NFS客户端(一般为应用服务器eg:web)可以通过挂载(mount)的方式将NFS服务器共享的数据目录挂载到NFS客户端本地系统中(某个挂载点)。从客户端来看,NFS服务器端共享的目录就好像客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
NFS网络文件系统很像windows系统的网络共享、安全功能、网络驱动器映射,这也和linux系统里的samba服务类似。不过一般情况下:
windows网络共享服务或samba服务用于办公局域网共享;
而互联网中小型网站集群架构后端常用NFS进行数据共享;
大型互联网公司可能会用到更复杂的分布式文件系统,eg:Moosefs(mfs),GlusterFS,FastDFS。
2.





3.NFS服务端部署
安装软件:
[root@nfs01 ~]# yum install -y nfs-utils rpcbind
[root@nfs01 ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-13.el6_9.1.x86_64
nfs-utils-1.2.3-75.el6_9.x86_64
nfs-utils:nfs主程序,包括rpc.nfsd,rpc.mountd这两个deamon和相关文档说明,以及执行命令文件等。
rpcbind:centos6.x下的RPC的主程序,NFS可视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的对应工作,这个映射工作就由rpcbind服务来完成的。因此在提供NFS服务之前必须先启动rpcbind服务才行。
开启rpcbind服务:
[root@nfs01 ~]# /etc/init.d/rpcbind start
Starting rpcbind: [ OK ]
查询中介的注册信息:
[root@nfs01 ~]# rpcinfo -p
[root@nfs01 ~]# rpcinfo -p 10.0.0.31
[root@nfs01 ~]# rpcinfo -p localhost
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
[root@nfs01 ~]# /etc/init.d/nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
[root@nfs01 ~]# rpcinfo -p 10.0.0.31
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 23975 mountd
100005 1 tcp 7844 mountd
100005 2 udp 13828 mountd
100005 2 tcp 12401 mountd
100005 3 udp 33035 mountd
100005 3 tcp 46750 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 21778 nlockmgr
100021 3 udp 21778 nlockmgr
100021 4 udp 21778 nlockmgr
100021 1 tcp 13210 nlockmgr
100021 3 tcp 13210 nlockmgr
100021 4 tcp 13210 nlockmgr
设置开机自动启动:
[root@nfs01 ~]# chkconfig rpcbind on
[root@nfs01 ~]# chkconfig nfs on
[root@nfs01 ~]# grep '# chkconfig:' /etc/init.
init.conf init.d/
[root@nfs01 ~]# grep '# chkconfig:' /etc/init.d/{nfs,rpcbind}
/etc/init.d/nfs:# chkconfig: - 30 60
/etc/init.d/rpcbind:# chkconfig: 2345 13 87
[root@nfs01 ~]# chkconfig |egrep "nfs|rpcbind"
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
nfs-rdma 0:off 1:off 2:off 3:off 4:off 5:off 6:off
nfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
NFS服务端常见进程介绍:
[root@nfs01 ~]# ps -ef|egrep "nfs|rpc"
rpc 1936 1 0 11:11 ? 00:00:00 rpcbind
root 1976 2 0 11:14 ? 00:00:00 [rpciod/0]
root 1985 1 0 11:14 ? 00:00:00 rpc.rquotad
root 1990 1 0 11:14 ? 00:00:00 rpc.mountd
root 1997 2 0 11:14 ? 00:00:00 [nfsd4]
root 1998 2 0 11:14 ? 00:00:00 [nfsd4_callbacks]
root 1999 2 0 11:14 ? 00:00:00 [nfsd]
root 2000 2 0 11:14 ? 00:00:00 [nfsd]
root 2001 2 0 11:14 ? 00:00:00 [nfsd]
root 2002 2 0 11:14 ? 00:00:00 [nfsd]
root 2003 2 0 11:14 ? 00:00:00 [nfsd]
root 2004 2 0 11:14 ? 00:00:00 [nfsd]
root 2005 2 0 11:14 ? 00:00:00 [nfsd]
root 2006 2 0 11:14 ? 00:00:00 [nfsd]
root 2037 1 0 11:14 ? 00:00:00 rpc.idmapd
root 2057 1232 0 11:20 pts/0 00:00:00 egrep nfs|rpc
说明:
nfsd(rpc.nfsd)主要功能是管理NFS客户端是否能够登入NFS服务器主机,其中包括登入者的ID判断等。
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.idmapd名字映射后台进程。
NFS服务端共享服务并挂载测试
创建对应目录并授权:
[root@nfs01 ~]# mkdir -p /data
[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data/
配置nfs服务,分享/data目录:
[root@nfs01 ~]# cat /etc/exports
#share /data to 172.16.1.0/24
/data 172.16.1.0/24(rw,sync)
[root@nfs01 ~]# /etc/init.d/nfs reload //重新加载NFS配置生效,优雅重启。
[root@nfs01 ~]# exportfs -rv //加载配置生效,一样的!
exporting 172.16.1.0/24:/data
查看中介状态和详细访问信息:
[root@nfs01 ~]# rpcinfo -p 172.16.1.31
......
[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
测试:
将nfs服务器共享的目录挂载到nfs01
[root@nfs01 ~]# mount -t nfs 172.16.1.31:/data/ /mnt/
[root@nfs01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 931M 0 931M 0% /dev/shm
/dev/sda1 190M 40M 141M 22% /boot
172.16.1.31:/data/ 8.8G 1.5G 6.9G 18% /mnt
[root@nfs01 ~]# touch /mnt/test.txt
[root@nfs01 ~]# ll /mnt/test.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Jan 29 12:08 /mnt/test.txt
[root@nfs01 ~]# ll /data/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Jan 29 12:08 test.txt
NFS客户端挂载实践
[root@backup ~]# yum install -y nfs-utils rpcbind
[root@backup ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-13.el6_9.1.x86_64
nfs-utils-1.2.3-75.el6_9.x86_64
[root@backup ~]# /etc/init.d/rpcbind start
Starting rpcbind: [ OK ]
[root@backup ~]# chkconfig rpcbind on
[root@backup ~]# chkconfig nfs off
[root@backup ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
[root@backup ~]# mkdir -p /upload
[root@backup ~]# mount -t nfs 172.16.1.31:/data /upload/
[root@backup ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.6G 6.9G 19% /
tmpfs 931M 0 931M 0% /dev/shm
/dev/sda1 190M 40M 141M 22% /boot
172.16.1.31:/data 8.8G 1.5G 6.9G 18% /upload
[root@backup ~]# ll /upload/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Jan 29 12:08 test.txt
[root@backup ~]# touch /upload/upload.txt
[root@backup ~]# ll /upload/upload.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Jan 29 12:19 /upload/upload.txt
[root@nfs01 ~]# ll /data/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Jan 29 12:08 test.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Jan 29 12:19 upload.txt
永久生效配置:
[root@backup ~]# tail -1 /etc/rc.local
/bin/mount -t nfs 172.16.1.31:/data /upload/
4.NFS服务部署常见故障:
注意:重启了rpcbind服务后必须restart重启nfs服务!
排查故障=>ssh连接或服务器无法上网排查步骤:
1、前提:NFS原理及部署过程
2、先在客户的排查
ping server_ip
telnet server_ip 111 #端口是否通,是否提供服务
3.showmount -e server_ip #rpcinfo -p server_ip
mount
根据部署流程:挖坑。
[root@nfs01 ~]# man exports
NFS权限参数集:对授权的NFS客户端的访问权限设置
a.nfs共享权限--nfs配置的/etc/exports 例如:/data 172.16.1.0/24(rw)
b.本地文件系统权限--挂载目录的权限
例如:
[root@nfs01 ~]# ll -d /data/
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Jan 29 12:19 /data/
NFS /etc/exports配置案例:
(1)/data 172.16.1.0/24(rw,sync) //允许客户端读写,并且数据同步写到服务端的磁盘。
(2)/www/blog 10.0.0.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000) //适合多客户端共享一个NFS服务单目录。
(3)/home/oldboy 10.0.0.0/24(ro) //共享只读
NFS /etc/exports配置参数说明与用户映射介绍:
ro:只读权限
rw:读写权限
sync:(同步,实时)请求或写入数据时,数据同步写入到NFS Server的硬盘中。
优点是数据安全不丢失;缺点是性能比不启用该参数要差。
async:(异步)写入时数据会先写到内存缓冲区,直到硬盘有空档才会写入硬盘。
优点是这样可以提升写入效率。支持更大的并发;缺点是若服务器发生异常时,会损失缓冲区中未写入磁盘的数据(解决办法:服务器主板电池加UPS、AB(双路电源)不间断电源)。
no_root_squash:保持root用户不压缩。不推荐!
root_squash:如果访问NFS Server共享目录的用户是root,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份。
all_squash:不管访问NFS Server共享目录的用户身份如何,它的权限都会被压缩成匿名用户(nfsnobody),同时它的UID和GID都会变成nfsnobody账号身份。推荐!
若要指定身份:www 888 888 <=====>all_squash,anonuid=888,anongid=888 www 888 888 /data2
配置技巧:
(1)确保所有客户端服务器对NFS共享目录具备相同的用户访问权限
a.all_squash把所有的客户端都压缩成固定的匿名用户(UID相同);
b.就是anonuid,anongid指定的UID,GID的用户。
(2)所有的客户端和服务器(所有服务器上面)都需要有一个相同的UID和GID的用户,即nfsnobody(UID必须相同)
NFS相关文件和命令
[root@nfs01 ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
常用来在客户端或服务器端查看NFS配置及挂载结果的命令:
[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
NFS服务端信息:
[root@nfs01 ~]# cat /etc/exports //
#share /data to 172.16.1.0/24
/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客户端挂载参数:
[root@backup ~]# grep upload /proc/mounts
172.16.1.31:/data/ /upload nfs4 rw,relatime,vers=4,rsize=262144,wsize=262144,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客户端挂载参数及优化命令
以上
[root@nfs01 ~]# man nfs
[root@backup ~]# grep upload /proc/mounts
172.16.1.31:/data/ /upload nfs4 rw,relatime,vers=4,rsize=262144,wsize=262144,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
[root@backup ~]# umount /upload/ //卸载
[root@backup ~]# umount -lf /upload/ //强制卸载
[root@backup ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.6G 6.9G 19% /
tmpfs 931M 0 931M 0% /dev/shm
/dev/sda1 190M 40M 141M 22% /boot
优化重置:
[root@backup ~]# mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,rsize=131072,wsize=131072 172.16.1.31:/data/ /upload
[root@backup ~]# grep upload /proc/mounts
172.16.1.31:/data/ /upload nfs4 rw,nosuid,nodev,noexec,noatime,nodiratime,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
[root@backup ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.6G 6.9G 19% /
tmpfs 931M 0 931M 0% /dev/shm
/dev/sda1 190M 40M 141M 22% /boot
172.16.1.31:/data/ 8.8G 1.5G 6.9G 18% /upload
NFS内核优化建议:
作用:有助于NFS加快传输数据。
企业生产场景NFS共享存储优化小结:
a.硬件: sas/ssd磁盘,买多块,硬件raid,制作raid5(安全,读ok)或 raid I0。网卡吞吐量要大,至少千兆(多块bond)
b.NFS服务器端配置: /data10.0.0.024(rw,sync,all squash,anonuid=65534 anongid=65534)
c.NFS客户端挂载优化配置命令:
mount-t nfs -o nosuid,noexec,nodev,noatime,nodiratime,rsize=131072,wsize=131072 10.0.0.7:/data/ /mnt←兼顾安全和性能
c.对NFS服务的所有服务器内核进行优化时,执行如下命令:
cat >>/etc/sysctl.conf <<EOF
net.core.wmem_default=8388608
net.core.rmem_default=8388608
net.core.wmem_max=16777216
net.core.rmem_max=16777216
EOF
sysctl -p
//在两端都可以设置优化。
[root@nfs01 ~]# tail -5 /etc/sysctl.conf
#nfs 内核优化
net.core.wmem_default=8388608 //指定发送套接字缓冲区大小的默认值(字节为单位)
net.core.rmem_default=8388608 //指定接收套接字缓冲区大小的默认值(字节为单位)
net.core.wmem_max=16777216 //指定发送套接字缓冲区大小的最大值(字节为单位)
net.core.rmem_max=16777216 //指定发送套接字缓冲区大小的最大值(字节为单位)
[root@backup ~]# ll /proc/sys/net/core/?mem*
-rw-r--r-- 1 root root 0 Jan 29 17:27 /proc/sys/net/core/rmem_default
-rw-r--r-- 1 root root 0 Jan 29 17:27 /proc/sys/net/core/rmem_max
-rw-r--r-- 1 root root 0 Jan 29 17:27 /proc/sys/net/core/wmem_default
-rw-r--r-- 1 root root 0 Jan 29 17:27 /proc/sys/net/core/wmem_max
大型网站NFS网络文件系统的替代软件为 分布式文件系统(Moosefs(mfs))、GlusterFS(大文件)、FastDFS。
5.NFS客户端开机自启动挂载故障案例1:
法一:可以!
[root@backup ~]# tail -1 /etc/rc.local
/bin/mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,rsize=131072,wsize=131072 172.16.1.31:/data/ /upload
法二:默认行不通的!
[root@backup ~]# cat /etc/fstab
若将客户端挂载命令放在/etc/fstab里面开机时执行会卡住!
因为系统先读取/etc/fstab 自动挂载列表,然后启动network服务。
而nfs是需要网络支持的,必须先启动网络服务。
[root@backup ~]# chkconfig |grep netfs
netfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off
执意要法二,则需要让netfs服务开机自启动就可以继续使用fstab开机自动挂载nfs。
NFS客户端开机自启动挂载故障案例2:
/etc/fstab修改错误导致系统无法启动故障修复案例:
[root@backup ~]# grep sda3 /proc/mounts
/dev/sda3 / ext4 rw,relatime,barrier=1,data=ordered 0 0
故障情景再现:


[root@backup ~]# vim /etc/fstab
#UUID=3a3c3bfb-4a8a-44a0-845e-806b27ce5bf4 / ext4 defaults 1 1
UUI-4a8a-44a0-845e-806b27ce5bf4 / ext4 defaults 1 1
UUID=7c854a7c-dae2-431d-a191-c8f20f8b539c /boot ext4 defaults 1 2
UUID=7bca6a4e-7f77-41de-b8d4-153c21b3b283 swap swap defaults 0 0
[root@backup ~]# reboot
/etc/fstab 只读不可改!
维护模式(救援模式):
mount -o remount,rw /
然后修改/etc/fstab
http://blog.sina.com.cn/s/blog_4a2fadfb010131jf.html
linux 文件系统变只读案例同理解决
NFS系统应用的优缺点说明:
NFS服务可以让不同的客户端挂载使用同一个共享目录,也就是将其作为共享存储使用,这样可以保证不同节点客户端数据的一致性,在集群架构环境中经常会用到。如果是 Windows和 Linux混合环境的集群系统,可以用 samba来实现。
优点:
(1)简单,容易上手,容易掌握。
(2)NFS文件系统内数据是在文件系统之上的,即数据是能看得见的。
(3)部署快速,维护简单方便,且可控,满足需求的就是最好的。
(4)可靠,从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的。
(5)服务非常稳定。
局限:
(1)存在单点故障,如果NFS Server宕机了,所有客户端都不能访问共享目录。这个在后期的课程会通过负载均衡及高可用方案弥补。
(2)在大数据高并发的场合,NFS效率、性能有限。(2千万/日以下的PV(page view)的网站不是瓶颈,除非网站架构设计很差)。
(3)客户端认证是基于IP和主机名的,权限要根据ID识别,安全性一般(用于内网则问题不大)。
(4)NFS数据是明文的,NFS本身不对数据完整性作验证。
(5)多台客户器挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。尤其NFS服务端出问题后,所有NFS客户端都处于挂掉状态(测试环境可使用aotufs自动挂载解决,正式环境可修复NFS服务或强制卸载)。
(6)涉及了同步(实时等待)和异步(解耦)的概念,NFS服务器和客户端相对来说就是耦合度有些高。网站程序也是一样,尽量不要耦合度太高,系统及程序架构师的重要职责就是为程序和架构解耦,让网站的扩展性变得更好。
应用建议:
大中小型网站(参考点2000万/日PV以下)线上应用,都有用武之地。门户网站也会有应用,生产场景应该把数据的访问往前推,即尽量把静态存储里的资源通过CDN或缓存服务器提供服务,如果没有缓存服务或者架构不好,存储服务器数量再多也是扛不住压力的,而且用户体验会很差。
浙公网安备 33010602011771号