NFS服务部署及优化

1.1 什么是NFS

它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录。NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中。在本地的NFS客户端的机器看来,NFS服务器端共享的目录就好像自己的磁盘分区和目录一样。一般客户端挂载到本地目录的命令可以随便取,但是为了方便管理,我们要和服务器端一样比较好。
那么NFS服务一般用来做什么呢?NFS一般用来存储共享视频,图片等静态数据。
挂载结构图:如下

31f794b9-2caa-4f40-bbb2-310210059029.jpg

1.2 NFS挂载原理介绍

如上图,当我们在nfs服务器设置好一个共享目录/data后,其他的有权访问NFS服务器的NFS客户端就可以将这个目录挂载到本地,并且能够看到服务端/data的所有数据。因为挂载在本地的/data目录,其实就是服务器端的/data目录。如果服务端配置的是只读,那么客户端也只能只读。如果配置读写,客户端也可以读写。挂载后,客户端要查看已挂载的信息,使用如下命令:df -h
NFS是通过网络来进行服务端和客户端之间的数据传输。两者之间要传输数据必然要通过网络端口来进行传输,那么NFS服务器到底使用什么网络端口来传输数据呢?其实NFS服务端是通过远程过程调用(RPC)协议来实现的。也就是说RPC服务会统一管理NFS的端口,客户端和服务端通过RPC来先沟通NFS使用了哪些端口,之后再利用这些端口(小于1024)来进行数据的传输。打个比方:房东租房子大家都应该知道吧。这里的房东可以比作为服务端,RPC比作为中介,租客比作为客户端。当房东(服务端)要租房子的时候,那么中介就要把租房子的信息传递给租客(这里的信息可以看作为NFS使用了哪个端口)。当租客(客户端)收到信息的时候,就相当于收到了服务端的端口,然后就可以建立起连接了。
注意:这里有个启动顺序的点。因为NFS要向RPC注册端口信息,所以RPC一定要先于NFS早启动。我给大家比喻一个左手叠右手的游戏,此时就是一定要确保NFS的手掌(左)在RPC手掌(右)的上面。正常顺序是要RPC先叠上去,然后NFS再叠上去。如果RPC重启了,就相当于手掌抽出来了,然后重新叠上去。这样RPC就在NFS上面了,所以不行。此时我们的NFS就需要再重新启动一次。这样NFS抽出来然后再叠上去之后,NFS就在RPC上面了。如果NFS修改了配置,就直接reload就好了

1.3客户端NFS和服务端NFS通讯过程

  • 首先服务端启动RPC服务,并且注册111端口
  • 启动NFS服务,并向RPC注册端口信息
  • 客户端启动RPC服务,向服务端的RPC服务请求服务端的NFS端口
  • 服务端的RPC服务反馈NFS端口信息给客户端
  • 客户端通过获取的NFS端口建立和服务端的NFS连接并进行数据的传输

e0113dda-d3b2-4a0a-ba8c-acc3c5d8ee6a.jpg

1.4 NFS服务的搭建

