NFS是Network File System的缩写,中文意思是网络文件系统。主要功能是网络让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,Web、)可以通过挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(某一个挂载点下)。从NFS客户端的机器本地看。NFS服务器端共享的目录就好像是客户端自己的磁盘分区或目录一样,实际上是远端的NFS服务器的目录。

目标架构偏小,只适合中小型架构,偏大型的架构一般使用Moosefs(mfs),glusterfs,FastDFS。

NFS在企业中的应用场景

在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,一般是把网站用户上次的文件都放在NFS共享里,例如:BBS产品的图片、附件、头像(网站BBS程序不要放在NFS共享中),然后前端所有的节点访问这些静态资源时会读取NFS存储上的资源。NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是中小型网站公司应用频率更高。大公司或门户除了使用NFS外,还可能会使用更为复杂分布式文件系统。

NFS集群环境搭建准备

初期部署2台web lnmp一台NFS服务器

地址:

NFS 192.168.24.20

lnmp01 192.168.24.21

lnmp02 192.168.24.25

安装NFS服务端

安装完系统后,检查是否已经安装了需要的软件:

yum install nfs-utils rpcbind –y

这边显示已经安装过了,所以没有执行任何动作。

NFS服务_Linux

查看进程情况

systemctl status rpcbind

NFS服务_Linux_02

启动服务习惯,习惯在rc.local上写入需要开机允许的程序。

这样做的好处是:

1. 不是所有软件都由yum安装,有些需要编译安装。所以干脆全写在rc.local得了(C6)

2. 为了方便下一任运维能清楚知道这台服务器是运行着什么

[root@nfs-server /]# ps -ef|egrep "rpc|nfs"

root 4809 2 0 06:42 ? 00:00:00 [rpciod]

rpc 4857 1 0 06:42 ? 00:00:00 /sbin/rpcbind -w

rpcuser 30401 1 0 12:11 ? 00:00:00 /usr/sbin/rpc.statd à检查文件一致性

root 30408 1 0 12:11 ? 00:00:00 /usr/sbin/rpc.idmapd àname mapping daemon

root 30431 1 0 12:11 ? 00:00:00 /usr/sbin/rpc.mountd à权限管理验证等(NFS mount daemon)

root 30436 2 0 12:11 ? 00:00:00 [nfsd4_callbacks]

root 30442 2 0 12:11 ? 00:00:00 [nfsd] àNFS主进程,管理登入,ID身份判别等

root 30443 2 0 12:11 ? 00:00:00 [nfsd]

root 30444 2 0 12:11 ? 00:00:00 [nfsd]

root 30445 2 0 12:11 ? 00:00:00 [nfsd]

root 30446 2 0 12:11 ? 00:00:00 [nfsd]

root 30447 2 0 12:11 ? 00:00:00 [nfsd]

root 30448 2 0 12:11 ? 00:00:00 [nfsd]

root 30449 2 0 12:11 ? 00:00:00 [nfsd]

root 30517 6901 0 12:12 pts/0 00:00:00 grep -E --color=auto rpc|nfs

exports配置文件格式

/etc/exports 是nfs的配额文件。未配置是空的。

/etc/exports文件配置格式为:

NFS服务_Linux_03

编写例子

NFS服务_系统/运维_04

NFS服务_Linux_05

测试一下

NFS服务_系统/运维_06

如果没有该目录会报错

NFS服务_Linux_07

也可以使用以下命令测试

[root@nfs-server /]# exportfs -r

exportfs: Failed to stat /data: No such file or directory

[root@nfs-server /]# showmount -e 127.0.0.1

Export list for 127.0.0.1:

/data 192.168.24.*

实例一:共享/data目录给192.168.24.0/24网段的主机读写,实现nfs server上的data目录共享给192.168.24.0/24整个网段的主机可读写。

把参数信息写上:

[root@localhost mnt]# cat /etc/exports

/data 192.168.24.*(rw,sync)

重启服务

[root@localhost mnt]# systemctl restart nfs.service

测试能否挂载

mount –t nfs 192.168.24.20:/data /mnt

NFS服务_Linux_08

下面错误需要怀疑服务端RPC服务启动及顺序,NFS没有注册端口(NFS先起来,rpc后启动)

使用NFS不仅要考虑 在NFS服务端对地址的权限的问题,以及原本目录的权限问题,双方都放开了权限才能执行正常的动作(读写)

服务端设置

NFS服务_系统/运维_09

本地目录权限放开

NFS服务_Linux_10

NFS服务_系统/运维_11

NFS服务_系统/运维_12

NFS服务_系统/运维_13

NFS服务_系统/运维_14

NFS配置权限设置常用参数说明

参数名称

rw----------Read-write,表示可读写权限

ro----------Read-only,表示只读权限

sync-------请求或写入数据时,数据同步写入到NFS Server。数据安全不会丢,缺点,性能比不启用该参数要差

async-----请求或写入数据时,先返回请求,再将数据写入到内存缓存和硬盘种,即异步写入数据。此参数可以提升NFS性能,但是会降低数据的安全。因此,一般情况下建议不用,如果NFS处于瓶颈状态,并且允许数据丢失的话可以打开此参数提升NFS性能。

