image

一、NFS的应用与概述

# 1.为什么用共享存储
# 2.存储有哪些工具
# 3.共享存储应用场景有哪些
# 4.部署nfs共享存储
# 5.客户端尝试连接共享存储

什么是NFS?
    NFS 是 Network File System 的缩写及网络文件系统。 NFS 主要功能是通过
    局域网络让不同的主机系统之间可以共享文件或目录。
    
    NFS 系统和 Windows 网络共享、网络驱动器类似, 只不过 windows 用于局域
    网, NFS 用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统
    FastDFS,glusterfs,HDFS
    
那么我们为什么要使用数据存储共享服务?
1.实现多台服务器之间数据共享
2.实现多台服务器之间数据一致

1.1 NFS应用场景

  • 下面我将通过图解给大家展示集群需要共享存储服务的理由。

    • 1.A 用户上传图片经过负载均衡,负载均衡将上传请求调度至 WEB1 服务器上。

    • 2.B 用户访问 A 用户上传的图片,此时 B 用户被负载均衡调度至 WEB2 上,因为 WEB2 上没有这张图片,所以 B用户无法看到 A 用户传的图片

image

  • 如果有共享存储的情况

    • 1.A 用户上传图片无论被负载均衡调度至 WEB1 还是 WEB2, 最终数据都被写入至共享存储

    • 2.B 用户访问 A 用户上传图片时,无论调度至 WEB1 还是 WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源了

image

1.2 nfs存储工作原理实现

  • NFS工作原理

# 1.用户进程访问 NFS 客户端,使用不同的函数对数据进行处理
# 2.NFS 客户端通过 TCP/IP 的方式传递给 NFS 服务端
# 3.NFS 服务端接收到请求后,会先调用 portmap 进程进行端口映射。
# 4.nfsd 进程用于判断 NFS 客户端是否拥有权限连接 NFS 服务端。
# 5.Rpc.mount 进程判断客户端是否有对应的权限进行验证。
# 6.idmap 进程实现用户映射和压缩
# 7.最后 NFS 服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由
#   内核驱动硬件。

# 注意: rpc 是一个远程过程调用,那么使用 nfs 必须有 rpc 服务

1.3 前提条件

image

# 1.nfs依赖于RPC服务来传递消息
# 2.NFS服务启动的端口号是随机的,启动之后会向本地的RCP注册
# 3.先启动RPC服务,再启动NFS服务
# 4.NFS和RPC之间的通讯是他们自己内部完成的,对于用户来说无感知
# 5.NFS客户端和服务端不会直接沟通,必须通过RPC服务传递消息
# 6.防火墙要开放RPC服务的端口

二、NFS服务端部署实践

2.1 安装nfs

yum install nfs-utils -y

2.2 配置参数

  • nfs 服务程序的配置文件为/etc/exports,需要严格按照共享目录的路径 允许访问的 NFS 客户端(共享权限参数)格式书写,定义要共享的目录与相应的权限,具体书写方式如下图所示

配置文件参数解释:

# 执行 man exports 命令,然后切换到文件结尾,可以快速查看如下样例格式:
nfs共享参数 参数作用
rw 读写权限 (常用)
ro 只读权限 (不常用)
root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户 (不常用)
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员 (不常用)
all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户 (常用)
no_all_squash 无论NFS客户端使用什么账户访问,都不进行压缩 (不常用)
sync 同时将数据写入到内存与硬盘中,保证不丢失数据 (常用)
async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据 (不常用)
anonuid 配置all_squash使用,指定NFS的用户UID,必须存在系统 (常用)
anongid 配置all_squash使用,指定NFS的用户GID,必须存在系统 (常用)

2.3 配置NFS服务端

  • 写入配置文件:注意!IP地址和后面的小括号没有空格

[root@nfs01 ~]# cat > /etc/exports <<EOF
/data 172.16.1.0/24(rw,sync,all_squash)
EOF
  • 创建数据目录和授权:

[root@nfs01 ~]# mkdir /data -p
[root@nfs01 ~]# chown -R nfsnobody:nfsnobody /data/

