NFS网络文件共享服务

NFS用来做什么

以下说明节选自,老男孩相关书籍:

  • 在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享里,如BBS产品的图片、附件、头像(注意网站BBS程序不要放NFS共享里),然后前端所有的节点访问这些静态资源时都会读取NFS存储上的资源。
  • NFS是当前互联网系统架构中最常用的数据存储服务之一,中小型网站公司应用频率更高,大公司或门户除了使用NFS外,还可能会使用更为复杂的分布式文件系统,比如Moosefs(MFS)、GlusterFS、FastDFS等,阿里云等公有云平台的NAS就是云化后的NFS服务应用。
  • NFS作为所有前端Web服务的共享存储,存储内容一般包括网站用户上传的图片、附件、头像等。注意, 网站的程序代码不要放NFS共享里,因为网站程序是开发运维人员统一发布的,不存在发布延迟问题,直接批量发布到Web节点提供访问比共享到NFS里访问效率更高。

NFS系统原理简介

  • NFS在传输数据时使用的端口会随机选择,NFS客户端发现NFS服务器端传输端口是通过RPC(Remote Procedure
    Call,中文意思远程过程调用)协议/服务来实现。
  • NFS的RPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端发出请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口上去,达到实现数据传输、交互数据目的。这个RPC服务类似NFS服务器端和NFS客户端之间的一个中介。
  • RPC服务又是如何知道每个NFS端口:当NFS服务器端启动服务时会随机取用若干端口,并主动向RPC服务注册取用的相关端口及功能信息,如此一来,RPC服务就知道NFS每个端口对应的NFS功能了,然后RPC服务使用固定111端口来监听NFS客户端提交的请求,并将正确的NFS端口信息回复给请求的NFS客户端,这样一来,NFS客户端就可以与NFS服务器端进行数据传输。
  • 启动NFS Server之前,首先要启动RPC服务(CentOS6/7环境下为rpcbind服务,下同)否则NFS Server就无法向RPC服务注册了。另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时RPC服务管理的NFS程序也需要重新启动以重新向RPC注册。要特别注意,修改NFS配置文件后是不需要重启NFS的,直接在命令行执行systemctl reload nfs或exportfs -rv即可使修改的/etc/exports生效。

NFS服务端部署环境准备

这里使用CentOS Linux release 7.8.2003 (Core)

NFS服务器端的安装启动

  • 要部署NFS服务,需要安装以下软件包:使用yum安装即可
    ❑ nfs-utils:NFS服务的主程序,包括rpc.nfsd、rpc.mountd这两个daemons和相关文档说明,以及执行命令文件等。
    ❑ rpcbind:CentOS6/7环境下RPC主程序。NFS可视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的映射工作,这个映射工作就是由rpcbind服务来完成的。因此,在提供NFS服务之前必须先启动rpcbind服务才行。

启动NFS相关服务

  • 启动rpcbind服务
    在这里插入图片描述
    同时使用 systemctl enable rpcbind 命令设置rpcbind服务自启动
  • 启动NFS服务
    启动NFS服务的命令: systemctl start nfs
    设置自启动: systemctl enable nfs

NFS服务常见进程详解说明

  • 运行NFS服务默认需要启动的服务或进程有NFS daemon、NFS
    mountd(rpc.mountd)、rpc.statd、rpc.idmapd等。可以通过执行如下命令查看启动NFS后系统中运行的NFS相关进程: ps -ef | egrep “rpc|nfs”

  • NFS服务的主要任务是共享数据,而数据的共享离不开权限问题。所以NFS服务器启动时最少需要两个不同的进程,一个是管理NFS客户端是否能够登录的rpc.nfsd主进程,另一个管理NFS客户端是否能够取得对应权限的rpc.mountd进程。如果还要管理磁盘配额,则NFS还需要加载rpc.rquotad进程。
    在这里插入图片描述
    对以上进程查看,均可以执行“man进程名”命令,如“manrpc.idmapd”。

配置NFS服务器端

  • NFS服务的默认配置文件路径为/etc/exports,并且默认该文件是空的。提示:NFS默认配置文件/etc/exports其实是存在的,但是没有内容,需要用户自行配置。
  • exports配置文件格式
    /etc/exports文件的两种格式如下:
    NFS共享目录NFS客户端地址1(参1,参2….)客户端地址2(参1,参2….)
    NFS共享目录NFS客户端地址(参1,参2….)

    查看exports语法文件格式帮助的方法为:执行man exports命令,然后切换到文件结尾,可以快速看如下样例格式
    在这里插入图片描述
    上述各列参数的含义如下:
    1)NFS共享目录:为NFS服务器端要共享的实际目录,要用绝对路径,如(/data)。注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。
    2)NFS客户端地址:为NFS服务器端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段地址,还可以用“*”来匹配所有客户端服务器。指定NFS客户端地址的配置详细说明如下表