写入时数据会先写道内存缓冲区,等硬盘有空挡再写入磁盘,这样可以提升写入效率!风险为若服务器宕机或不正常关机,会损失缓冲区种未写入磁盘的数据(解决办法:服务器主板电池或加UPS不间断电源)

no_root_squash-----访问NFS Server共享目录的用户如果是root的话,它对该共享目录具有root权限。这个配置原本为无盘客户端准备的。用户应避免使用!

Turn off root squashing.This option is mainly userful for diskless clients.

root_squash-------对于访问NFS Server共享目录的用户如果是root的话,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份。

Map requests from uid/gid 0 to the anonymous uid/gid.

all_squash-------不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账户身份。在早期多个NFS客户端同时读写NFS Server数据时,这个参数很有用。

还有一些不太重要的参数,此处没有列出。

NFS服务_系统/运维_15

可以使用exportfs命令,不需要编辑export文件,直接配置生效,不仅可以直接使配置生效而且直接通过命令共享目录

exportfs –rv ß加载配置生效,等价优雅重启 reload

一些配置文件:

NFS配置文件的完整参数设定的为你教案(有很多没有配置但是默认就有的NFS参数)

cat /var/lib/nfs/etab

[root@nfs-server /]# cat /var/lib/nfs/etab

/data 192.168.24.*(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)

这个配置文件适合C5.X记录曾经挂载过的NFS客户端信息,包括IP地址等等,C6开始没有这个文件,或者这个文件已经没有内容了。

[root@nfs-server /]# cat /var/lib/nfs/xtab

[root@nfs-server /]# grep mnt /proc/mounts

192.168.24.20:/data /mnt nfs4 rw,relatime,vers=4.1,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.24.20,local_lock=none,addr=192.168.24.20 0 0

客户端mount挂载命令

NFS服务_Linux_16

[root@localhost /]# showmount -e 192.168.24.20 ß挂载前首先检查有权限需要挂载的信息,是否能够挂载。

Export list for 192.168.24.20:

/data 192.168.24.* ß可以看到共享了/data目录

[root@localhost /]# mount -t nfs 192.168.24.20:/data /mnt ß执行挂载命令挂载

[root@localhost /]# df –h ß查看挂载后的结果

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/centos-root 38G 3.7G 34G 10% /

devtmpfs 2.0G 0 2.0G 0% /dev

tmpfs 2.0G 0 2.0G 0% /dev/shm

tmpfs 2.0G 9.5M 2.0G 1% /run

tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup

/dev/sda1 1014M 166M 849M 17% /boot

/dev/mapper/centos-home 5.0G 33M 5.0G 1% /home

tmpfs 396M 12K 396M 1% /run/user/42

tmpfs 396M 0 396M 0% /run/user/0

192.168.24.20:/data 50G 3.7G 47G 8% /mnt ß能显示这个就是客户端挂载后的结果

查看挂载结果

NFS服务_Linux_17

NFS挂载优化

NFS Client mount 挂载参数列表

mount的参数可以使用 grep mnt /proc/mounts上查询得到

[root@nfs-server ~]# grep mnt /proc/mounts

192.168.24.20:/data /mnt nfs4 rw,relatime,vers=4.1,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.24.20,local_lock=none,addr=192.168.24.20 0 0

mount的参数直接添加上即可

示例:mount -t nfs -o bg,hard,intr,rsize=131072,wsize=131072 192.168.24.20:/data/ /mnt

[root@nfs-server mnt]# mount -t nfs -o bg,hard,intr,rsize=131072,wsize=131072 192.168.24.20:/data/ /mnt

[root@nfs-server mnt]# grep mnt /proc/mounts

192.168.24.20:/data /mnt nfs4 rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.24.20,local_lock=none,addr=192.168.24.20 0 0

fg、bg--------前台fg、后台bg执行,在日常中可以在命令后加&表示该动作在后台运行,这样不会影响你的前台操作。默认为fg前台。

soft-----------软挂载,当NFS Client以soft挂载Server后,若网络或Server出现问题,造成Client和Server无法传输资料时,Client会一直尝试到timeout后显示错误并且停止尝试。若使用soft mount的话,可能会在timeout出现时造成资料丢失,一般不建议使用。

hard---------硬挂载,若用hard模式挂载硬盘时,刚好和soft相反,此时Client会一直尝试连线到Server,若Server有回应就继续刚才的操作,若没有回应NFS Client会一直尝试,此时无法umount或kill,所以常常会配合intr使用。这是默认值。

intr-----------当使用hard挂载的资源timeout后,若有指定intr参数,可以在timeout后把它中断掉,这避免出问题时系统整个被NFS锁死,建议使用intr。

rsize、wsize---------读出(rsize)与写入(wsize)的区块大小(block size),这个设置值可以影响客户端与服务器端传输数据的缓冲存储量,一般来说,如果在局域网内(LAN),并且客户端与服务器端都具有足够的内存,这个值可以设置大一点,比如说65535(bytes),提升缓冲区块将可提升NFS文件系统的传输能力。但设置的值不要太大,最好是实现网络能够传输的最大值为限。