2.4 启动nfs

[root@nfs01 ~]# systemctl start nfs-server.service

2.5 检查命令

[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

2.6 加入开机自启动

在使用 NFS 服务进行文件共享之前,需要使用 RPC(Remote Procedure Call 远程过程调用服务将 NFS 服务器的IP 地址和端口号信息发送给客户端。因此,在启动 NFS 服务之前,需要先重启并启用 rpcbind 服务程序,同时都加入开机自启动

[root@nfs01 ~]# systemctl enable rpcbind nfs-server
[root@nfs01 ~]# systemctl restart rpcbind nfs-server

2.7 客户端挂载命令

客户端安装nfs服务十分简单,只需要安装nfs软件包即可

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

安装完成后只需要启动rpcbind,不需要启动nfs

[root@backup ~]# systemctl restart rpcbind

使用showmount命令查看nfs共享信息查询 NFS 服务器的远程共享信息,其输出格式为“共享的目录名称 允许使用客户端地址”。

[root@backup ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24	

挂载命令: 创建挂载目录

在 NFS 客户端创建一个挂载目录, 使用 mount 命令并结合-t 参数, 指定要挂载的文件系统的类型, 并在命令后面写上服务器的 IP 地址, 以及服务器上的共享目录, 最后需要写上要挂载到本地系统(客户端)的目录

[root@backup ~]# mkdir /data -p
[root@backup ~]# mount -t nfs 172.16.1.31:/data /data

查看是否挂载成功:

[root@backup ~]# df -h
文件系统           容量  已用  可用 已用% 挂载点
/dev/sda3           18G  1.9G   17G   11% /
devtmpfs           480M     0  480M    0% /dev
tmpfs              489M     0  489M    0% /dev/shm
tmpfs              489M   32M  458M    7% /run
tmpfs              489M     0  489M    0% /sys/fs/cgroup
/dev/sda1         1014M  110M  905M   11% /boot
tmpfs               98M     0   98M    0% /run/user/0
172.16.1.31:/data   18G  1.9G   17G   11% /data

测试写入数据是否正常

[root@backup ~]# echo "111" > /data/111.txt
[root@backup ~]# cat /data/111.txt 
oldzhang

写入开机自动挂载

[root@backup ~]# vim /etc/fstab 
[root@backup ~]# tail -1 /etc/fstab       
172.16.1.31:/data                         /data                   nfs     defaults        0 0
[root@backup ~]# mount -a
[root@backup ~]# df -h
文件系统           容量  已用  可用 已用% 挂载点
/dev/sda3           18G  1.9G   17G   11% /
devtmpfs           480M     0  480M    0% /dev
tmpfs              489M     0  489M    0% /dev/shm
tmpfs              489M   32M  458M    7% /run
tmpfs              489M     0  489M    0% /sys/fs/cgroup
/dev/sda1         1014M  110M  905M   11% /boot
tmpfs               98M     0   98M    0% /run/user/0
172.16.1.31:/data   18G  1.9G   17G   11% /data

卸载命令:注意!卸载的时候如果提示”umount.nfs: /nfsdir: device is busy”先切换到其他目录再卸载

[root@backup ~]# umount /data/

强制卸载命令:

[root@backup ~]# umount -rl /data/

2.8 NFS 权限验证

2.8.1 验证ro权限

服务端配置:

[root@nfs01 ~]# cat /etc/exports
/data 172.16.1.0/24(ro,sync,all_squash)
[root@nfs01 ~]# systemctl restart nfs-server.service
[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

客户端挂载:

[root@backup ~]# mount -t nfs 172.16.1.31:/data /data
[root@backup ~]# df -h
文件系统           容量  已用  可用 已用% 挂载点
/dev/sda3           18G  1.9G   17G   11% /
devtmpfs           480M     0  480M    0% /dev
tmpfs              489M     0  489M    0% /dev/shm
tmpfs              489M   38M  452M    8% /run
tmpfs              489M     0  489M    0% /sys/fs/cgroup
/dev/sda1         1014M  110M  905M   11% /boot
tmpfs               98M     0   98M    0% /run/user/0
172.16.1.31:/data   18G  1.9G   17G   11% /data

测试读取:

[root@backup ~]# cat /data/111.txt 
111

写入测试:

[root@backup ~]# echo "backup" > /data/111.txt 
-bash: /data/111.txt: 权限不够

2.8.2 验证all_squash、 anonuid、 anongid 权限

服务端配置:

[root@nfs01 ~]# cat /etc/exports 
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

服务端创建用户及授权:

[root@nfs01 ~]# useradd -s /sbin/nologin -M -u 666 -g 666 www
[root@nfs01 ~]# id www
uid=666(www) gid=666(www) 组=666(www)

重启NFS服务:

[root@nfs01 ~]# systemctl restart nfs-server.service

更改目录授权:

[root@nfs01 ~]# chown -R www:www /data/
[root@nfs01 ~]# ls -ld /data/
drwxr-xr-x 2 www www 35 7月  17 19:50 /data/

客户端操作:

[root@backup ~]# mount -t nfs 172.16.1.31:/data /data
[root@backup ~]# ls -ld /data/
drwxr-xr-x 2 666 666 35 7月  17 19:50 /data/
[root@backup ~]# ll /data/
总用量 4
-rw-r--r-- 1 666 666 0 7月  17 19:50 123
-rw-r--r-- 1 666 666 9 7月  17 19:46 111.txt
[root@backup ~]# echo "111" > /data/111.txt 
[root@backup ~]# cat /data/111.txt                    
oldzhangy

我们会发现依然可以写入,但是为了避免这种情况发生,建议客户端也创建相同uid gid的用户

[root@backup ~]# groupadd -g 666 www
[root@backup ~]# useradd -s /sbin/nologin -M -u 666 -g 666 www
[root@backup ~]# id www
uid=666(www) gid=666(www) 组=666(www)
[root@backup ~]# ls -ld /data/
drwxr-xr-x 2 www www 35 7月  17 19:50 /data/
[root@backup ~]# ll /data/    
总用量 4
-rw-r--r-- 1 www www  0 7月  17 19:50 123
-rw-r--r-- 1 www www 10 7月  17 21:31 111.txt

image

查看nfs端口

[root@nfs01 ~]# rpcinfo -p
   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  43177  status
    100024    1   tcp  36750  status
    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  41388  nlockmgr
    100021    3   udp  41388  nlockmgr
    100021    4   udp  41388  nlockmgr
    100021    1   tcp  43678  nlockmgr
    100021    3   tcp  43678  nlockmgr
    100021    4   tcp  43678  nlockmgr```

firewall防火墙配置

firewall-cmd --add-service=nfs --permanent
firewall-cmd --add-service=mountd --permanent
firewall-cmd --add-service=rpc-bind --permanent
firewall-cmd --reload

iptables防火墙配置

参考博客

https://www.cnblogs.com/xiangsikai/p/10297233.html

启动NFS会开启如下端口:

1)portmapper 端口:111 udp/tcp;
2)nfs/nfs_acl 端口:2049 udp/tcp;
3)mountd 端口:"32768--65535" udp/tcp
4)nlockmgr 端口:"32768--65535" udp/tcp
系统 RPC服务在 nfs服务启动时默认会给 mountd 和 nlockmgr 动态选取一个随机端口来进行通讯。

1.查看NFS启动后的端口

[root@nfs01 /opt/sersync]# rpcinfo -p
   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  43177  status
    100024    1   tcp  36750  status
    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  41388  nlockmgr
    100021    3   udp  41388  nlockmgr
    100021    4   udp  41388  nlockmgr
    100021    1   tcp  43678  nlockmgr
    100021    3   tcp  43678  nlockmgr
    100021    4   tcp  43678  nlockmgr

2.将随机的端口号设置固定

[root@nfs01 ~]# vim /etc/sysconfig/nfs
[root@nfs01 ~]# tail -5 /etc/sysconfig/nfs
RQUOTAD_PORT=4001
LOCKD_TCPPORT=4002
LOCKD_UDPPORT=4002
MOUNTD_PORT=4003
STATD_PORT=4004

3.重启nfs和rpc服务

[root@nfs01 ~]# systemctl restart rpcbind.service nfs-server.service

4.再次查看端口信息,发现端口号已经固定了

[root@nfs01 ~]# rpcinfo -p
   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  43177  status
    100024    1   tcp  36750  status
    100005    1   udp   4003  mountd
    100005    1   tcp   4003  mountd
    100005    2   udp   4003  mountd
    100005    2   tcp   4003  mountd
    100005    3   udp   4003  mountd
    100005    3   tcp   4003  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   4002  nlockmgr
    100021    3   udp   4002  nlockmgr
    100021    4   udp   4002  nlockmgr
    100021    1   tcp   4002  nlockmgr
    100021    3   tcp   4002  nlockmgr
    100021    4   tcp   4002  nlockmgr

5.设置iptables

-A INPUT -p tcp -m tcp --dport 111 -j ACCEPT
-A INPUT -p udp -m udp --dport 111 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT
-A INPUT -p udp -m udp --dport 2049 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4001:4004 -j ACCEPT
-A INPUT -p udp -m udp --dport 4001:4004 -j ACCEPT

6.保存配置

iptables-save 
iptables -nL

NFS故障案例

如果设置了开机自启动,但是系统启动的时候NFS并没有提供服务,就会导致开机自检的时候卡在挂在那一步

开机启动时添加rd.break
ctrl+x
mount -o remount,rw /sysroot/
chroot /sysroot/

三、搭建考试系统

3.1、搭建WEB服务

1、安装web软件
[root@web01 opt]# yum install httpd php php-devel -y

2、将代码放置于网站的根目录
[root@web01 opt]# cd /var/www/html/

# 上传代码

3、授权
[root@web01 html]# chown -R www.www /var/www/html

4、关闭selinux和防火墙
[root@nfs ~]# setenforce 0
[root@nfs ~]# systemctl disable --now firewalld

5、修改web软件的用户
[root@web01 html]# vim /etc/httpd/conf/httpd.conf
User www
Group www

6、启动web软件
[root@web01 html]# systemctl start httpd

7、测试

	1、上传
	
	2、访问
    http://172.16.1.7/upload/1_linux.jpg

3.2、配合NFS实现文件共享

1、修改NFS配置文件
[root@nfs nfs1]# vim /etc/exports
/web/upload  172.16.1.0/20(rw,sync,all_squash,anonuid=666,anongid=666)

2、创建挂载点
[root@nfs nfs1]# mkdir /web/upload -p
[root@nfs nfs1]# chown www.www /web/upload

3、重启NFS
[root@nfs nfs1]# systemctl restart nfs-server rpcbind

4、客户端安装NFS软件
[root@web01 html]# yum install nfs-utils -y
[root@web02 html]# yum install nfs-utils -y
[root@web03 html]# yum install nfs-utils -y

5、挂载
[root@web01 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload
[root@web02 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload
[root@web03 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload

6、测试
用web2上传,web3查看

效果图如下:

image

四、NFS小结

NFS 存储优点:

- 1.NFS 文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。

- 2.NFS 文件系统内存放的数据都在文件系统之上,所有数据都是能看得见

NFS 存储局限:

- 1.存在单点故障, 如果构建高可用维护麻烦 web->nfs()->backup

- 2.NFS 数据明文, 并不对数据做任何校验。

- 3.客户端挂载 NFS 服务没有密码验证, 安全性一般(内网使用)

NFS 应用建议:

- 1.生产场景应将静态数据尽可能往前端推, 减少后端存储压力

- 2.必须将存储里的静态资源通过 CDN 缓存 jpg\png\mp4\avi\css\js

- 3.如果没有缓存或架构本身历史遗留问题太大, 在多存储也无用

image

posted on 2021-12-30 16:59  耿蜀黍  阅读(2578)  评论(0编辑  收藏  举报