第1章 NFS介绍

1.1 什么是NFS

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

NFS网络文件系统就像windows系统的网络共享,安全功能、网络驱动器映射,这也和Linux系统里的Samba服务类似。只不过一般情况下,windows网络共享服务或Samba服务用于办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享,如果是大型网站,那么有可能还会用到更为复杂的分布式文件系统,例如:Moosefs(mfs)、GlusterFS、FastDFS。

1.2 NFS的历史介绍

第一个网络文件系统成为File Sccess Listener,由Digital Equipment Corporation

(DEC)在1976年开发。

NFS是第一个构建与IP协议智商的现代网络文件系统。在20世纪80年代,它首先作为实验的文件系统,由Sun Microsystems在内部完成开发。NFS协议终归于Request for Comments(RFC)标准,并且随后演化为了NFSv2.作为一个标准,由于NFS与其他客户端和服务器的互操作能力很好而发展快速。

之后,标准继续演化,称为NFSv3,在RFC1813中有定义。这一新的协议比以前的版本具有更好的可扩展性,支持大文件(超过2GB),异步写入,并且将TCP作为了传输协议,为文件系统在更广泛的网络中使用铺平了道路。在2000年,RFC3010(由RFC3530修订)将NFS带入企业级应用。此时,Sum引入了具有较高安全性带有状态协议的NFSv4(NFS之前的版本都是无状态的)。今天,NFS版本的4.1(由RFC5661定义)增加了对跨越分布式服务器并行访问的支持(称之为PNFS extension)。

NFS系统发展的时间表,包括记录器特性的特定RFC,如下图

clip_image001

NFS系统已经历了近30年的发展,它代表了一个非常稳定的(及可移植)网络文件系统,具备可扩展、高性能等特性,并达到了企业级应用质量标准。由于网络速度的增加和延迟的降低,NFS系统一直是通过网络提供文件系统服务的有竞争力的选择,特别是在中小型互联网企业中,应用十分广泛。

1.3 NFS在企业中的应用场景

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

在企业生产集群架构中,NFS作为所有前端web服务的共享存储,存储的内容一般包括网站用户上传的图片、附件头像等,注意,网站的程序代码不要放NFS共享里,因为网站程序是开发运维人员统一发布的,不存在发布延迟问题,直接批量发布到web节点提供访问比共享到NFS里访问效率更高。

1.4 企业生产集群为什么需要共享存储角色

这里通过图解给大家展示一下集群架构需要共享存储服务的理由。例如:A用户传图片到web服务器,然后让B用户访问这张图片,结果B用户访问的请求分发到了web2,因为web2上没有这张图片,这就导致它无法看到A用户上传的图片,如果此时有一个共享存储,A用户上传图片的请求无论是分发到web1还是web2上,最终都会存储到共享存储上,而在B用户访问图片是,无论请求分发到web1还是web2行,最终也都会去共享存储上找,这样就可以访问到需要的资源了。这个共享存储的位置可以通过开源软件和商业硬件实现,互联网中小型集群架构会用普通PC服务器配置NFS网络文件系统实现。

clip_image002

中小型互联网企业一般不会买硬件存储,因为太贵,大公司如果业务发展很快的话,可能会临时买硬件存储顶一下网站的压力,当网站并发继续加大时,硬件存储的扩展相对就会很费劲,且价格成几何级数增加。例如:淘宝网就曾替换掉了很多硬件设备,比如,用lvs+haproxy替换了netscaler负载均衡设备,用FastDFS、TFS配合PC服务器替换了netapp、emc等商业存储设备,去IOE正在成为互联网公司的主流。

第2章 NFS系统原理介绍

2.1 NFS系统挂载结构图与详解

clip_image003

如上图所示,在NFS服务器端设置好一个共享目录/video后,其他有权限访问NFS服务器端的客户端就可以将这个共享目录/video挂载到客户端本地的某个挂载点(其实就是一个目录,这个挂载点目录可以自己随意指定),上图中的两个NFS客户端本地的挂载点分别为/v/video和/video,不同客户端的挂载点可以不相同。