Centos5默认rsize=1024、wsize=1024。Centos6默认rsize=131072、wsize=131072

protp=udp------------使用UDP协定来传输资料,在LAN中会有比较好的性能。若要跨越Internet的话,使用proto=tcp多传输的数据会有比较好的纠错能力。

mount 命令-o参数选项解释

下面的选项有部分需要在fstab才有用

async

所有对文件系统的 I/O 操作都必须是异步完成的,即不会同步写到磁盘中,此参数会提高性能,但是当系统故障可能会影响数据安全

sync *

与async参数相反,所有对文件系统的 I/O 操作都应当是同步完成的。(只适合ext2,ext3,fat,vfat,nfs)

ro

只读地挂载文件系统。

rw *

挂载文件系统为可读/写。

atime

每次存取时更新 inode 存取时间。这是默认选项。

auto

可以在使用 -a 选项时被挂载。

defaults

这是fstab里的缺省值,使用默认选项:rw,suid,dev,exec,auto, nouser, 以及async。

exec

允许执行二进制文件。无需求建议取消这个选项会增强系统安全。

noexec *

不允许执行被加载的文件系统中的任何二进制文件。这个选项对于需要加载包含不适于自己体系结构的二进制可执行文件的文件系统的服务器有用(noexec,shell,php)。

noatime *

不更新文件系统的 inode 存取时间 (例如,可以更快地存取 news spool 从而提升新闻服务器的速度),节省io提高并发。

nodiratime *

不更新文件系统上的directory inode访问时间,高并发环境建议使用。

nosuid *

不允许 set-user-identifier 或 set-group-identifier 位起作用。(这样看上去很安全,但是如果你安装了 suidperl(1) 那么是非常不安全的。)

suid

允许 set-user-identifier 或 set-group-identifier 位起作用。

nouser

禁止普通的 (即,非 root) 用户来挂载文件系统。这是默认选项。

owner

remount

试图重新挂载一个已经挂载的文件系统。这个选项通常用于改变文件系统的挂载标志,尤其是使一个只读文件系统变为可读写。它不会改变设备或者挂载点。

dev

解析文件系统中的字符设备或块设备。

_netdev

文件系统居于需要网络连接的设备上 (用于防止系统不断尝试挂载这些文件系统,直到系统中网络被启动)。

noauto

只能被显式地挂载 (也就是说,选项 -a 不会使这个文件系统被挂载)。

nodev

不解析文件系统中的字符设备或块设备。

dirsync

所有对文件系统内目录的更新应当是同步完成的。这个选项影响下列系统调用:creat, link, unlink, symlink, mkdir, rmdir, mknod 以及 rename。

user

允许普通的用户挂载文件系统。挂载者的用户名被写入 mtab,从而使他可以再次卸载文件系统。这个选项暗含了选项 noexec, nosuid, 以及 nodev (除非在后续选项中指定user,exec,dev,suid)。

users

允许每个用户挂载和卸载文件系统你哦个。这个选项暗含了选项 noexec, nosuid, 以及 nodev(除非在后续选项中指定 users,exec,dev,suid)。

NFS服务_系统/运维_18

NFS内核优化

优化选项

NFS服务_Linux_19

NFS服务_系统/运维_20

小知识:

当卸载挂载点但是目前被程序占用着的情况下,是无法用umount正常卸载的,这时候可以使用加lf参数强制卸载。

umonut –lf /mnt

NFS系统的优缺点

优点:

1.简单à容易上手,容易掌握

2.NFS文件系统内数据实在文件系统之上的,即数据能看得见的。

3.方便à部署快速,维护简单,可控且满足需求就是最好的。

4.可靠à从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上

5.稳定à非常稳定

局限:

1. 存在单点故障,如果nfs server宕机了所有客户端都不能访问,可以使用负载均衡及高可用性方案弥补。

2. 在大数据高并发的场合,NFS效率\性能有限(瓶颈在2千万PV(Page View)/日,前提在架构已优化、多NFS服务器负载)。

3. 客户端认证时单一基于IP和主机名,权限根据ID识别,安全性一般

4. NFS数据是明文的,NFS本身对数据完整性不作验证。

5. 多台客户机挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。服务器宕机,客户机会卡住

exportfs –o rw,sync,all_squash 10.0.0.0/24:/data

rpc的端口是111

nfs的端口是2049

常见NFS故障排查:

1) 客户端挂载报错:No such file or directory

NFS服务_Linux_21

2) NFS服务端启动失败

NFS服务_Linux_22

3)failed:RPC Error:Program not registered 注册RPC服务失败

NFS服务_Linux_23

NFS服务_系统/运维_24

rsync+serversync数据同步

rsync数据同步、备份

定时:rsync+cron 定时任务

实时:rsync+serversync(inotify)

按要求搭建配置NFS服务

准备三个服务器或虚拟机A、B、C

NFS服务_系统/运维_25