1、NFS服务介绍

          1.1 什么是NFS?

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

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

1.2NFS应用场景

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

1.3架构图


              clip_image002

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

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

当没有NFS共享存储,用户访问图片的情况:

            clip_image004

            有NFS共享存储,用户访图片的情况

           clip_image006

2、 NFS系统原理介绍:

2.1 NFS原理图

             clip_image008

2.2 RPC服务

         NFS本身的服务没有提供文件传输的协议,但是NFS却能让我们进行文件的共享,其中的原因是NFS使用RPC协议。所以用到NFS的地方都需要启动RPC服务,不论是服务器端还是客户端,NFS和RPC的关系我们可以用下边这张图来理解。

          clip_image010

3 、NFS部署环境准备

3.1 NFS服务部署服务器准备

            clip_image012

3.2 检查模拟环境

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

CentOS release 6.6 (Final)

[root@nfs-server nfs]# uname -r

2.6.32-504.el6.x86_64

[root@nfs-server nfs]# uname -i

x86_64

3.3 修改服务器端客户端名字等信息

    3.3.1 nfs服务器端

           [root@root ~]# hostname nfs-server

           [root@root ~]# cat /etc/sysconfig/network

           NETWORKING=yes                                        

           HOSTNAME=nfs-server    

           [root@root ~]# cat /etc/hosts

           192.168.196.130 nfs-server

    3.3.2 nfs客户端

          [root@lroot ~]# hostname lamp01

          [root@root ~]# cat /etc/sysconfig/network

          NETWORKING=yes

          HOSTNAME=lamp01

          [root@root ~]# cat /etc/hosts

         192.168.196.131 lamp01

          [root@lroot ~]# hostname lamp02

          [root@root ~]# cat /etc/sysconfig/network

          NETWORKING=yes

          HOSTNAME=lamp02

          [root@root ~]# cat /etc/hosts

          192.168.196.128 lamp02

4、 NFS SERVER端配置

4.1 NFS软件列表

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


    • nfs-utils:NFS服务的主程序

    • nfs-utils-lib :NFS以来的库

    • rpcbind:Centos6.X下面RPC的主程序(CentOs5.X下面为portmap)

4.2 检查软件是否安装

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

4.3 安装软件:

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

4.4 配置rpcbind

      我们配置NFS服务器的时候需要先配置好rpcbind,并且启动时候也要先启动rpcbind

       4.4.1 查看nfs-ser的运行状态(rpcbind)

             [root@nfs-server ~]# /etc/init.d/rpcbind status

       4.4.2 启动rpcbind程序

            [root@nfs-server ~]# /etc/init.d/rpcbind restart

      4.4.3 将启动命令放置到/etc/rc.local开机启动脚本中

      4.4.4 检查开机自启动(rpcbind)

           [root@nfs-server ~]# chkconfig --list rpcbind

           rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off

clip_image014

      4.4.5 设置开机自启动

          [root@nfs-server ~]# chkconfig rpcbind on

     4.4.6 检查rpcbind是否运行

          [root@nfs-server ~]# /etc/init.d/rpcbind status

4.5 配置nfs主程序

      4.5.1 查看nfs运行状态

           [root@nfs-server ~]# /etc/init.d/nfs status

      4.5.2 启动nfs主程序

          [root@nfs-server ~]# /etc/init.d/rpcbind restart

注意:要保证rpcbind比nfs先启动,这里我们需要知道通过

[root@nfs-server ~]# less /etc/init.d/nfs和[root@nfs-server ~]# less /etc/init.d/rpcbind可以发现,就可以确定开机启动过程中他们启动的顺序。

     4.5.3 将启动命令放置到/etc/rc.local开机启动脚本中

     4.5.4 检查开机自启动(nfs)

           [root@nfs-server ~]# chkconfig --list nfs

           nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:of

     4.5.5 设置开机自启动

          [root@nfs-server ~]# chkconfig nfs on

     4.5.6 检查nfs是否运行

          [root@nfs-server ~]# /etc/init.d/nfs status

4.6 检查输出rpc信息

          [root@nfs-server ~]# rpcinfo -p

4.7 配置NFS配置文件

      4.7.1 NFS服务配置文件

          NFS服务的默认配置文件路径为:/etc/exports,并且默认是空的。

           [root@nfs-server ~]# ll /etc/exports

           -rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports

4.8 配置文件格式

     4.8.1 书写格式有两种


    • NFS共享的目录 NFS客户端地址1(参数1,参数2……) 客户端地址2(参数1,参数2……)

    • NFS共享的目录  NFS客户端地址(参数1,参数2……)

    4.8.2 我们可以通过man exports查看帮助,man手册中有举例

             [root@nfs-server ~]# man exports

      clip_image016

     这里给出一种配置文件举例

      clip_image018