客户端正确挂载完毕后,就进入到了nfs客户端的挂载点所在的/v/video或/video目录,此时就可以看到NFS服务器端/video共享出来的目录下的所有数据。在客户端上查看是,NFS服务器端的/video目录就相当于客户端本地的磁盘分区或目录,几乎感觉不到使用上的区别,根据NFS服务端授予的NFS共享权限以及共享目录的本地系统权限,只要是指定的NFS客户端操作挂载/v/video或/video的目录,就可以将数据轻松地存储到NFS服务器端的/video目录中了。

客户端挂载NFS后,本地挂载基本信息显示如下:

[root@web02 ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 6.9G 1.5G 5.1G 23% /

tmpfs 242M 0 242M 0% /dev/shm

/dev/sda1 190M 36M 145M 20% /boot

172.16.1.31:/data 6.9G 1.5G 5.1G 23% /mnt<===172.16.1.31为nfs server的ip地址

提示:mount 源 目标

mount 712.16.1.31:/video /video

从挂载信息来看,和本地的磁盘分区几乎没什么差别,只是文件系统对应列的开头是以IP地址开头的形式了。

大家必须知道,NFS在传输数据时使用的端口会随机选择,那NFS客户端是怎么知道NFS服务端使用的是哪个客户端呢?

答案:就是通过RPC(中文意思远程过程调用,英文Remote Procedure Call简称RPC)协议/服务来实现,这个RPC服务的应用在门户级的网站有很多,例如:百度。接下来,就来谈谈什么是RPC协议/服务。

clip_image004

如图所以,PRC服务就像买房与卖房之间的中介一样,RPC也就是服务端与客户端的中介。

clip_image006

NFS需要有RPC服务(rpcbind服务)的协助才能成功对外提供服务。无论是NFS客户端还是NFS服务器端,当要使用NFS时,都需要首先启动RPC服务(rpbind服务),NFS服务必须在RPC服务启动之后启动,客户端无需启动NFS服务,但需要启动RPC服务。

注意:NFS的RPC服务,在CentOS5.5.X名称为portmap,在CentOS6.X下名称为rpcbind。

参考资料:

http://www.tldp.org/HOWTO/NFS-HOWTO/indes.html

http://www.citi.umich.edu/projects/nfsv4/linux/

http://www.vanemery.com/Linux/NFSv4/NFSv4-no-rpcsec.html

http://www.ibm.com/developerworks/cn/linux/l-network-filesystems/

第3章 NFS配置过程Centos6.7

3.1 老男孩教育NFS服务端配置步骤:

1、安装软件

yum install nfs-utils dos2unix rpcbind -y

yum

2、启动服务(注意先后顺序)

/etc/init.d/rpcbind start

rpcinfo -p localhost

/etc/init.d/nfs start

rpcinfo -p localhost

3、设置开机自启动

chkconfig nfs on

chkconfig rpcbind on

4、配置nfs服务

echo " /data 172.16.1.0/21(rw,sync)">>/etc/exports

mkdir -p /data

chown -R nfsnobody.nfsnobody /data

(查看nfs默认使用的用户以及共享的参数cat /var/lib/nfs/etab)

5、重新加载服务(优雅重启)

/etc/init.d/nfs reload =====exportfs -rv

6、检查或测试挂载

showmount -e 127.0.0.1

老男孩教育NFS客户端:

1、安装软件

yum install nfs-utils rpcbind -y

2、启动rpcbind

/etc/init.d/rpcbind start

3、配置开机自启动

chkconfig rpcbind on

4、测试服务端共享情况

showmount -e 172.16.1.31

5、挂载

mkdir -p /data

mount -t nfs 172.16.1.31:data /data

6、测试读,写

3.2 小结:

NFS服务端与web端都安装nfs与rpc

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

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

NFS服务端

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

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

加入开机启动

[root@nfs01 ~]# chkconfig nfs on

[root@nfs01 ~]# chkconfig rpcbind on

web客户端

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

加入开机启动

[root@web01 ~]#chkconfig rpcbind on

第4章 NFS软件

4.1 NFS软件列表

要部署NFS服务,需要安装下面的软件包:

q nfs-utils:NFS服务的主程序,包括rpc.nfsd、rpc.mountd这两个daemons和相关文档说明,以及执行命令文件等。

q rpcbind:CentOS6.X下面的RPC的主程序。NFS可以视为一个RPC程序,再启动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由rpcbind服务来完成的。因此,在提供NFS服务之前必须先启动rpcbind服务才行

4.2 查看NFS软件包

可使用如下命令查看默认情况下CentOS5.8/6.6里NFS软件的安装情况。

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

rpcbind-0.2.0-11.el6_7.x86_64

nfs-utils-1.2.3-64.el6.x86_64

CentOS6.6默认没有安装NFS软件包(CentOS5默认会安装),可以使用yum install nfs-utils rpcbind -y命令来安装NFS软件。

4.3 启动rpcbind服务

因为NFS及其辅助程序都是基于RPC协议的(使用的端口为111),所有首先要确保系统中运行了rpcbind服务。

[root@nfs01 ~]# LANG=en #临时调整系统位英文字符集,便于grep过滤

[root@nfs01 ~]# /etc/init.d/rpcbind status #检查rpcbind服务状态

rpcbind (pid 27427) is running...

[root@nfs01 ~]# rpcinfo -p localhost #检查rpcinfo信息

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

...省略部分

100021 1 tcp 37256 nlockmgr

100021 3 tcp 37256 nlockmgr

100021 4 tcp 37256 nlockmgr

[root@nfs01 ~]# /etc/init.d/rpcbind start #启动rpcbind服务

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

root 29325 28803 0 22:09 pts/1 00:00:00 grep rpc|nfs

[root@nfs01 ~]# ps -ef|egrep "rpc|nfs"

rpc 27427 1 0 12:53 ? 00:00:00 rpcbind

root 27474 2 0 12:53 ? 00:00:00 [rpciod/0]

root 27483 1 0 12:53 ? 00:00:00 rpc.rquotad

root 27488 1 0 12:53 ? 00:00:00 rpc.mountd

root 27495 2 0 12:53 ? 00:00:00 [nfsd4]

root 27496 2 0 12:53 ? 00:00:00 [nfsd4_callbacks]

root 27497 2 0 12:53 ? 00:00:00 [nfsd]

root 27498 2 0 12:53 ? 00:00:00 [nfsd]

root 27499 2 0 12:53 ? 00:00:00 [nfsd]

root 27500 2 0 12:53 ? 00:00:00 [nfsd]

root 27501 2 0 12:53 ? 00:00:00 [nfsd]

root 27502 2 0 12:53 ? 00:00:00 [nfsd]

root 27503 2 0 12:53 ? 00:00:00 [nfsd]

root 27504 2 0 12:53 ? 00:00:00 [nfsd]

root 27535 1 0 12:53 ? 00:00:00 rpc.idmapd

root 28257 2 0 15:31 ? 00:00:00 [nfsiod]

root 28258 2 0 15:31 ? 00:00:00 [nfsv4.0-svc]

加入开机自启动

[root@nfs01 ~]# chkconfig rpcbind on

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

#! /bin/sh

#

# rpcbind Start/Stop RPCbind

#

# chkconfig: 2345 13 87

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

#!/bin/sh

#

# nfs This shell script takes care of starting and stopping

# the NFS services.

#

# chkconfig: - 30 60

可以看到他们启动的先后次序分别是rpcbind13和nfs30。如果是放进rc.local里面的话就一定要注意启动先后次序。也可以把服务统一放进rc.local里面,这样自己跑什么服务都知道

[root@nfs01 ~]# /etc/init.d/rpcbind start #开启服务

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

Usage: /etc/init.d/rpcbind {start|stop|status|restart|reload|force-reload|condrestart|try-restart}

[root@nfs01 ~]# /etc/init.d/rpcbind status #查看服务状态

rpcbind (pid 27427) is running...

[root@nfs01 ~]# lsof -i :111 #查看端口号

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 27427 rpc 6u IPv4 40188 0t0 UDP *:sunrpc

rpcbind 27427 rpc 8u IPv4 40191 0t0 TCP *:sunrpc (LISTEN)

rpcbind 27427 rpc 9u IPv6 40193 0t0 UDP *:sunrpc

rpcbind 27427 rpc 11u IPv6 40196 0t0 TCP *:sunrpc (LISTEN)

[root@nfs01 ~]#

第5章 NFS服务企业案例配置实践

共享/data目录给172.16.1.0整个网段的主机读写,实现把nfs server上的/data目录共享给172.16.1.0整个网段的主机,且可读写。

5.1 在NFS Server端执行的操作

1)查看系统环境

