企业级NFS网络文件共享服务
1、NFS介绍
什么是NFS?
NFS是network file system的缩写,中文意思是网络文件系统。它的主要功能是通过网络(一般是局域网) 让不同的主机系统之间可以共享文件或者目录。NFS客户端(一般为应用服务器,例如web)可以通过挂载的方式将nfs服务器共享的数据目录挂载到nfs客户端本地系统中(就是某一个挂载点下)。从nfs客户端的的机器本地看,nfs服务器端共享的文件目录就像客户端自己的磁盘分区或者目录一样,而实际是远端nfs服务器的目录。
Nfs网络文件系统就像windows系统的网络共享、安全功能、网络驱动器映射,这也和linux系统里的samaba服务类似。只不过一把情况下,windows网络共享服务或者samba服务用语局域网共享,互联网中小型网站集群架构后端常用NFS作为数据共享,入大型网站还可能用到更复杂的分布式文件系统(moosefs(mfs)),glusterfs,fastdfs。网络文件服务器,给网络所有服务器提供文件共享服务。在web1上访问/mnt文件目录,相当于访问nfs服务器的/data.
2、NFS在企业中的应用场景
在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件静态资源文件,一般是把网站用户上传的文件都放在NFS共享里,例如bbs产品的图片、附件、头像,注意bbs网站程序不要放在NFS共享里,然后前端所有的节点访问这些静态资源时都会读取到NFS存储上的资源。
发博文文字东西存放数据库,用户上传的图片视频之类的存放在nfs共享服务器中。
NFS的历史介绍
第一个网络文件系统被称为FILEJ ACCESS listener, 由DIGITAL enquipment corporation(DEC)1976年开发。Nfs是第一个构建于ip协议上的现代网络文件系统。
Nfs系统已经成功历尽30年的发展。它代表了一个非常稳定的(可移植)网络文件系统,它具备可扩展、高性能等特性并达到企业级应用质量标准,由于网络速度的增加,延迟降低,NFS系统一直是通过网络提供文件系统服务的有竞争力的选择,特别是中小互联网企业,应用十分广泛。
Nfs在企业中应用场景
在企业集群架构的工作场景中,nfs网络文件系统一般用来存储共享视频、图片、附件等静态资源,一般是把网站用户上传的文件都放在nfs共享里,例如;BBS产品的图片、附件、头像,注意网站BBS程序不要放NFS共享里,然后前端所有节点访问这些静态资源都会读取NFS存储上的资源。NFS是当前互联网系统架构中最常用的存储服务之一,特别是中小型网站公司应用频率更高。大公司或门户除了用NFS外,还可能会使用更复杂的分布式文件系统(mfs),glusterfs,fastdfs等。
图中后面虚线框里就是NFS系统工作的位置,NFS作为所有前端WEB服务的共享存储,存储的内容一般有网站用户上传的图片、附件、头像等,注意网站的程序代码不要放在NFS共享里,网站程序是人工发布的,不存在延迟问题,直接批量发布到web节点提供访问,这样效率更高。
企业生产集群为什么需要共享存储角色
这里通过图解给大家展示集群架构需要共享存储服务的理由。例如:A用户传图片到web1服务器,然后让B用户访问这张照片,结果B用户的请求分发到web2因为web2上没有这张照片,结果无法查看到A用户传的图片,如果此时有一个共享存储,A用户上传的照片无论分发到web1还是web2,最终都存到共享存储上,此时,b用户访问图片时,无论分发到web1或者web2,最终都存储到共享存储上,此时b用户访问到资源了。这个共享存储的位置可以通过开源软件和商业硬件实现,互联网中小型集群架构会用普通pc服务器和nfs文件系统实现。
当集群中没有NFS共享存储,用户访问图片的情况:
提示:中小型互联网企业一般不会卖家硬件存储,因为太贵,大公司如果业务发展很快的话,可能会临时买硬件存储顶一下网站的压力,当网站并发继续加大后,硬件存储扩展就相对费劲了,且价格成几何级数增加。例如:淘宝网就替换掉了很多硬件设备集群软件,用lvs+haproxy替换了netscaler负载均衡设备,用fastDFS,TFS配合pc服务器替换了netapp、emc商业存储,去IOE正在成为互联网公司的主流。
NFS系统原理
当我们在NFS服务器端设置好一个共享目录/video后,其他的有NFS服务器端的客户端可以将这个共享目录/video,挂载到客户端本地某个挂载点,挂载点就是一个目录,这个挂载点目录可以自己随意指定,上图中的两个NFS客户端挂载点分别为/v/video和/video,不同客户端的挂载点可以不相同。
使用我们的nfs肯定用到ip地址和端口号,测试而知NFS在数据传输时使用的端口随机选择。Nfs客户端怎么知道nfs服务端使用哪个端口呢?
答案:通过RPC(中文意思远程过程调用,英文remote precede call)通过这个rpc服务的应用在门户级的网站很多。什么是rpc?
NFS工作原理流程
再次强调:NFS的rpc服务在centos5.x下名称成为protmap,在centos6.x下名称为rpcbind
NFS服务端部署环境准备
服务器系统 角色 ip
Centos6.6x86_64 NFS服务端(nfs-server) 10.0.0.5
Centos6.6x86_64 NFS客户端(nfs-client1) 10.0.0.6
Centos6.6x86_64 NFS客户端(nfs-client2) 10.0.0.7
查看系统及内核版本信息
cat /etc/redhat-release
uname -r uname -m
Centos6.6默认没有安装NFS软件包,此时我们可以使用yum install nfs-utils rpcbind -y 命令来安装nfs软件
#yum install nfs-utils rpcbind -y
#rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-11.el6.x86_64
nfs-utils-1.2.3-54.el6.x86_64
出现上述两个软件包,表示NFS服务端软件安装完毕,最好在客户端都安装nfs和rpc包,客户端不配置nfs服务就可以。
NFS3种安装方法
方法1: yum install nfs-utils rpcbind -y
方法2:通过系统光盘里的rpm包安装,命令如下:rpm -ivh nfs-utils-1.2.3-36.el6.x86_64.rpm
方法3: LANG=en
yum grouplist|grep -i nfs
yum groupinstall “NFS file server” -y
启动NFS相关服务
启动rpcbind服务
因为NFS及辅助程序都是基于rpc协议的,所以首先要确保系统中运行了rpcbind服务,相关启动操作如下:
#/etc/init.d/rpcbind start
查看运行情况
#/etc/init.d/rpcbind status
已知某个端口号,查看服务名,或者已知服务名查看端口号的方法
[root@nfsserver ~]# lsof -i :111
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 1420 rpc 6u IPv4 10826 0t0 UDP :sunrpc
rpcbind 1420 rpc 8u IPv4 10829 0t0 TCP :sunrpc (LISTEN)
rpcbind 1420 rpc 9u IPv6 10831 0t0 UDP :sunrpc
rpcbind 1420 rpc 11u IPv6 10834 0t0 TCP :sunrpc (LISTEN)
[root@nfsserver ~]# netstat -lntup|grep rpcbind
tcp 0 0 0.0.0.0:111 0.0.0.0: LISTEN 1420/rpcbind
tcp 0 0 :::111 ::: LISTEN 1420/rpcbind
udp 0 0 0.0.0.0:747 0.0.0.0: 1420/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0: 1420/rpcbind
udp 0 0 :::747 ::: 1420/rpcbind
udp 0 0 :::111 ::: 1420/rpcbind
[root@nfsserver ~]# chkconfig --list rpcbind
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
查看nfs状态和启动nfs,主端口2049
[root@nfsserver ~]# /etc/init.d/nfs status
rpc.svcgssd is stopped
rpc.mountd is stopped
nfsd is stopped
rpc.rquotad is stopped
[root@nfsserver ~]# /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@nfsserver ~]# netstat -lntup|grep 2049
tcp 0 0 0.0.0.0:2049 0.0.0.0: LISTEN -
tcp 0 0 :::2049 ::: LISTEN -
udp 0 0 0.0.0.0:2049 0.0.0.0: -
udp 0 0 :::2049 ::: -
我们要求rpcbind服务要先启动于nfs,怎么保证这个顺序?
#less /etc/init.d/rpcbind
#! /bin/sh
#
rpcbind Start/Stop RPCbind
#
chkconfig: 2345 13 87
........
13表示启动的顺序,87表示结束的顺序,和nfs对比下就知道了。
在日常企业管理中我们不用chkconfig来管理软件的启动,就是不会把服务做成chkconfig管理,统一将启动命令放到rc.local,把这个文件作为服务器的档案。这样的好处是,一旦管理服务器人员离职,或者业务迁移时都可以通过/etc/rc.local很容易看到服务器的相关服务
NFS服务常见进程详细说明
从上面NFS服务启动过程的提示,可以看出NFS服务默认需要启动,服务进程至少有:NFS quotas(rpc.rquotad)、NFS daemon(nfsd)、NFS mountd(rpc.mount)可以通过执行如下命令查看启动NFS后,系统中运行的NFS相关进程。
#ps -ef|egrep “rpc|nfs”
如何知道进程的意思呢?#man 进程名
实战配置NFS服务端
Nfs服务端的默认配置文件路径为:/etc/exports,并且默认是空的
[root@nfsserver ~]# ls -l /etc/exports
-rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports
[root@nfsserver ~]# cat /etc/exports
[root@nfsserver ~]#
Nfs默认配置文件是存在的,但是默认是没有内容的,需要重新配置,有些linux版本可能不提供/etc/exports配置文件,这是就需要手动创建。
Exports配置文件的格式
NFS共享目录 NFS 客户端地址(参1,参2.....)客户端地址2(参1,参2......)
Nfs 共享目录 NFS客户端地址(参1,参2......)
查看例子#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)
The first line exports the entire filesystem to machines master and
trusty. In addition to write access, all uid squashing is turned off
for host trusty. The second and third entry show examples
其中上述参数的含义如下:
1、nfs共享的目录为:nfs服务端要共享的实际目录,要用绝对路径,注意共享目录的本地权限,如果需要读写共享,一定要让本地目录被用户读写。
常用配置格式说明 要共享的目录 客户端ip或ip段(参1,参2)
指定客户端地址配置说明:
授权单一客户端访问NFS 具体地址10.0.0.30
授权整个网段可访问NFS 10.0.0.0/24其中的24等同于255。255.255.0此配置为生产中最常见的配置
授权整个网段可访问NFS 10.0.0.* 指定网段的另外写法
实例共享/data目录给192.168.154整个网段的主机读写即实现将nfs server上的/data目录共享给192.168.154整个网段主机可读写。
[root@nfsserver ~]# cat /etc/exports
/data 192.168.154(rw,sync)
[root@nfsserver ~]# mkdir /data
[root@nfsserver ~]# /etc/init.d/nfs reload
[root@nfsserver ~]# exportfs -rv
最后两条命令等价,平滑重启nfs效果一样。
[root@nfsserver ~]# showmount -e 127.0.0.1
Export list for 127.0.0.1:
/data 192.168.154
把自己作为客户端查看下挂载情况
[root@nfsserver ~]# mount -t nfs 192.168.154.136:/data /mnt
[root@nfsserver ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_nfsserver-lv_root
18G 3.4G 13G 21% /
tmpfs 491M 76K 491M 1% /dev/shm
/dev/sda1 477M 29M 424M 7% /boot
/dev/sr0 4.4G 4.4G 0 100% /media/CentOS_6.6_Final
192.168.154.136:/data 18G 3.4G 13G 21% /mnt
NFS客户端的配置:
启动客户端的rpcbind服务,设置开机自启动
测试与nfs服务端的192.168.154.136是否联通
[root@lamp01 ~]# /etc/init.d/rpcbind status
rpcbind (pid 27184) is running...
[root@lamp01 ~]# showmount -e 192.168.154.136
Export list for 192.168.154.136:
/data 192.168.154
这个showmount命令是客户端装了nfs才有的命令,建议客户端也装。如果连不上出现(no route to host)多数原因是防火墙没关导致的。
A.ping 192.168.154.136
B.Telnet 192.168.154.136 111 排查端口
Showmount没问题把共享目录挂载到客户端本地
[root@lamp01 ~]# mount -t nfs 192.168.154.136:/data /mnt
[root@lamp01 ~]# /etc/init.d/rpcbind status
rpcbind (pid 27184) is running...
[root@lamp01 ~]# showmount -e 192.168.154.136
Export list for 192.168.154.136:
/data 192.168.154
[root@lamp01 ~]# mount -t nfs 192.168.154.136:/data /mnt
[root@lamp01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_nfsserver-lv_root
18G 3.4G 13G 21% /
tmpfs 491M 224K 491M 1% /dev/shm
/dev/sda1 477M 29M 424M 7% /boot
/dev/sr0 4.4G 4.4G 0 100% /media/CentOS_6.6_Final
192.168.154.136:/data 18G 3.4G 13G 21% /mnt
然后我们在137/mnt目录下创建个文件,提示被拒绝。
在服务端我们做调整查看cat /var/lib/nfs/estab,内容为nfs服务端所有参数信息。
Nfs服务端默认把读写权限给uid为65534这个用户,我们找一下uid为65534这个用户,grep 65534 /etc/passwd.我么查看了/data目录的用户和属组,发现root用户对此目录拥有读写权限。所以我们修改用户属组。
[root@nfsserver data]# cat /var/lib/nfs/etab
/data 192.168.154*(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
[root@nfsserver data]# grep 65534 /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfsserver data]# ls -ld /data
drwxr-xr-x 2 root root 4096 Jan 21 14:20 /data
[root@nfsserver data]# chown -R nfsnobody /data
最后为了让我们重启客户端后挂载信息存在,将挂载命令写入rc.local文件中。
工作中多台客户端同时读写管理共享目录的文件,我们另外一台139的客户机做了和137一样的 配置,实现了此功能,所以我们的客户端在管理共享服务器的目录时都被映射为一个用户nfsnobody用户。
NFS客户端挂载拍错思路
1、首先确认NFS服务配置和服务是ok。
#showmount -e localhost
最好在服务端挂载自己试试。
2、确认nfs客户端showmount是否ok。
3、如果出现rpc program not registed怀疑是rpc服务启动顺序
4、the stale file handle error原因服务器上资源移动位置了,在客户端使用unmout和mount重新挂载就可以了。
5、Nfs mount:dbserver retrying :/mntpoint
当前级别不是3,mounted守护进程没哟启动,用/etc/init.d/nfs.server脚本启动nfs守护进程。
Showmount 命令说明
Showmount命令一般用于从NFS客户端检查NFS服务器共享目录的情况。
-e参数显示服务器输出的目录列表 showmount -e 10.0.0.7
-d参数显示nfs服务器提供的共享的目录
-a参数以ip;/dir 格式显示nfs服务器的ip地址和可被挂载的目录
Exportfs命令参数可以使用这个命令临时共享
Exports -o rw,sync,all_squash,10.0.0.0/24:data
NFS server 端防火墙控制
真正企业生产环境的存储服务器都属于内网环境,都无需防火墙,因此,此处要配置的话就有两种方法任选其一:
(1)仅允许内网ip访问
iptalbes -A INPUT -s 10.0.0.0/24 --dport 111 -j ACCEPT
(2)允许ip端加端口访问
iptabels -A INPUT -i eth1 -p udp -s 10.0.0.0/24 --dport 111 -j ACCEPT
iptabels -A INPUT -i eth1 -p udp -s 10.0.0.0/24 --dport 2049 -j ACCEPT
iptalbes -A INPUT -i eth1 -p udp -s 10.0.0.0/24 -j ACCEPT
NFS章节重点
1、NFS服务的访问原理流程
2、NFS作为集群共享存储角色的排障,高级优化
3、NFS作为集群共享存储角色的排障,高级优化
4、Mount命令的知识及参数,-o(noatime,nodirtime,noexec,nosuid,rsize,wsize)等
5、Fstab文件知识
6、常用命令showmount,exportfs,umount(-lf),rpcinfo
7、NFS的有点、缺点、适合的应用场景,替代产品(mfs,glusterfs,fastdf)
8、了解autofs。
NFS参考文献:http://www.tldp.org/HOWTO/NFS-HOWTO/intro.html
预习:
Rsync数据同步、备份
定时:rsync+cron定时任务
实时:rsync+sersync(inotify)
Nfs上级实战及文件系统修复
NFS配置参数权限
NFS配置参数权限参数说明
NFS服务器端的权限设置,即/etc/exports文件配置格式中小括号里面的参数,详细参数说明
参数名称 参数用途
Rw read-write表示可读写权限
Ro read-only,表示只读权限
Sync 请求或写入数据时,数据同步写入到NFSSEVER 硬盘
Async 请求或写入数据时,先返回请求,再将数据写入内存或硬盘中即异步写入数据。此参数可以提升NFS性能,
all_squash 不管访问NFSserver 共享目录的用户身份如何,它的权限都会压缩成匿名用户,同时它的uid和gid都会变成nfsnobody账户
NFS服务重点知识梳理总结
使得NFS CLIENT 端可写的服务端配置条件
当多个NFS客户端以NFSF方式写入修改服务器端文件系统时,需要具有以下个权限:
(a)NFS服务器/etc/exports 设置需要开放可写入的权限,即服务端的共享权限
(b)NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务端本地目录的安全权限。
(c)每台机器都对应存在和nfs默认配置uid65534的nfsnobody用户确保所欲客户端访问权限统一,否则每个机器需要同时建立相同uid的用户,并覆盖NFS的默认配置)
当满足上述三个条件,多个nfs客户端才能具有互相写入,互相修改其他主机写入文件的权限,这在开篇讲过的大规模集群环境,作为集群共享存储时尤为注意。
到这步为止,NFS服务端一个nfs共享目录、data共享给10.0.0.0/24内主机可读写就配置完了。下面还需要在客户端主机挂载服务端共享的/data,才可以在客户端真正读写到该共享目录。
NFS客户端挂载命令
(1)这里先强调下客户端挂载的命令格式
挂载命令 挂载格式类型 nfs共享服务器目录 nfs客户端挂载目录
Mount -t nfs 10.0.0.7:/data /mnt(必须存在)
完整挂载命令为:mount -t nfs 10.0.0.7:/data /mnt 此命令在客户端执行
NFS客户端开机自启动挂载
配置mount挂载命令使开机自动配置,两种方法其中一种是无效
A./etc/rc.local里
偶尔开机挂载不上,工作中除了开机自启动配置,还要对是否挂载上监控。
b./etc/fstab
问题nfs网络文件系统不要放在fstab里实现开机挂载,原因如下:
1、fstab优先于网络被linux系统加载。网络没有启动执行fstab会导致连不上NFS服务器无法实现开机挂载。
2、即使是本地的文件系统,也要注意,fstab最后两列要设置0 0,否则可能导致服务启动服务器问题
NFS客户端挂载深入
在nfs服务端可以通过cat /etc/var/lib/nfs/etab 查看服务端的参数细节。
在nfs客户端可以通过cat /proc/mounts 查看mount挂载参数细节。
(1)mount 挂载及fstab 文件的参数表格
通过nfs客户端测试挂载获取的默认挂载参数:
#grep mnt / proc/mounts
2使用linux rescue(救援模式)修复/etc/fstab(改错配置然后重启系统)
3、root密码忘记了,想重新获取root密码怎么做?
重要问题:
1、有关NFS客户端普通用户写NFS的问题
A.为什么要普通用户写NFS?
B. exports 加all_squash普通用户才能压缩成匿名用户
/data 10.0.0.0/24(rw,sync,all_squash),
如果不加all_squash这个参数的话,切换到普通用户将没有权限创建文件在共享目录,无法管理。