4.9 格式参数说明:

      4.9.1 NFS共享的目录即就是NFS——SERVER端要共享的目录,这里是用data举例(首先准备共享的目录必须存在),

      4.9.2 客户端地址我们可以用指定Ip的主机,指定子网中的所有主机、指定域名的主机、指定域名的所有主机、所有主机。具体我们来看下边表格  。

                  image

      4.9.3 参数用于指定访问权限等主要有三类,参数是可选的,具体看下边表格。

            指定用户访问权限:

            

                  image

补充:只有这两种读写控制权限权限。

            用户映射选项

                  image



        其他选项:


                 image

补充:以上就是选项,其中标红的是常用的。配置过程中可以组合使用,生产中常见使用如下配置:


clip_image018[1]

clip_image020 

4.10 检查配置文件语法是否正确

        [root@nfs-server ~]# exportfs -rv

       exporting 192.168.196.0/24:/data

4.11 配置文件权限信息:

      配置完成后我们可以在下边文件中查看共享目录的信息

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

clip_image022

到这里NFS服务器端就配置成功了,我们这里就可以测试一下是否配置成功。

5 NFS CLIENT端配置

5.1 NFS软件列表

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

  • nfs-utils:NFS服务的主程序

  • nfs-utils-lib :NFS以来的库

      rpcbind:Centos6.X下面RPC的主程序(CentOs5.X下面为portmap)

5.2 NFS客户端的nfs和rpcbind服务配置过程和SERVER端过程一样。

     这里不做具体阐述,到这里我们的客户端已经启动了rpcbind服务(客户端不需要启动nfs服务,但是需要安装)。

5.3 检查rpcbind是否启动

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

       rpcbind (pid 1204) is running...

5.4 显示NFS服务器的安装信息

       [root@lamp01 ~]# showmount -e 192.168.196.130

       Export list for 192.168.196.130:

      /data 192.168.196.0/24

5.5 NFS客户端挂载

      5.5.1 挂载的格式

      clip_image024

     5.5.2 建立挂载目录

              [root@lamp01 ~]# mkdir -p /mnt/nfs

      5.5.3 挂载

             [root@lamp01 ~]# mount -t nfs 192.168.196.130:/data /mnt/nfs/

     5.5.4 检查是否挂载成功

            [root@lamp01 ~]# df -h

       clip_image026

             [root@lamp01 ~]# mount

        clip_image028

      5.5.5 将挂载信息写入/etc/rc.local脚本

               [root@lamp01 ~]# cat /etc/rc.local

        clip_image030

到这里我们的NFS服务就配置完毕。

6 测试配置结果

6.1 检查客户端向nfs目录下写入文件是否可以。、

到这里我们的配置还没有完成。我们在测试过程中会发现按照上边的权限,客户端不能向文件中写入内容。这里我们还需要配置一些文件。

7 补充配置在NFS服务器SERVER端

7.1 配置说明

按照上边写的的NFS服务器端给的配置文件,我们只指定了读写权限、同步权限、和用户匿名映射权限。我们来看配置文件:

clip_image032

        查看配置参数的用户映射信息参数作用,我们就会知道,我们不管客户端使用什么身份访问就会将权限压缩为匿名用户劝降访问,也就是配置文件uid为65534的用户和gid为65534的用户组权限访问。所以就需要把该共享目录的属组改为65534的用户,甚至属组也改为65534。

7.2 配置

      7.2.1 查看data的信息

              [root@nfs-server nfs]# ls -ld /data

        clip_image034

     7.2.2 查看这个用户是谁?

             [root@nfs-server nfs]# grep 65534 /etc/passwd

       clip_image036

      7.2.3 更改共享目录的属组

              [root@nfs-server nfs]# chown -R nfsnobody /data

      7.2.4 检查配置结果

              [root@nfs-server nfs]# ls -ld /data

        clip_image038

到这里,就可以使用了。

8 常见配置错误

8.1 客户端没有装nfs/rpcbind程序

8.2 服务器端没有启动服务

8.3 客户端/服务器端防火墙没有关闭。

     NFS服务一般用于内网,所以关闭掉防火墙没有多大影响,性能有很大提升。

8.4 服务器端启动顺序不正确(rpcbind必须比nfs启动早)。