1.4.1 NFS服务端配置

  1. 1、打印系统版本
  2. [root@nfs-31 ~]# cat /etc/redhat-release
  3. unname -r
  4. unname -m
  5. 2、检查并安装NFS服务
  6. [root@nfs-31 ~]# rpm -aq nfs-utils rpcbind
  7. [root@nfs-31 ~]# yum install nfs-utils rpcbind -y
  8. 3、启动RPCNFS服务并开机自启
  9. [root@nfs-31 ~]# systemctl start rpcbind #启动rpcbind
  10. [root@nfs-31 ~]# systemctl enable rpcbind #rpcbind开机自启
  11. [root@nfs-31 ~]# systemctl start nfs #启动nfs
  12. [root@nfs-31 ~]# systemctl enable nfs #nfs开机自启
  13. 4、检查RPCNFS是否启动
  14. [root@nfs-31 ~]# ss -lntp|egrep "rpc|nfs"
  15. LISTEN 0 128 *:50827 *:* users:(("rpc.statd",pid=20710,fd=9))
  16. LISTEN 0 128 *:111 *:* users:(("rpcbind",pid=19541,fd=4),("systemd",pid=1,fd=43))
  17. LISTEN 0 128 *:20048 *:* users:(("rpc.mountd",pid=20723,fd=8))
  18. LISTEN 0 128 :::111 :::* users:(("rpcbind",pid=19541,fd=6),("systemd",pid=1,fd=45))
  19. LISTEN 0 128 :::20048 :::* users:(("rpc.mountd",pid=20723,fd=10))
  20. LISTEN 0 128 :::58901 :::* users:(("rpc.statd",pid=20710,fd=11))
  21. 5、修改nfs配置文件
  22. [root@nfs-31 ~]# cat /etc/exports
  23. #share /data by oldboy for xujun at 2019-09-17
  24. /data 192.168.89.0/24(rw,sync,all_squash) #all_squash这个参数可以把客户端过来的用户压缩成nfsnobody
  25. 6、创建共享目录并授权
  26. [root@nfs-31 ~]# mkdir -p /data
  27. [root@nfs-31 ~]# chown -R nfsnobody:nfsnobody /data/
  28. [root@nfs-31 ~]# ls -ld /data/
  29. drwxr-xr-x. 2 nfsnobody nfsnobody 6 9 17 17:05 /data/
  30. 7、平滑加载nfs服务并自检
  31. [root@nfs-31 ~]# systemctl reload nfs
  32. [root@nfs-31 ~]# showmount -e 192.168.89.31
  33. Export list for 192.168.89.31:
  34. /data 192.168.89.0/24
  35. 8、服务端本地挂载
  36. [root@nfs-31 ~]# mount -t nfs 192.168.89.31:/data/ /mnt/
  37. [root@nfs-31 ~]# df -h
  38. 文件系统 容量 已用 可用 已用% 挂载点
  39. /dev/sda3 17G 1.4G 16G 8% /
  40. devtmpfs 479M 0 479M 0% /dev
  41. tmpfs 489M 0 489M 0% /dev/shm
  42. tmpfs 489M 6.7M 482M 2% /run
  43. tmpfs 489M 0 489M 0% /sys/fs/cgroup
  44. /dev/sda1 1014M 131M 884M 13% /boot
  45. tmpfs 98M 0 98M 0% /run/user/0
  46. 192.168.89.31:/data 17G 1.4G 16G 8% /mnt
  47. [root@nfs-31 ~]# touch /mnt/oldboy.txt
  48. [root@nfs-31 ~]# ls /mnt/
  49. oldboy.txt

1.4.2 客户端配置

  1. 1、检查系统版本
  2. [root@backup-41 ~]# cat /etc/redhat-release
  3. unname -r
  4. unname -m
  5. 2、检查并安装RPC服务
  6. [root@backup-41 ~]# rpm -aq nfs-utils rpcbind
  7. [root@backup-41 ~]# yum install nfs-utils rpcbind -y
  8. 3、启动RPC服务并设置开机自启以及检查服务运行状态
  9. [root@backup-41 ~]# systemctl start rpcbind
  10. [root@backup-41 ~]# systemctl enable rpcbind
  11. [root@backup-41 ~]# systemctl status rpcbind
  12. 4、检查服务端的NFS是否OK
  13. [root@backup-41 ~]# showmount -e 192.168.89.31
  14. Export list for 192.168.89.31:
  15. /data 192.168.89.0/24
  16. 5、挂载并测试
  17. [root@backup-41 ~]# mount -t nfs 192.168.89.31:/data /mnt/
  18. [root@backup-41 ~]# df -h
  19. 文件系统 容量 已用 可用 已用% 挂载点
  20. /dev/sda3 17G 1.3G 16G 8% /
  21. devtmpfs 903M 0 903M 0% /dev
  22. tmpfs 912M 0 912M 0% /dev/shm
  23. tmpfs 912M 8.6M 904M 1% /run
  24. tmpfs 912M 0 912M 0% /sys/fs/cgroup
  25. /dev/sda1 1014M 131M 884M 13% /boot
  26. tmpfs 183M 0 183M 0% /run/user/0
  27. 192.168.89.31:/data 17G 1.4G 16G 8% /mnt
  28. 6、把挂载设置写到rc.local
  29. [root@backup-41 ~]# chmod +x /etc/rc.d/rc.local
  30. [root@backup-41 ~]# echo "mount -t nfs 192.168.89.31:/data /mnt/" >> /etc/rc.local
  31. [root@backup-41 ~]# tail -1 /etc/rc.local
  32. mount -t nfs 192.168.89.31:/data /mnt/

1.5 NFS服务的重点知识梳理

  • NFS服务的配置文件/etc/exports设置需要开放写可入的权限,即服务端的共享权限
  • NFS服务器实际要共享的NFS目录权限具有可写入W的权限,即服务端本地目录的安全权限
  • 每台机器都对应存在和NFS默认配置UID的相同UID65534nfsnobody用户(确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)

1.6 NFS服务的优点

  • 简单,容易上手
  • NFS文件系统内数据是在文件系统之上的。即数据是可以看见的
  • 部署快速,维护方便简单,且可控
  • 可靠,从软件层面上看,数据可靠性高,经久耐用,数据是在文件系统之上的
  • 服务非常稳定

