欢迎大家访问我的博客:blog.54newpower.top

NFS存储服务及部署

NFS存储服务简介:

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

NFS优缺点:

优点:

  1. 实现数据的共享存储
  2. 便于数据操作管理
  3. 节省购买服务器磁盘开销

缺点:

  • 没有认证功能 分布式存储/ftp/samba
  • 无法支持高并发存储 日PV 2000万
  • 无法实现高可用 分布式存储/keepalived

NFS工作方式:

  1. 在nfs服务端创建共享目录

  2. 通过mount 网络挂载,将NFS服务端共享目录挂载到NFS客户端本地目录上。

  3. NFS客户端挂载目录上创建、删除、查看数据操作,等价于在服务端进行创建、删除、查看数据操作。

NFS的两个重要服务

由于NFS服务启动产生的进程服务端口号都是随机的,因此NFS的各项功能都需要向RPC服务(rpcbind服务)注册,所以只有RPC服务才能获取到NFS服务的各项功能对应的端口号(port number)、PID、NFS在主机所监听的IP等信息,而NFS客户端也只能通过向RPC服务询问才能找到正确的端。也就是说,NFS需要有RPC服务的协助才能成功对外提供服务。说白了,PRC相当与一个中介,NFS相当与是房东,当有新的租房信息发布时,房东会告诉中介,房客一般是联系中介来租房的。

NFS工作原理

服务端:

  1. 启动rpc服务,开启111端口
  2. 启动nfs服务
  3. 实现nfs服务进程和端口好的注册
    ps:产看nfs服务的注册信息
    rpcinfo -p 172.16.1.31
    [root@web01 /mnt]#rpcinfo -p 172.16.1.31
    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
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  43152  status
    100024    1   tcp  60675  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  40594  nlockmgr
    100021    3   udp  40594  nlockmgr
    100021    4   udp  40594  nlockmgr
    100021    1   tcp  41770  nlockmgr
    100021    3   tcp  41770  nlockmgr
    100021    4   tcp  41770  nlockmgr

    客户端:

  4. 建立TCP网络连接
  5. 客户端执行挂载命令,进行远程挂载
  6. 可以实现数据远程传输存储

NFS服务的安装与部署

服务端的配置

检查软件是否安装

rpm -qa|grep -E "nfs|rpc"
yum install -y nfs-utils rpcbind
rpm -qa nfs-utils 
rpm -qa rpcbind

注意:nfs和rpc的软件名

编写配置文件

vim /etc/exports
#输入以下内容
/data   172.16.1.0/24(rw,sync)
#/data 共享目录
#允许存储数据网段信息
#rw 读写
#rsync同步存储数据

创建共享目录并授权

mkdir /data
chown nfsnobody.nfsnobody /data
ls -ld /data

启动服务

先启动rpc服务

systemctl start rpcbind.service 
systemctl enable rpcbind.service
systemctl status rpcbind.service 
systemctl is-enabled rpcbind.service
[root@nfs01 ~]#systemctl start rpcbind
[root@nfs01 ~]#systemctl enable rpcbind
[root@nfs01 ~]#systemctl status rpcbind
● rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-05-03 23:28:06 CST; 7h left
 Main PID: 964 (rpcbind)
   CGroup: /system.slice/rpcbind.service
           └─964 /sbin/rpcbind -w

May 03 23:28:05 nfs01 systemd[1]: Starting RPC bind service...
May 03 23:28:06 nfs01 systemd[1]: Started RPC bind service.
[root@nfs01 ~]#systemctl is-enabled rpcbind
enabled

再启动nfs服务

systemctl start nfs
systemctl enable nfs
systemctl status nps
systemctl is-enabled nfs
[root@nfs01 ~]#systemctl start nfs
[root@nfs01 ~]#systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@nfs01 ~]#systemctl status nfs
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
  Drop-In: /run/systemd/generator/nfs-server.service.d
           └─order-with-mounts.conf
   Active: active (exited) since Sun 2020-05-03 15:45:02 CST; 19s ago
 Main PID: 1779 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

May 03 15:45:02 nfs01 systemd[1]: Starting NFS server and services...
May 03 15:45:02 nfs01 systemd[1]: Started NFS server and services.
[root@nfs01 ~]#systemctl is-enabled nfs
enabled

客户端的配置

安装nfs-utils,使客户端可以识别nfs挂载方式

yum install -y nfs-utils
rpm -qa|grep "nfs-utils"

实现远程挂载共享目录

mount -t nfs 172.16.1.31:/data  /mnt

nfs服务端详细配置说明

实现多个网段主机可以进行挂载

第一种方法:

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

第二种方法:

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

影响NFS 服务存储权限的因素

(1)服务端配置文件参数 exports文件里ro/rw参数
(2)服务端本身目录权限
(3)服务端共享目录权限存在继承关系 例如:/data,/data/r
PS:建议设置共享目录时,不要存在父级与子级关系
(4)客户端挂载参数是否为 ro

NFS服务配置参数

