NFS

NFS服务

1.    简介

NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。让不同的机器、不同的操作系统可以共享彼此的文件。

2.    工作原理

 

1)首先服务器端启动RPC服务,并开启111端口

2)服务器端启动NFS服务,并向RPC注册端口信息

3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口

4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。

5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

NFS相关进程说明:

nfsd(rpc.nfsd):rpc.nfsd的主要功能是管理NFS客户端是否能够登录NFS服务端主机,其中还包含登入者的ID判别等。

mountd(rpc.mountd) rpc.mountd的主要功能则是管理NFS文件系统,检查权限。

rpc.rquotad:磁盘限额相关。

rpc.lockd 可用来锁定文件,用于多客户端同时写入

rpc.statd检查文件的一致性,与rpc.lockd有关,c,d,两个服务需要客户端服务器端同时开才可以

3.    部署

安装rpcbind和nfs (yum安装nfs-utils会自动安装rpcbind)

[root@nfs01 ~]# yum install -y nfs-utils rpcbind

查看软件信息

[root@nfs01 ~]# rpm -qa nfs-utils rpcbind

rpcbind-0.2.0-16.el6.x86_64

nfs-utils-1.2.3-78.el6_10.1.x86_64

[root@nfs01 ~]# rpm -qf /sbin/mount.nfs

nfs-utils-1.2.3-78.el6_10.1.x86_64

启动服务:(先启动rpcbind,然后启动nfs)

[root@nfs01 ~]# /etc/init.d/rpcbind start

[root@nfs01 ~]# /etc/init.d/nfs start

查看rpcbind和nfs对应情况

[root@nfs01 ~]# rpcinfo -p localhost

查看进程

[root@nfs01 ~]# ps -ef | grep -E "nfs|rpcbind"

服务端配置文件:/etc/exports

[root@nfs01 ~]# man exports

[root@nfs01 ~]# cat /etc/exports

/nfs 172.16.1.0/24(rw,all_squash,sync)

授权:

[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /nfs/

重启服务端:

[root@nfs01 ~]# /etc/init.d/nfs reload

[root@nfs01 ~]# exportfs -rv

验证生效:

[root@nfs01 ~]# showmount -e

Export list for nfs01:

/nfs 172.16.1.0/24

查看已经共享的目录:

[root@nfs01 ~]# exportfs -v

查看nfs服务默认配置信息

[root@nfs01 ~]# cat /var/lib/nfs/etab

本地测试挂载:

[root@nfs01 ~]# mount -t nfs 172.16.1.31:/nfs /mnt/

卸载:

[root@nfs01 ~]# umount /mnt/

强制卸载:

[root@nfs01 ~]# umount -lf /mnt

加入开机自启动

[root@nfs01 ~]# chkconfig rpcbind on

[root@nfs01 ~]# chkconfig nfs on

开机自启动检查

[root@backup ~]# chkconfig | awk '$1~/nfs$|rpcbind/'

查看客户端哪个客户端连接了:

[root@nfs01 ~]# netstat -tunp |grep 172.16.1.31:2049

 

客户端挂载:

[root@backup ~]# yum install nfs-utils -y        (yum安装nfs-utils会自动安装rpcbind)

[root@backup ~]# mount -t nfs 172.16.1.31:/nfs /mnt           (并未启动rpcbind)

[root@backup ~]# /etc/init.d/rpcbind status          

rpcbind is stopped

 

配置文件常用写法:

授权说明

配置方法

说明

授权单一客户端访问NFS

10.0.0.30

一般情况,生产环境中此配置不多

授权整个网段可访问NFS

10.0.0.0/24

其中的24等同于255.255.255.0,指定网段位生产环境中最常见的配置,配置简单,维护方便

授权整个网段可访问NFS

10.0.0.*

指定网段的另外一种写法(不推荐使用)

授权某个域名客户端访问

nfs.luffycity.com

此方法生产环境不常使用

授权整个域名客户端访问

*.luffycity.com

此方法生产环境不常使用

 

控制参数:

参数名字

参数作用

rw

read-write,表示可读写权限

ro

read-only,表示只读权限

sync

(同步,实时)请求或写入数据时,数据同步写入到NFS server的硬盘后才返回

async

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

no_root_squash

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

root_squash

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

all_squash

不管访问NFSserver共享目录的用户身份如何,它的权限都将被压缩成匿名用户(nfsnobody),同时它的UID和GID都会便哼nfsnobody账号身份,在早期多个NFS客户端同时读写NFSserver数据时,这个参数是很有用的
1) 确保所有客户端服务器对NFS共享目录具备相同的用户访问权限
  a. all_squash把所有客户端都压缩成固定的匿名用户(UID相同)
  b. 就是anonuid,anongid指定的UID和GID的用户
2)所有的客户端和服务端都需要有一个相同的UID和GID的用户,即nfsnobody(UID必须相同)

anonuid

指定的是匿名用户的UID或GID数字
所有服务器上面,匿名用户(nfsnobody rsync www)uid和gid
参数以anon*开头即只anonymous匿名用户,这个用户UID设置值通常为nfsnobody的UID值,当然也可以额自行设置这个UID值。但是,UID必须存在于/etc/passwd中,在多NFS Clients时,如多台webserver共享一个NFS目录,通过这个参数可以使得不同的NFSclients写入的数据对所有NFS clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用,一般默认即可

anongid

同anonuid,区别就是把UID换成GID

 

 

配置实例:

通常情况下是将/data目录的权限设置成755,属主属组为nfsnobody用户。