[root@nfs01 ~]# cat /etc/redhat-release

CentOS release 6.7 (Final)

[root@nfs01 ~]# uname -r

2.6.32-573.el6.x86_64

编辑 /etc/exports

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

#data shared by wangtian at 20160424

/data 172.16.1.0/21(rw,sync)

~

~

~

~

~

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

#data shared by wangtian at 20160424

/data 172.16.1.0/21(rw,sync

平滑重启

[root@nfs01 ~]# /etc/init.d/nfs reload====》exportfs -rv

先进行域名解析,再挂载,速度就很快。

[root@nfs01 ~]# vi /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.loca

ldomain4

::1 localhost localhost.localdomain localhost6 localhost6.loca

ldomain6

172.16.1.5 lb01

172.16.1.6 lb02

172.16.1.7 web02

172.16.1.8 web01

172.16.1.51 db01

172.16.1.31 nfs01

172.16.1.41 backup

172.16.1.61 m01

把下面的IP与主机名加进去

然后进行挂载

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

查看挂载结果

[root@nfs01 ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 6.9G 1.5G 5.1G 23% /

tmpfs 242M 0 242M 0% /dev/shm

/dev/sda1 190M 36M 145M 20% /boot

172.16.1.31:/data 6.9G 1.5G 5.1G 23% /mnt

5.2 客户端

[root@nfs01 ~]# vi /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.loca

ldomain4

::1 localhost localhost.localdomain localhost6 localhost6.loca

ldomain6

172.16.1.5 lb01

172.16.1.6 lb02

172.16.1.7 web02

172.16.1.8 web01

172.16.1.51 db01

172.16.1.31 nfs01

172.16.1.41 backup

172.16.1.61 m01

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

Starting rpcbind: [ OK ]

[root@web01 ~]# showmount -e 172.16.1.31

Export list for 172.16.1.31:

/data 172.16.1.0/21

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

[root@web01 ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 6.9G 1.5G 5.1G 22% /

tmpfs 242M 0 242M 0% /dev/shm

/dev/sda1 190M 36M 145M 20% /boot

172.16.1.31:/data 6.9G 1.5G 5.1G 23% /mnt

[root@web01 ~]#

开始在nfs服务端写入文件

[root@nfs01 data]# cd /data/

[root@nfs01 data]# touch {a..z}

[root@nfs01 data]# ls

a c e g i k m o q s u w y

b d f h j l n p r t v x z

可以看到客户端已经同步了

[root@web01 mnt]# ls

a c e g i k m o q s u w y

b d f h j l n p r t v x z

此时客户端还不能写,权限不够,要回到服务端更改nfsnobody权限

[root@nfs01 data]# grep nfsnobody /etc/passwd

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

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

再回到客户端就可以写了

[root@web01 mnt]# rm -f *

[root@web01 mnt]# ls

[root@web01 mnt]# touch {1..3}

[root@web01 mnt]# ls

1 2 3

[root@web01 mnt]#

再到服务端查看

[root@nfs01 data]# ls

1 2 3

5.3 配置小结

服务端vim /etc/exports

#data shared by wangtian at 20160424

/data 172.16.1.0/21(rw,sync)

查看tail /etc/export

#data shared by wangtian at 20160424

/data 172.16.1.0/21(rw,sync)

平滑重启,优雅重启

/etc/init.d/nfs reload

域名解析(服务端,客户端都要解析)

cat >>/etc/hosts<<EOF
172.16.1.5      lb01
172.16.1.6      lb02
172.16.1.7      web02
172.16.1.8      web01
172.16.1.51     db01 db01.etiantian.org
172.16.1.31     nfs01
172.16.1.41     backup
172.16.1.61     m01
EOF

vi /etc/hosts

把ip 主机名追加进去

172.16.1.5 lb01

172.16.1.6 lb02

172.16.1.7 web02

172.16.1.8 web01

172.16.1.51 db01

172.16.1.31 nfs01

172.16.1.41 backup

172.16.1.61 m01

查看服务有没有

[root@nfs01 /]# showmount -e 127.0.0.1

不放心,可以自己挂载自己

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

然后df -h 查看

[root@nfs01 /]# df -h

客户端

查看有没有

[root@web01 ~]#showmount -e 172.16.1.31

然后挂载

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

在查看

[root@web01 ~]# df -h

在服务端

[root@nfs01 /]# cd /data/

[root@nfs01 data]# touch {a..z}

[root@nfs01 data]# ls

a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z

在客户端查看

[root@web01 ~]# ls /mnt/

a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z

如果想再客户端可以写,就要在服务端给相应目录权限

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

第6章 NFS服务的重点知识梳理

当多个NFS客户端访问服务器端的读写文件时,需要具有以下几个权限:

q NFS服务器/etc/exports设置需要开放可写入的权限,及服务端的共享目录权限。

q NFS服务器实际要共享的NFS目录权限具有可写入w的权限,及服务端本地目录的安全权限。

q 每台机器都对应存在和NFS摩恩配置UID的相同UID65534的nfsnobody用户(确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)。

只有满足上述三个条件,多个NFS客户端才能具有查看、修改、删除其他任意NFS客户端上传文件的权限,这在大规模的集群环境中作为集群共享存储时尤为重要。

第7章 NFS内核优化建议

下面是优化选项说明

q /proc/sys/net/core/rmem_default:该文件指定了接受套接字缓冲区大小的默认值(以字节为单位),默认设置:124928.

q /proc/sys/net/core/rmem_maxt:该文件指定了接受套接字缓冲区大小的最大值(以字节为单位),默认设置:124928.

q /proc/sys/net/core/rmem_default:该文件指定了发送套接字缓冲区大小的默认值(以字节为单位),默认设置:124928.

q /proc/sys/net/core/rmem_default:该文件指定了接受套接字缓冲区大小的最大值(以字节为单位),默认设置:124928.

上述文件对应的具体内核优化命令如下:

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

sysctl -p

第8章 企业生产场景NFS共享存储优化小结

q 硬件:sas/ssd磁盘,买多块,raid0/raid10。网卡吞吐量要大,至少千兆(多块bond)。

q NFS服务器端配置:/data 172.16.1.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534)

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

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

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

cat >>/etc/sysctl.conf<<EOF

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

执行sysctl -p生效。

q 如果卸载的时候提示“umount:/mnt:device is busy”,需要退出挂载目录再进行卸载,如果是NFS Server宕机了,则需要强制卸载,可执行umount -lf /mnt.

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

q 放进/etc/fstab生效的方法:chkconfig netfs on 让网卡先启动,再挂载

第9章 NFS系统应用的优缺点说明

NFS服务可以让不同的客户端挂载使用同一个共享目录,也就是将其作为共享存储使用,这样可以保证不同节点客户端数据一致性,在集群架构环境中经常会用到。如果是windows和linux混合环境的集群系统,可以用samba来实现。

优点:

q 简单,容易上手,容易掌握。

q NFS文件系统内数据是在文件系统之上的,即数据是能看见的。

q 部署快速,维护简单方便,且可靠那个,满足需求就是最好的。

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

q 服务非常稳定

局限:

q 存在单点故障,如果NFS Server宕机了,所有客户端都不能访问共享目录。这个在后期的课程会通过负载均衡及高可用方案弥补。

q 在大数据高并发的场合,NFS效率、性能有限(2千万/日一下PV的网站不是瓶颈,除非网站架构设计太差)。

q 客户端认证是基于IP和主机名的,权限要根据ID识别,安全性一般(用于内网则问题不大)。

q NFS数据时是明文的,NFS本事不对数据完整性做验证。

q 多台客户机器挂载一个NFS服务器时,连接管理维护麻烦(耦合度多高。)尤其NFS服务端出问题后,所有NFS客户端都处于挂掉状态(测试环境可使用autofs自动挂在解决,正式环境可修复NFS服务或强制卸载)

q 设计了同步(实时等待)和异步(解耦)的概念,NFS服务端和客户端相对来说就是耦合度有些高。网站程序也是一样,尽量不要耦合度太高,系统及程序架构师的重要职责就是为程序及架构解耦,让网站的扩展性变得更好。

应用建议:

大中小型网站(参考的2千万/日一下PV以下)线上应用,都有用武之地。门户站也会有应用,生产场景应该多把数据的访问往前推,即尽量把静态存储里的资源通过CDN或缓存服务器提供服务,如果没有缓存服务或架构不好,存储服务器数量再多也是扛不住压力的,而且用户体验会很差。

第10章 NFS细节详解

10.1 exports配置文件

exports配置文件格式:

NFS共享的目录 NFS客户端地址1(参1、参2...) 客户端地址(参1、参2...)

例:

/data 172.16.1.0/21(rw,sync)

参数含义:

NFS共享的目录:为NFS服务端要共享的实际目录,要用绝对路径,如(/data)。注意共享目录的本地权限,如果需要读写共享,一定要让本地目录被NFS客户端的用户(nfsnobody)可以读写。

NFS客户端地址:为NFS服务端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段地址,还可以用“*”来匹配所有客户端服务器,这里所谓的客户端一遍来说是前段的业务服务器,例如:web服务。

指定NFS客户端之地的配置详细说明

客户端地址

具体地址

说明

授权单一客户端访问NFS

10.0.0.30

一般强开下,生产环境中此配置不多。

授权整个网段可访问NFS

10.0.0.0/24

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

授权整个网段可访问NFS

10.0.0.*

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

授权某个域名客户端访问

nfs.oldboyedu.con

此方法生产环境中一般情况不常用

授权整个域名客户端访问

*.oldboyedu.com

此方法生产环境中一般情况不常用

提示:NFS默认配置文件/etc/exports其实是存在的,但是没有内容,需要自行配置。

10.2 NFS配置权限参数

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

参数名称

参数用途

rw

read-write,表示可读写权限

ro

read-only,表示只读权限

sync

请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。

优点:数据安全不会丢。缺点:性能比不启动该参数差

async

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

no_root_squash

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

all_squash

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

root_squash

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

anonuid

参数以anon*开头即指anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然也可以自行这个UID值。但是UID必须存在于/etc/passwd中。在多NFS Clients时,如多台web server共享一个NFS目录,通过这个参数可以使得不同的NFS Clients写入的数据对有所NFSClients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用,一般默认即可。

anongid

同anonuid,区别就是把uid(用户id)换成gid(组id)。

在生产中配置NFS的重要技巧:

1)确保所有客户端服务器对NFS共享目录具有相同的用户访问权限。

a.all_squash把所有客户端都压缩成固定的匿名用户(UID相同)。

b.就是anonuid,anongie指定的UID和GID的用户

2)所有的客户端和服务端都需要一个相同的UID和GID的用户,即nfsnobody(UID必须相同)