1.7 NFS服务的缺点

  • 存在单点故障,如果NFS宕机了,所有客户端都不能访问共享目录了
  • 在大数据并发的时候。NFS效率、性能有限(2千万/日一下PV的网站不是瓶颈,除非网站架构设计太差)
  • 客户端认证是基于IP和主机名的,权限要根据ID识别,安全性一般
  • NFS数据是明文的,NFS本身不对数据完整性进行验证
  • 多台客户机器挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。尤其当NFS服务器端出问题后,所有NFS客户端都处于挂掉状态
  • 涉及了同步和异步的概念,NFS服务器端和客户端相对来说就是耦合度有些高,网站程序也是一样的,尽量不要耦合度太高。

1.8 客户端地址选项说明

ae0a4c2f-74ef-4d53-b320-70a7cefbaa45.png

1.9 生产环境常见配置实例:(客户端)

61d57bc4-d039-4288-9e49-fcb5253d1684.png

1.10 客户端NFS挂载参数

我们客户端挂载NFS也可以设置很多参数的,就跟windows映射盘一样,也是可以设置参数的。客户端挂载可以设置:不可执行、读写权限、断开后RPC呼叫方式、读写区块大小等。一般来说当nfs服务器提供的只是普通数据(图片htmlcssjss,视频等)应该不需要执行suid,exec等权限,由于是共享目录不存在设备所以也不存在挂载设备dev,因此在客户端挂载的时候,可以加上给你这几个命令挂载。

  1. mount t nfs -o nosuid,noexec,nodev,rw 192.168.1.1:/share /local/mnt

1.11 可使用挂载参数

c70c1211-6f8e-4789-a0ca-c526363a64b3.png

另外还有一些NFS挂载的额外参数可用。如果NFS是用在高速运行的环境中的话,那么建议加上这些参数,这样当这台NFS服务器因为某些原因离线,NFS客户端可以继续在后台重复呼叫,直到NFS服务器再度连上线为止。
针对一些高并发的情况,还有一些可以进行优化的参数:

1f28e995-0679-4127-a665-c94d41c78bf7.png
cebd8add-df46-43cf-9451-34b0fd9d5458.png

命令格式如下:

  1. mount t nfs o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768 192.168.1.1:/share /local/dir
  2. NFS客户端如何挂载才最佳:
  3. 1noexec,nosuid,nodev,因为共享存放的是简单资料,不需要suid位不需要执行,没有设备文件。
  4. 2hard,intr,bg NFS链接断了之后会一直去监测服务端的NFS服务直到恢复之后重新连接。
  5. 3rsize=32768 wsize=32768 调优NFS传输的区块大小。
  6. 4)基本参数:rw 读写权限。

1.12 NFS权限设置(服务端)

NFS配置权限设置,即/etc/exports文件配置格式中小括号()里的参数集。

0b270ccb-88fd-411d-b4f9-064a45b5361c.png
7a511178-c073-4bbb-a80e-289a51dbd266.png
5b1a52d4-eb19-4ef5-9740-fb049afc3a82.jpg
noatime:访问文件时不更新文件的inode时间戳,高并发环境下,推荐显示应用该选项,可以提高系统I/O性能。
nodiratime:不更新文件系统上的directory inode时间戳,高并发环境,推荐显示应用该选项,可以提高系统I/O性能

1.13 企业生产场景NFS共享存储优化小结

1、硬盘:sda/ssd硬盘,买多块,硬件raid,制作raid5raid10网卡吞吐量要大,至少千兆
2、NFS服务端配置:/data 192.168.89.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534)
3、NFS客户端挂载优化配置命令:

981de08c-a649-4f0a-983d-b68041ccf7a6.jpg

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

  1. cat >>/etc/sysctl.conf <<xujun
  2. net.core.wmem_default = 8388608
  3. net.core.rmem_default = 8388608
  4. net.core.rmem_max = 16777216
  5. net.core.wmem_max = 16777216
  6. xujun
  7. 执行sysctl -p生效

5、如果卸载的时候提示“umount:/mnt:device is busy”,需要退出挂载目录在进行卸载,如果是NFS Server宕机了,则需要强制卸载,可执行umount -lf /mnt
6、大型网站NFS网络文件系统的替代软件为分布式文件系统FastdfsGlusterFS

1.14 简述一次完整的NFS挂载过程

1.确认rpcbind和nfs已经启动,并且是nfs比rpc后启动,通过chkconfig来配置开机启动,rpcbind的默认开启顺序也是比nfs来的早 2.vim /etc/export配置nfs服务的共享目录及权限 3.客户端的rpcbind启动,并加入开机自启动服务中,通过showmount来查看服务端是否已经提供了共享的nfs目录。通过rpcinfo命令来查看服务器端的RPC信息。当本地端要挂载的时候也要确认本地挂载的目录没有被占用 4.配置客户端的默认开机启动挂载

1.15 重点回顾:

51bc37d9-6177-4a88-99ec-3cdd3f38ab20.jpg