①允许root用户映射nfsnobody,不允许其他用户映射

         /data 172.16.1.0/24(rw,sync,no_all_squash,root_squash)

         此情况下,仅root用户会映射为nfsnobody身份。其他用户依旧使用自己的身份,再根据文件系统权限判断是否可读可写。

         ②将所有用户映射为nfsnobody用户

         /data 172.16.1.0/24(rw,sync, all_squash)

         此情况下,所有用户映射为nfsnobody身份,然后根据文件系统权限判断可否读写

         ③指定映射成某个用户身份,不使用默认的nfsnobody用户。前提:服务端和客户端都存在uid、gid为500的用户。

         /data 172.16.1.0/24(rw,sync, all_squash,anonuid 500,anongid=500)

         此情况下,所有用户都映射为uid为500,gid为500的用户身份,在根据系统权限判断是否可读写。

 

 

nfs mount参数:

nfs mount 参数

参数功能

默认参数

fg(foreground)
bg(background)

当在客户端执行挂载时,可选择是前台(fg)还是在后台(bg)执行。若在前台执行,则mount会持续尝试挂载,知道成功或挂载时间超时为止,若在后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的其他程序操作。如果网络联机不稳定,或是服务器常常需要开关机,简易使用bg比较妥当

fg

soft
hard

当NFS Client以soft挂载server时,若网络或server出现问题,造成client和setver无法传输资料,client就会一直尝试,知道timeout后显示错误才停止。若使用soft mount的话,可能会在timeount后显示错误才停止。
若使用soft mount的话,可能会在timeout出现时造成资料丢失,所以一般不简易使用
若使用hard 模式挂载硬盘时,刚好和soft相反。此时client会一直尝试连线到server,若server有回应就继续刚才的操作,若没有回应NFSclient会一直尝试,此时无法umount或kill,所以常常会配合intr使用,这是默认值

hard

intr

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

rsize
wsize

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

C6默认值
rsize=131072
wsize=131072

protoudp

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

proto=tcp

示例:mount -t nfs -o fg,hard,intr,rsize=131072,wsize=131072 172.16.1.31:/nfs/ /mnt

 

mount 参数:

参数

参数意义

系统默认值

suid
nosuid

当挂载的文件系统上有任何SUID的程序时,只要使用nosuid就能够取消设置SUID的功能

suid

rw
ro

可以指定文件系统是只读(ro)或可写(rw)

rw

dev
nodev

是否可以保留装置文件的特殊功能?一般来说只有/dev才会有特殊的装置,因此可以选择nodev

dev

exec
noexec

是否具有执行文件的权限,如果想要挂载的仅是普通资源数据区(例如:图片,附件),那么可以选择noexec

exec

auto
noauto

这个auto指的是“mount -a”时会不会备挂载的项目,如果不需要这个分区随时被挂载,可以设置为noauto /etc/fstab

auto

atime

在每一次数据访问时,会同步更新访问文件的inode时间戳,时默认选项,在高并发的情况下,简易通过明确加上noatime,来取消这个默认项,以达到提升I/O性能,优化I/O的目的

 

defaults

这是fstab里的默认值,包括rw,suid,dev,exec,auto,nouser,async,relatime。默认情况大部分都时默认值

 

noatime

访问文件不更新文件的inode时间戳,高并发环境,锐减显示应用该选项,可以提高系统I/O性能

 

nodiratime

不更新文件系统上的directory inode时间戳。高并发环境,锐减显示应用该选项,可以提高系统I/O性能

救援模式:mount -o rw,remount /

4.    优化

硬件:sas/ssd磁盘,买多块,硬件raid,制作raid5或raid10.网卡吞吐量要大,至少千兆

NFS服务器配置/data 10.0.0.0/24(rw,sync,all_squash,anonuid=65524,)

NFS客户端挂载优化配置命令:

         mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,rsize=131071,wsize=131072 10.0.0.7:/data/ /mnt # 兼顾安全性能

对NFS服务的所有服务器内核进行优化时,执行如下命令:

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

[root@nfs01 data]# ll  /proc/sys/net/core/?mem*

大型网站NFS网络文件系统的替代软件为分布式文件系统 Moosefs(mfs),GlusterFS(大文件),FastDFS

5.    优缺点

优点:

  1.   简单,容易上手,容易掌握
  2. NFS文件系统内数据是在文件系统之上的,即数据是能看得见的。
  3. 部署快速,维护简单方便,且可控,满足需求得就是最好的。
  4. 可靠,从软件层面上看。数据可靠性高,经久耐用。数据是文件系统之上的
  5. 服务非常稳定

局限:

  1. 存在单点故障,如果NFSserver宕机了,所有客户端都不能访问共享目录
  2. 在大数据高并发的场合,NFS效率,性能有限。(2千万/日以下PV(page view)的网站不是瓶颈,除非网站架构设计太差)
  3. 客户端认证是基于IP和主机名的,权限要根据ID识别,安全性一般(用于内网则问题不大)
  4. NFS数据是明文的,NFS本身不对数据完整性作验证。
  5. 多台客户机器挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。尤其NFS服务端出问题后,所有NFS客户端都处于挂掉状态,(测试环境可使用autofs自动挂载解决,正式环境可修复NFS服务或强制卸载)
  6. 涉及了同步(实时等待)和异步(解耦)的概念,NFS服务端和客户端相对来说就是耦合度有些高。网站程序也是一样,尽量不要耦合度太高,系统及程序架构师的重要职责就是为程序及架构解耦,让网站的扩展性变得更好

 

6.    问题记录

强制卸载:umonut -lf /mnt

 

7.    其他

测试磁盘的读写(性能/速度)

1.dd+for

         time dd if=/dev/zero of=/nfsfolder/testfile bs=16k count=16384

         time dd if=/nfsfolder/testfile of=/dev/null bs=16k

2.测试随机读写(io)fio (epel源)

 

posted @ 2019-02-12 21:00  狂奔__蜗牛  阅读(129)  评论(0)    收藏  举报
levels of contents