10.3 NFS常用路径

NFS常用路径

说明

/etc/exports

NFS服务主配置文件,配置NFS具体共享服务的地点,默认内容诶空。以行为单位。

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

#data shared by wangtian at 20160424

/data 172.16.1.0/21(rw,sync)

/usr/sbin/exportfs

NFS服务的管理命令。例如:可以加载NFS配置生效,还可以直接配置NFS共享目录,即无需配置/etc/exports实现共享。[root@nfs01 ~]#exportfs -rv加载配置生效,等价优雅重启(平滑重启)/etc/init.d/nfs reload

/usr/sbin/showmount

常用来在客户端,查看NFS配置及挂载结果的命令show mount information for an NFS server配置nfsserver,分别在服务端及客户端查看挂载情况。

/var/lib/nfs/etab

NFS配置文件的完整参数设定的文件(有很多没有配置但是默认就有的NFS参数)/var/lib/nfs/etab maset table of exports

/var/lib/nfs/xtab

适合C5.x记录曾经挂载过NFS客户端的信息,包括IP地址等,CentOS6.6没有此文件了。

/proc/mounts

客户端挂载参数[root@nfs01 ~]#grep mnt/proc/mounts

/var/lib/nfs/rmtab

客户端访问服务器exports的信息列表

[root@web01 ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 6.9G 1.5G 5.1G 23% /

tmpfs 242M 0 242M 0% /dev/shm

/dev/sda1 190M 36M 145M 20% /boot

172.16.1.31:/data 6.9G 1.5G 5.0G 23% /mnt

当服务端挂掉的时候,客户端df -h 会失效,此时就要使用mount查看挂载信息

第11章 本章重点回顾

q NFS服务的访问原理流程(会口述)*****

q NFS作为集群共享存储角色的搭建、部署。

q NFS作为集群共享角色的排障,高级优化(会口述)*****

q mount命令的知识及参数,如-o(noatime,nodirtime,noexec,nosuid,nodec,rsize,wsize)等。

q fstab文件的知识。

q 常用命令showmount,exportfs,umount(-lf),rpcinfo,

q NFS的优缺点,适合的应用场景*****

q 替代产品(Moosefs(mfs)、GlusterFS、FastDFS)*****。

q 了解autofs