03.NFS网络文件系统实战

03.NFS网络文件系统实战

1.NFS基本概述
2.NFS实现原理
3.NFS服务安装
4.NFS挂载卸载
5.NFS存储总结

本章课程内容大纲

1.什么是NFS?
2.NFS能干什么?
3.为什么要使用NFS?
4.nfs能解决什么问题?
5.使用NFS的注意事项?
6.NFS实现原理解析?
7.安装、配置、NFS服务

1.NFS基本概述

1.什么是NFS?
NFS是Network file System的缩写及网络文件系统。(通常我们称NFS为共享存储
2.NFS能干什么?
NFS的主要功能是通过局域网络让不同的主机系统之间可以共享目录。
3.为什么要使用NFS?
3.1在网站集群架构中如果没有共享存储的情况如下:
1)A用户上传图片讲过负载均衡,负载均衡将上传请求调度至WEB1服务器上。
2)B用户访问A用户上传的图片,此时B用户被负载均衡调度至WEB2上,因为WEB2上没有这张图片,所以B用户无法看到A用户传的图片。
在这里插入图片描述
3.2在网站集群架构中如果有共享存储的情况如下:
1)A用户上传图片无论被负载均衡调度至WEB1还是WEB2,最终数据都被写入至共享存储
2)B用户访问A用户上传图片时,无论调度至WBE1还是WEB2,最终都会上传共享存储访问对应的文件,这样就可以访问到资源了。
在这里插入图片描述
4.使用NFS共享存储能解决集群架构的什么问题?
解决多web节点静态资源的共享(所有客户端都挂载服务端,看到的数据都一样)
解决多web节点静态资源一致性如果客户端A删除NFS服务上test文件,客户端B上也会看不见test文件
解决多web节点磁盘空间的浪费
5.企业使用NFS注意事项
(1)由于用户请求静态资源每次都需要web连接NFS服务获取,那么势必会带来一定的网络开销、以及网络延迟、所以增加NFS服务并不能给网站带来访问速度的提升。
(2)如果希望对上传的图片、附件等静态资源进行加速,建议将静态资源统一存储值NFS服务端,这样便于后期统一存储至CDN,以此来实现资源的加速。

2.NFS实现原理

(2.1) nfs网络文件共享
(2.2) 主要用来存储静态资源
(2.2.1)解决web静态资源一致
(2.2.2)解决多节点资源共享
(2.2.3)解决多节点磁盘空间
3.注意:
存储不可以带来网站的加速,反而会增加网络延时,借助CDN技术来实现,[分布式缓存],加速网站访问效果,提升用户体验。
互联网企业都是花钱购买CDN
0)CDN域名解析
1)CDN实现原理
2)配置CDNJ
在这里插入图片描述

本地文件操作系统

1.当地用户执行mkdir命令,BashShell无法完成该命令操作,会将其他翻译给内核。
2.Kernel内核解析完成后会驱动对应的磁盘设备,完成创建目录的操作。

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服务。

3.NFS服务安装

环境准备
服务器系统 | 角色 | 外网IP | 内网IP
CentoS 7.6 | NFS服务端 | eth0:10.0.0.31 |eth1:172.16.1.31
Centos 7.6 | NFS客户端 | eth0:10.0.0.41 |eth1:172.16.1.41

3.1 关闭防火墙

1.关闭防火墙

(1)关闭firewalld防火墙
[root@nfs ~]#systemctl  disable  firewalld 
[root@nfs ~]#systemctl   stop   firewalld 
(2)关闭selinu防火墙
[root@nfs ~]#sed  -ri   '#^SELINUX=#cSELINUX=Distable'   /etc/selinux/config 
[root@nfs ~]#setenforce  0

2.安装nfs-server服务端