在这里插入图片描述
3)权限参数集:对授权的NFS客户端的访问权限设置, NFS配置权限设置常用参数说明:如下
更详细的说明应使用man命令查看在这里插入图片描述

  • 常见的NFS exports配置实例
    在这里插入图片描述
    以“配置例一”为例进行说明,说明如下:
    ❑ /data为要共享的NFS服务器端的目录,注意,被共享的目录一定要用绝对路径。
    ❑ 172.16.1.0/24表示允许NFS客户端访问共享目录的网段范围。24表示255.255.255.0。
    ❑ (rw, sync) rw表示允许读写,sync表示数据同步写入到NFS服务器端的硬盘中。
    ❑ 也可用通配符*替换IP地址,表示允许所有主机,也可以写成10.0.0.*的形式。

  • 配置好NFS服务后,通过cat /var/lib/nfs/etab命令可以看到NFS配置的参数以及系统默认自带的参数

[root@nfs ~]# cat /var/lib/nfs/etab 
/data	192.168.124.0/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)
#可以结合以上的图表查看参数的具体说明

NFS服务配置案例实践

实例:共享/data目录给192.168.3.0/24整个网段的主机,可读写。

  • 在NFS Server端执行的操作
    1)启动rpcbind及NFS服务,然后加入开机自启动
    2)创建需要共享的目录并授权(工作中这里的/data应该是已存在的目录):

    [root@nfs ~]# mkdir -p /data   #创建共享目录
    [root@nfs ~]# chown -R nfsnobody.nfsnobody /data  #授权给nfsnobody用户和nfsnobody组管理
    #这里要把共享目录的权限分配和nfs的默认用户,是因为不这样设置nfs客户端访问时无法通过nfs本地共享目录权限写入数据。
    

    3)配置NFS服务配置文件,并在本地查看挂载信息情况:

    [root@nfs ~]# cat /etc/exports
    #shared /data by test for students
    /data 192.168.3.0/24(rw,sync)
    [root@nfs ~]# systemctl reload nfs      #平滑重启,或者说重载
    [root@nfs ~]# showmount -e localhost    #查看看本地挂载
    Export list for localhost:
    /data 192.168.3.0/24
    [root@nfs ~]# 
    

    4)把本地服务器端作为客户端进行挂载测试,执行的命令和结果如下:

    [root@nfs ~]# mount -t nfs 192.168.3.96:/data /mnt
    [root@nfs ~]# df -h
    文件系统                 容量  已用  可用 已用% 挂载点
    devtmpfs                 475M     0  475M    0% /dev
    tmpfs                    487M     0  487M    0% /dev/shm
    tmpfs                    487M   14M  473M    3% /run
    tmpfs                    487M     0  487M    0% /sys/fs/cgroup
    /dev/mapper/centos-root   17G  2.3G   15G   14% /
    /dev/sda1               1014M  137M  878M   14% /boot
    tmpfs                     98M     0   98M    0% /run/user/0
    192.168.3.96:/data        17G  2.3G   15G   14% /mnt
    [root@nfs ~]# 
    
    

    根据提示挂载是成功的,至此,NFS服务器端配置完毕。

  • 在此过程中,需要注意以下两点:
    1)上文中的配置/oldboy 172.16.1.0/24(rw, sync),其中“24”和“(”之间不能有空格。
    2)修改/etc/exports后,需执行systemctl reload nfs或exportfs -r重新加载配置,但不要重启NFS。尤其是在生产环境中。