NFS配置参数权限
rw   -- 存储目录是否有读写权限
ro   -- 存储目录是否时只读权限
sync   -- 同步方式存储数据 直接将数据保存到磁盘(数据存储安全)
async  -- 异步方式存储数据 直接将数据保存到内存(提高数据存储效率)
no_root_squash  -- 不要将root用户身份进行转换   
root_squash     -- 将root用户身份进行转换
all_squash      -- 将所有用户身份都进行转换 
no_all_squash   -- 不要将普通用户身份进行转换

企业互联网公司如何配置NFS 各种squash参数

保证网站存储服务器用户数据安全性:
no_all_squash  需要进行配置   共享目录权限为www(确保客户端用户 服务端用户 uid数值一致)
root_squash    需要进行配置   root---nfsnobody    data目录---www

以上默认配置(很多服务默认配置都是从安全角度出发)

如何查看nfs默认配置
cat /var/lib/nfs/etab    --- 记录nfs服务的默认配置记录信息
[root@nfs01 ~]#cat /var/lib/nfs/etab
/data   172.16.1.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)
如何让root用户可以操作管理www用户管理的data目录
anonuid=65534,anongid=65534    --- 可以指定映射的用户信息
#修改映射用户:www=1002
/data   172.16.1.0/24(rw,sync,anonuid=1002,anongid=1002)

企业中如何编辑nfs配置文件

  1. 通用方法
    /data   172.16.1.0/24(rw,sync)
  2. 特殊情况 (让部分人员不能操作存储目录 可以看目录中的数据)
    /data   10.0.0.0/24(ro,sync)
  3. 修改默认的匿名用户
    /data   10.0.0.0/24(ro,sync,anonuid=xxx,anongid=xxx)
    #注:服务端普通用户的uid要与客户端普通用户的uid相同

    nfs服务问题:

    nfs服务器重启,挂载后创建数据比较慢
    服务器重启方式不正确
    服务重启:
    restart 重启服务 强制断开所有连接 用户感受不好
    reload 重启服务(平滑重启) 强制断开没有数据传输的连接 提升用户感受

    nfs客户端详细配置说明

    挂载命令:

    mount -t nfs 172.16.1.31:/data  /mnt

    如何实现自动挂载:

  4. 利用rc.local
    echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
    #文件要有执行权限
  5. 利用fstab文件
    vim /etc/fstab
    172.16.1.31:/data /mnt nfs defaults 0 0
    #实现fstab文件挂载自动加载nfs存储目录 必须让remote-fs.target服务开机自启
    #centos7  必须启动   remote-fs.target 
    #centos6  必须启动   netfs

    客户端如何卸载

umount -lf /mnt  
#-l  不退出挂载点目录进行卸载  
#-f  强制进行卸载操作
#PS:需求问题:如何找到一台服务器开机运行了哪些服务
ll /etc/systemd/system/multi-user.target.wants/

挂载参数

rw --- 实现挂载后挂载点目录可读可写 (默认)
ro --- 实现挂载后挂载点目录可读可写
suid --- 在共享目录中可以让setuid权限位生效 (默认)
nosuid --- 在共享目录中可以让setuid权限位失效 提供共享目录的安全性
exec --- 共享目录中的执行文件可以直接执行
noexec --- 共享目录中的执行文件可以无法直接执行 提供共享目录的安全性
auto --- 可以实现自动挂载 mount -a 实现加载fstab文件自动挂载
noauto --- 不可以实现自动挂载
nouser --- 禁止普通用户可以卸载挂载点设定此文件系统是否允许让普通用户使用 mount 执行实现挂载,默认是不允许(nouser),仅有 root 可以
user --- 允许普通用户可以卸载挂载点

挂载常见错误

ls: cannot open directory .: Stale file handle (文件句柄错误)
出现原因: 当父级和子级目录同时进行挂载时,一旦父级目录取消共享,但是客户端还是处于挂载状态
问题解决: 将和父级目录有关的所有挂载点全部卸载,重新挂载

Cannot register service: RPC: Unable to receive;
出现原因: 服务启动顺序不正确
问题解决: 关闭所有服务,按顺序进行启动

出现挂载卡死情况
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
出现原因: 服务端开启防火墙,阻止客户端访问
问题解决: 关闭防火墙

NFS服务挂载不上排查方法:

服务端进行排查:

  1. 检查nfs进程信息是否注册
    rpcinfo -p localhost/172.16.1.31
    问题原因:
    服务启动顺序不对,没有启动nfs服务
  2. 检查有没有可用存储目录
    showmount -e 172.16.1.31
    问题原因:
    配置文件编写有问题,重启nfs服务
  3. 在服务端进行挂载测试
    是否能够在存储目录中创建或删除数据

    客户端测试:

  4. 检查nfs进程信息是否注册
    rpcinfo -p localhost/172.16.1.31
    问题原因:
    服务启动顺序不对,没有启动nfs服务
  5. 检查有没有可用存储目录
    showmount -e 172.16.1.31
    问题原因:
    配置文件编写有问题,重启nfs服务
    网络问题
    ping 172.16.1.31
    telnet 172.16.1.31 111