8.5 排错思路:

     8.5.1 ping 服务器ip是否通,不通检查是否与服务器在同一个局域网,自己网络是否配置好。

     8.5.2 ping通的,telnet 服务器ip 端口号(111)检查端口是否开。

       clip_image040

                  出现上边信息说明正确。否则检查端口号。

                  如果信息正确,还是挂载失败,检查防火墙患有selinux是否关闭。

9 NFS优化

9.1 硬件优化

     配置NFS配置服务器时尽可能的选择:

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

9.2 NFS服务器端配置

     [root@nfs-server ~]# cat /etc/exports

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

9.3 NFS客户端挂载:risise、wsize、noatime、nodirtime、nosuid、noxexc、soft(hard,intr)

      [root@lamp01~]#mount -t nfs -o nosuid,noexec,noatime,nodiratime,rsize=131072,wsize=131072 192.168.196.130:/data /mnt/nfs

      [root@lamp01 ~]# mount -t nfs -o noatime,nodiratime,rsize=131072,wsize=131072 192.168.196.130:/data /mnt/nfs

      [root@lamp01 ~]# mount -t nfs -o noatime,nodiratime 192.168.196.130:/data /mnt/nfs

9.4 有关NFS服务的所有服务器内核优化

      clip_image042

10 补充

10.1 NFS客户端可写的服务端配置条件

       当多个NFS客户端以NFS方式写入修改服务器端的文件系统时,需要具有以下个权限:

               a) NFS服务器/etc/exports设置需要开放可写入的权限,即服务端的共享权限

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

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

          当满足上述三个条件,多个NFS客户端才能具有互相写入,互相修改其他主机写入文件的权限,这在开篇讲解过的大规模集群环境,作为集群共享存储时尤为注意。

到这步为止,NFS服务端一个NFS共享目录/data共享给10.0.0.0/24 内主机可读写就配置完了。下面还需要在客户端主机挂载服务端共享的/data,才可以在客户端真正读写到该共享目录。

10.2 NFS与挂载优化

      10.2.1 挂载的格式

                 clip_image043

     10.2.2 mount优化

                     下边是mount -o参数对照表


                  image

      10.2.3 NFS客户端mount挂载优化

           某网友问:在企业生产环境中,NFS客户端挂载有没有必要加参数,比如加noexec、nosuid、nodev. bg、soft. rsize、 wsize 等参数, 我看书上说建议挂,rsize,wsize 这两个是缓存参数,是否也建议加呢?老师你在生产环境中是怎么做的?
        解答:这个问题属于mount挂载优化内容(有些参数也适合其它文件系统),一般来.说要适当加挂载参效,但是,最好是做好测试,用数据来说话,到底是挂我还是不挂载。

      10.2.3.1 有关系统安全挂载参数选项

        在企业工作场景,一般来说,NFS服务器共享的只是普通静态数据(图片、附件、视频), 不需要执行suid、exec 等权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性,例如:很多×××篡改站点文件都是由上传入口上传的程序到存储目录,然后执行的。 因此在挂载的时候,用下面的命令很有必要:

安全挂载参数:

                 [root@lamp01 ~]# mount -t nfs -o nosuid,noexec,noatime,rw 192.168.196.130:/data /mnt/nfs

         通过mount -o指定挂载参数和在/etc/fstab里指定挂载参数效果时一样的。网络文件系统和本地文件系统效果是一样的。

     10.2.3.2 mount 挂载性能优化参数选项

                  禁止更新目录及文件时间挫挂载

                    [root@lamp01 ~]# mount -t nfs -o noatime,nodiratime 192.168.196.130:/data /mnt/nfs

                 安全加优化的挂载方式

                   [root@lamp01~]#mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 192.168.196.130:/data /mnt/nfs

                 默认挂载方式

                  [root@lamp01~]#mount -t nfs 192.168.196.130:/data /mnt/nfs

注意:以具体业务需要实际测试选择挂载参数

      10.2.4 NFS内核优化相关建议

                 NFS内核优化相关建议

       优化说明:

            clip_image045

         上述文件对应的具体的优化命令:

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

            net.core.wmem_default = 8388608

             net.core.remem_default = 8388608

             net.core.rmem_max = 16777216

             net.core.wmem_max = 16777216

             EOF

执行sysctl -p生效

     10.2.5 如果卸载的时候提示:umount:/mnt/nfs:device is busy

                 需要退出挂载目录再进行卸载,或者是NFS Server宕机了,需要强行卸载,则是使用下边命令解决:

                 [root@lamp01~]#umount -lf /mnt/nfs

      10.2.6 大型网站NFS网络文件系统替代软件:

             分布式文件系统Moosefs(mfs)、glusterfs,FastDFS。