1.安装
 [root@nfs ~]# yum -y install nfs-utils
 [root@nfs ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
   Active: inactive (dead)
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2022-04-11 16:06:37 CST; 2s ago
  Process: 14225 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 14226 (rpcbind)
   CGroup: /system.slice/rpcbind.service
           └─14226 /sbin/rpcbind -w
Apr 11 16:06:37 nfs systemd[1]: Starting RPC bind service...
Apr 11 16:06:37 nfs systemd[1]: Started RPC bind service.
2.配置
[root@nfs ~]# cat  /etc/exports
/data 172.16.1.0/24(rw)
[root@nfs ~]#man  exorts 
sample /etc/exports file
       /               master(rw) trusty(rw,no_root_squash)
       /projects       proj*.local.domain(rw)
       /usr            *.local.domain(ro) @trusted(rw)
       /home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
       /pub            *(ro,insecure,all_squash)
       /srv/www        -sync,rw server @trusted @external(ro)
       /foo            2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
       /build          buildhost[0-9].local.domain(rw)
/projects       proj*.local.domain(rw)
    /projects    172.16.1.0/24(rw)
      /data    #共享的目录是本地的哪个路径
      172.16.1.0/24   #将该目录共享哪个网段的主机
      ()                     # 参数,参数可以有很多  rw,可以进行读和写操作
    3. 根据配置进行初始化操作创建对应的目录
      [root@nfs ~]# mkdir  /data
   4.启动服务,并加入开机自启
   [root@nfs ~]# systemctl start nfs     
[root@nfs ~]# systemctl enable nfs-server.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
检查nfs的状态
[root@nfs ~]# 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 Mon 2022-04-11 16:21:10 CST; 55s ago
 Main PID: 14449 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

Apr 11 16:21:10 nfs systemd[1]: Starting NFS server and services...
Apr 11 16:21:10 nfs systemd[1]: Started NFS server and services.
   5.客户端测试   
   172.16.1.41(测试服务器)
   (1.)安装nfs-utils  (rpcbind服务组件)
   [root@backup ~]# yum -y install nfs-utils 
   [root@backup ~]# systemctl start nfs
[root@backup ~]# 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@backup ~]# systemctl status nfs
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
   Active: active (exited) since Mon 2022-04-11 16:27:23 CST; 16s ago
 Main PID: 10841 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

Apr 11 16:27:23 backup systemd[1]: Starting NFS server and services...
Apr 11 16:27:23 backup systemd[1]: Started NFS server and services.
[root@backup ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2022-04-11 16:27:23 CST; 37s ago
 Main PID: 10819 (rpcbind)
   CGroup: /system.slice/rpcbind.service
           └─10819 /sbin/rpcbind -w

Apr 11 16:27:23 backup systemd[1]: Starting RPC bind service...
Apr 11 16:27:23 backup systemd[1]: Started RPC bind service.
(2.)通过客户端命令,查询一下服务端共享哪些目录
[root@backup ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
 (3.)执行挂载操作
 [root@backup ~]# mount -t nfs 172.16.1.31:/data  /mnt
[root@backup ~]# df -h 
Filesystem         Size  Used Avail Use% Mounted on
devtmpfs           980M     0  980M   0% /dev
tmpfs              991M     0  991M   0% /dev/shm
tmpfs              991M  9.6M  981M   1% /run
tmpfs              991M     0  991M   0% /sys/fs/cgroup
/dev/sda3           29G  2.3G   27G   8% /
/dev/sda1          197M  110M   88M  56% /boot
tmpfs              199M     0  199M   0% /run/user/0
172.16.1.31:/data   29G  2.8G   27G  10% /mnt
(4)通过客户端,执行创建文件操作,发现失败了 
[root@backup ~]# cd  /mnt/
[root@backup mnt]# ll 
total 0
[root@backup mnt]# touch file.txt 
touch: cannot touch ‘file.txt’: Permission denied
(5)修改服务端的权限
 [root@nfs ~]# 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)
过滤UID对应的具体用户是谁
 [root@nfs ~]# grep  "65534" /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
anonuid=65534,anongid=65534  #表示最终写入数据时,需要调用UID为65534 用户写入数据
[root@nfs ~]# ll  -d /data/    
drwxr-xr-x. 2 root root 6 Apr 11 16:20 /data/
[root@nfs ~]# chown -R nfsnobody.nfsnobody  /data/
[root@backup mnt]# touch backup_file.txt 
[root@backup mnt]# ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Apr 11 17:03 backup_file.txt

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的用户UID,必须存在系统

(6)演示ro和rw:
服务端修改配置:
[root@nfs ~]# vim /etc/exports
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(ro)
客户端测试写入:
[root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@backup ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 980M 0 980M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.6M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda3 29G 2.3G 27G 8% /
/dev/sda1 197M 110M 88M 56% /boot
tmpfs 199M 0 199M 0% /run/user/0
172.16.1.31:/data 29G 2.8G 27G 10% /mnt
[root@backup ~]# cd /mnt/
[root@backup mnt]# touch text.txt
touch: cannot touch ‘text.txt’: Read-only file system
(7)演示 all_squash no_all_squash 用户身份压缩,并自指定UID和GID
NFS服务端操作:
创建www用户:指定UID和GID(666)
[root@nfs ~]# groupadd -g 666 www
[root@nfs ~]# useradd -u666 -g666 www
[root@nfs ~]# id www
uid=666(www) gid=666(www) groups=666(www)
修改配置文件:
[root@nfs ~]# vim /etc/exports
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,async,all_squash,anonuid=666,anongid=666)
修改属主和属组的权限用户
[root@nfs ~]# chown -R www.www /data/
重启
[root@nfs ~]# systemctl restart nfs
客户端操作测试:
[root@backup ~]# cd /mnt/
[root@backup mnt]# touch all_squash.txt
[root@backup mnt]# ll
total 0
-rw-r–r–. 1 666 666 0 Apr 12 16:41 all_squash.txt
-rw-r–r–. 1 666 666 0 Apr 11 17:03 backup_file.txt
-rw-r–r–. 1 666 666 0 Apr 12 16:29 file.txt
客户端需要添加同样的www用户,uid为666,gid为666
[root@backup mnt]# groupadd -g666 www
[root@backup mnt]# useradd -u666 -g666 www
[root@backup mnt]# ll
total 0
-rw-r–r–. 1 www www 0 Apr 12 16:41 all_squash.txt
-rw-r–r–. 1 www www 0 Apr 11 17:03 backup_file.txt
-rw-r–r–. 1 www www 0 Apr 12 16:29 file.txt

4.NFS存储总结

1.NFS存储优点

1.NFS简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求
2.NFS的数据都在文件系统之上,所有数据都是能看得见的。

2.NFS存储局限

1.存在单点故障,如果不构建高可用维护麻烦web ->nfs —》backup
2.NFS数据都是明文,并不对数据做任何校验,也没有密码验证(强烈建议内网使用)

3.NFS应用建议

1.生产场景应将静态数据不会发生变化的(ipg、png\mp4\avi\css\js)尽可能部署CDN分布式缓存服务进行加速,以此来减少后端存储压力
2.如果没有缓存或架构、代码等,本身历史遗留问题太大,在多存储也没有意义。

4.存储分为

1.nfs moosefs glusterfs(文件系统 集群) fastdfs 对象存储(会变成多块 对外提供域名+路径=访问资源 ) ceph

5.CDN分布式缓存原理

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