在NFS Client端执行的操作

  • 在所有的NFS Client上执行的操作都是相同的,具体操作如下:
    1)检查CentOS7.8系统环境
    2)安装客户端软件rpcbind:

    [root@wen01 ~]# yum install rpcbind -y 
    [root@wen01 ~]# rpm -qa rpcbind
    rpcbind-0.2.0-49.el7.x86_64
    

    为了使用showmount命令功能,所有客户端最好都要安装NFS软件,不安装可以以挂载。

    [root@wen01 ~]# rpm -qa nfs-utils
    nfs-utils-1.3.0-0.68.el7.x86_64
    [root@wen01 ~]# 
    

    3)启动RPC服务(注意,因为是客户端,所以无须启动NFS服务)。
    systemctl start rpcbind

    4)挂载NFS共享目录/data

    [root@wen01 ~]# showmount -e 192.168.3.96     #查看挂载权限
    Export list for 192.168.3.96:
    /data 192.168.3.0/24
    [root@wen01 ~]# mount -t nfs 192.168.3.96:/data /mnt   #挂载
    
    

    5)从客户端Web01测试读写NFS服务器端数据。

    	[root@wen01 ~]# cd /mnt/
    	[root@wen01 mnt]# ll			#查看挂载目录
    	总用量 4
    	-rw-r--r-- 1 root root  0 514 15:49 1.txt
    	-rw-r--r-- 1 root root  0 514 15:49 2.txt
    	-rw-r--r-- 1 root root  0 514 15:49 3.txt
    	-rw-r--r-- 1 root root  0 514 15:49 4.txt
    	-rw-r--r-- 1 root root  0 514 15:49 5.txt
    	-rw-r--r-- 1 root root 36 514 16:02 test.txt
    	[root@wen01 mnt]# touch test1.txt   #查看写权限
    	[root@wen01 mnt]# ll
    	总用量 4
    	-rw-r--r-- 1 nfsnobody nfsnobody  0 514 15:49 1.txt
    	-rw-r--r-- 1 nfsnobody nfsnobody  0 514 15:49 2.txt
    	-rw-r--r-- 1 nfsnobody nfsnobody  0 514 15:49 3.txt
    	-rw-r--r-- 1 nfsnobody nfsnobody  0 514 15:49 4.txt
    	-rw-r--r-- 1 nfsnobody nfsnobody  0 514 15:49 5.txt
    	-rw-r--r-- 1 nfsnobody nfsnobody  0 529 10:48 test1.txt
    	-rw-r--r-- 1 nfsnobody nfsnobody 36 514 16:02 test.txt
    

    用户和组都是nfsnobody默认所有的客户端读写都会被压缩成UID为65534的nfsnobody用户和组。

常用的重点NFS服务文件或命令。

在这里插入图片描述

NFS客户端挂载排错

  • 当NFS客户端挂载出现故障时,首先把本地服务器端作为客户端进行挂载测试。
    提示:这步主要检查服务器端的NFS服务自身是不是正常。
  • 如果环境准备不当可能会遇到如下两个报错。
    第一个报错在这里插入图片描述
    这个报错往往是由防火墙未关闭也未正确设置导致的,检查办法如下:
    1)从客户端ping NFS服务端IP,目的是看物理链路是否通畅。
    2)从客户端telnet服务器端IP端口检查,用于测试NFS服务(RPC服务)是否通畅。
    第二个报错
    在这里插入图片描述
    解答:“RPC:Program not registered”提示很清楚了,是服务器端RPC服务和NFS服务存在启动顺序问题,即需要先启动rpcbind,后启动NFS。

NFS客户端挂载命令参数说明

  • 在NFS服务器端可以通过cat/var/lib/nfs/etab查看NFS服务器端配置参数的细节。在NFS客户端可以通过cat/proc/mounts查看mount的挂载参数细节。
    mount命令的-o选项后面可以接的参数,注意,有些选项只有出现在/etc/fstab里才有效,下面这些选项可以应用在绝大多数文件系统上,但是sync仅适合ext2、ext3、fat、vfat和ufs等文件系统。
    ❑ async:涉及文件系统I/O的操作都是异步处理,即不会同步写入磁盘,此参数会提高性能,但会降低数据安全性。一般情况下,生产环境不推荐使用。除非是在对性能要求很高,对数据可靠性不要求的场合。※
    ❑ sync:该参数和async相反。有I/O操作时都会同步处理I/O,即把数据同步写入硬盘。此参数会牺牲一点I/O性能,但是,换来的是断电后数据的安全性。
    ❑ atime:在每一次数据访问时,会同步更新访问文件的inode时间戳,是默认选项。
    ❑ ro:以只读的方式挂载一个文件系统。
    ❑ rw:以可写的方式挂载一个文件系统。※
    ❑ auto:能够被自动挂载通过-a选项。
    ❑ noauto:不会自动挂载文件系统。
    ❑ defaults :这是fstab里第4列挂载参数的默认值,包括rw、suid、dev、exec、auto、nouser、async,默认情况下大部分参数都是默认值。
    ❑ exec:允许文件系统执行二进制文件,取消这个参数,可以提升系统安全性。
    ❑ noexec:在挂载的文件系统中不允许直接执行任何二进制的程序,注意,仅对二进制程序有效,即使设置了noexec、shell,php程序还是可以执行的。※
    ❑ noatime:访问文件时不更新文件的inode时间戳,高并发环境下推荐显式应用该选项,可以提高系统I/O性能。※
    ❑ nodiratime:不更新文件系统上的directory inode时间戳,高并发环境下推荐显式应用该选项,可以提高系统I/O性能。※
    ❑ nosuid:不允许特殊权限suid和sgid位生效,以提升安全性。※
    ❑ suid:允许suid和sgid位生效。
    ❑ nouser:禁止一个普通用户挂载该文件系统,这是默认挂载时的默认选项。
    ❑ remount:尝试重新挂载一个已经挂载了的文件系统,通常被用来改变一个文件系统的挂载标志,使得一个只读文件系统变得可写,这个动作不会改变设备或者挂载点。当系统故障进入single或rescue模式修复系统时,会发现根文件系统经常会变成只读文件系统,不允许修改,此时该命令就派上用场了。具体命令为:mount -o remount, rw/,表示将根文件系统重新挂载使其可写。single或rescue模式修复系统时这个命令十分重要。※
    ❑ dirsync:目录更新时同步写入磁盘。
    其中,标有※的为性能优化重要选项,一般情况下,安全参数和性能参数是对立的,即越安全,性能就越差。

NFS客户端挂载优化

  • 于mount挂载优化问题(有些参数也适合其他文件系统),一般来说要适当加挂载参数,但是,最好是先做好测试,用数据来说话,才能更好地确定到底是挂载还是不挂载。
  • 有关系统安全挂载参数选项
    工作场景中,一般来说,NFS服务器共享的只是普通静态数据(图片、附件、视频),不需要执行suid、exec等权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性。
    在这里插入图片描述
    通过mount -o指定挂载参数和在/etc/fstab里指定挂载参数的效果是一样的。
  • 挂载性能优化参数选项
    NFS网络文件系统优化挂载的参数建议。在这里插入图片描述
    这里只是参考书籍中的建议,还应该具体问题具体分析。
  • NFS内核优化建议
    下面是优化选项说明。
    ❑ /proc/sys/net/core/rmem_default:该文件指定了接收套接字缓冲区大小的默认值(以字节为单位),默认设置:124928。
    ❑ /proc/sys/net/core/rmem_max:该文件指定了接收套接字缓冲区大小的最大值(以字节为单位),默认设置:124928。
    ❑ /proc/sys/net/core/wmem_default:该文件指定了发送套接字缓冲区大小的默认值(以字节为单位),默认设置:124928。
    ❑ /proc/sys/net/core/wmem_max:该文件指定了发送套接字缓冲区大小的最大值(以字节为单位),默认设置:124928。上述文件对应的具体内核优化命令如下:
    在这里插入图片描述

生产场景下NFS共享存储优化小结

1)硬件:SAS/SSD磁盘,购买多个,硬件RAID,制作RAID5或RAID10。网卡吞吐量要大,至少千兆(多块Bond)。
2)NFS服务器端指定特定UID/GID配置:
在这里插入图片描述
这里使用cetnos7.8版本系统搭建nfs的时候UID和GID默认就是65535。
3)NFS客户端挂载优化配置命令如下:
在这里插入图片描述
4)对NFS服务的所有服务器内核进行优化时,执行如下命令:
在这里插入图片描述
执行sysctl -p生效。
5)如果卸载的时候提示“umount: /mnt: device is busy”,需要退出挂载目录再进行卸载,如果是NFS Server宕机了,则需要强制卸载,可执行umount -lf /mnt。
6)大型网站NFS网络文件系统的替代软件为分布式文件系统MooseFS、GlusterFS、FastDFS等。(这里的相关内容还没有接触过,有待学习)

NFS客户端开机自启动挂载

配置客户端mount挂载命令使挂载开机自动执行,这里有如下两种方法:

  1. 将挂载命令放在/etc/rc.local里。
    [root@backup ~]# cat /etc/rc.local 
    #!/bin/bash
    # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
    #
    # It is highly advisable to create own systemd services or udev rules
    # to run scripts during boot instead of using this file.
    #
    # In contrast to previous versions due to parallel execution during boot
    # this script will NOT be run after all other services.
    #
    # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
    # that this script will be executed during boot.
    
    touch /var/lock/subsys/local
    /bin/mount -t nfs 192.168.3.96:/data /mnt
    [root@backup ~]# ^C
    
    
    缺点:可能偶尔开机挂载不上,工作中除了开机自启动配置,还要对是否挂载进行监控。
  2. 将挂载命令放在/etc/fstab里。
    NFS网络文件系统最好不要放到fstab里实现开机挂载。

NFS服务端宕机后给NFS客户端带来的问题

  • 多台客户机挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。尤其是NFS服务器端出问题后,所有NFS客户端都处于挂掉状态(测试环境可使用autofs自动挂载解决,正式环境可修复NFS服务或强制卸载)。NFS服务器宕机后,在客户端访问挂载点会处于挂掉状态,甚至早期系统执行Ctrl+C都无法退出,CentOS7客户端还可能无法重启,这个问题的解决方法有以下几种:1)在cat
    /proc/mounts找到挂载点,然后执行umount -lf
    /data方式卸载即可。2)在mount挂载时增加soft或者intr,不让客户端持续呼叫NFS服务器。3)如果是fstab里实现的挂载则可在第4列defaults后面增加soft或者intr
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值