NFS存储服务

NFS存储服务
[TOC]
🍰复习巩固

存储
概述


前面有
负载均衡,随机访问web网站把视频放在
web01,那么下次可能访问到web02,或者web03
这就导致了所有的web服务器,对用户上传的数据不统一,随机存放在某个web服务器下
❤️那么如何解决这个问题呢?

让所有web服务器,接一个上传的存储设备
空间更多一点,磁盘性能更一点,可以是物理机也可以是云
这个存储设备有一个共享目录,让我们这些web服务器挂载上去
挂载后,此时web中的
/upload和存储服务器的/nfsdata就连在一起了像在客户端和服务端之间建立了一根“虚拟的数据网线”,使得远程目录可以像本地目录一样使用。

硬链接不能跨文件系统- 一阶段挂载的磁盘都在本地,这次把 网络设备
172.16.1.31:/test挂载本地/code
分类

- 最重要的点就是 空间一定要够用
- 以及 磁盘I/O读取速度 也要跟得上来
NFS存储
NFS(Network File System)是Linux中一种 网络文件存储服务
-
是一种 分布式文件系统协议
允许客户端通过网络访问远程服务器上的文件,如同访问本地文件一样
-
当数据量大了之后,NFS就跟不上了,可以考虑
分布式存储了
分布式存储
分布式存储 是一种将数据 分散存储 在多个独立节点(服务器/设备)上的技术体系
-
其本质是通过 数据分片 和 冗余机制 实现高可用性与扩展性
-
优势:可以 承担更高的访问量 ,还有就是 数据更安全一点
你就算丢一点数据,它还可以自己恢复
云产品
-
它的空间你可以理解为是无限的
-
只要你的钱够,总能找到合适的存储
v3版本
在
NFSv3及更早版本中,仍然需要配合rpcbind服务使用不过,在
NFSv4中,情况有所变化(下面我们主要理解v4版本的,不需要rpc中间件版本的)
😍但是呢,我们稍微的讲述一下 v3 老一点的版本


这个RPC服务只是起一个远程 调度 的作用
相当于一个中介
从Centos 6开始叫
rpcbind,之前叫portmapper启动顺序:1️⃣先把这个
中介启动起来, 2️⃣接着就是NFS服务端NFS上传自己的房源,把自己的
进程,端口都告诉中介等到有人(
客户端)连我NFS的时候,再告诉它
1.安装包的区别# 支持v3版本的nfs服务端 及需要安装nfs,还需要安装rpcbindyum install -y rpcbind nfs-utils # nfs服务端
# 客户端只需要安装nfs软件包,不需要启动,就能够识别nfs,并挂载到nfs服务端了yum install -y nfs-utils
2.服务端的启动顺序# 一定要先启动rpcbind,再启动nfs[root@nfs ~]# systemctl start rpcbind[root@nfs ~]# systemctl enable rpcbind[root@nfs ~]# systemctl start nfs[root@nfs ~]# systemctl enable nfs
3.rpcbind的常见操作# 当我们顺序启动rpcbind和nfs后"先启动rpc后启动NFS服务,启动完NFS后,他就会去向rpc汇报自己的信息"# 就可以通过rpcbind -p查看nfs端口信息"这个操作,rpcinfo -p 就相当于我们中介自己查询了一下各种房源,也就是各种服务,和端口号。rpc这个中介服务的端口号为111""我们中介rpc会收到了很多的服务和端口"
- rpcinfo -p

这个命令主要用来检查,
rpc是否有nfs服务的信息能检查出什么??
nfs服务是否启动,端口是否开启
他们的
启动顺序是否有误,如果顺序有误也是查不出它的端口信息还有就是 配置文件有问题,或者没生效
cat /var/lib/nfs/etab进行查看
部署
reload VS restart

reload:有一个前提,就是你服务是运行着呢,否则是没有办法执行这条命令的- 一行就是一个
共享目录
服务端:
1.安装服务[root@nfs ~]# yum -y install nfs-utils# 再安装一次相当于更新!
2.配置服务# 配置文件默认为空[root@nfs ~]# cat /etc/exports/data 172.16.1.0/24(rw,sync,all_squash)rw:可读可写sync:固定参数,同时写入数据到内存和硬盘,防止数据丢失!all_squash:匿名用户压缩,all_所有用户都进行压缩(默认压缩为nobody)[root@nfs ~]#id nobodyuid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
3.根据配置创建必要数据[root@nfs ~]# mkdir /data[root@nfs ~]# chown nobody.nobody /data# 因为所有用户都压缩为nobody,所以需要修改我们这个目录的属主属组[root@nfs ~]# ll -d /datadrwxr-xr-x 2 nobody nobody 6 Aug 6 10:08 /data
4.启动服务[root@nfs ~]# systemctl start nfs[root@nfs ~]# systemctl enable nfs
5.检测服务的配置文件是否正确# 如果此文件有内容说明配置正确,如果为空配置不正确# 也要检查和自己的/etc/exports里面的配置信息是否一致[root@nfs ~]#cat /var/lib/nfs/etab/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)
说明:
/etc/exports(配置文件里面的) ——>/var/lib/nfs/etab(当前使用的nfs服务端的配置)
- 两个文件等价,后面的 用来检测配置是否正确
❤️简要流程

左边web服务器
web01挂载到远程NFS服务器 它使用root身份创建了一个文件 如果也是用root身份写入到远程NFS服务器, 就会很危险,所以必须进行用户压缩
all_squash全部都降级,降级为我NFS服务器上的虚拟用户身份,默认身份为nobody所以NFS服务器中创建的目录身份必须是nobody
实际上是
封装与解封装的模式来进行的
客户端:
- 通俗易懂点:就是在哪里执行mount命令,那么他就是客户端
故障案例:

- 我们直接进行挂载看一下,报错了

客户端 只需要安装nfs就够用了,也不用安装
rpc这个中间件
rpcbind它是跑在服务端的,并不用跑在客户端

1.安装服务[root@nfs ~]# yum -y install nfs-utils# 客户端也得安装服务
2.查看服务端共享的信息[root@web01 ~]#showmount -e 172.16.1.31Export list for 172.16.1.31:/data 172.16.1.0/24#共享目录 可以访问的网段#一定要仔细检查他的目录和访问的网段,不要打错。# 能找到,而且自己的IP允许访问,那么我们客户端就能进行挂载
3.挂载[root@web01 ~]#mount -t nfs 172.16.1.31:/data /mnt# 将nfs服务端的data目录挂载到客户端本地的/mnt目录,我们只要在mnt目录下增删改查就会同步到服务端[root@web01 ~]#df -hFilesystem Size Used Avail Use% Mounted ondevtmpfs 459M 0 459M 0% /devtmpfs 475M 0 475M 0% /dev/shmtmpfs 475M 6.8M 468M 2% /runtmpfs 475M 0 475M 0% /sys/fs/cgroup/dev/sda3 49G 3.8G 46G 8% //dev/sda1 195M 122M 74M 63% /boottmpfs 95M 0 95M 0% /run/user/0172.16.1.31:/data 49G 3.8G 46G 8% /mnt# 看最后一行,有就是挂载上了
4.永久挂载(根据需求进行开机自动挂载)[root@web01 ~]# tail -1 /etc/fstab172.16.1.31:/data /mnt nfs defaults 0 0# 永久挂载后,后面需要优先启动服务端NFS
# web02挂载(前提是下载了nfs服务,不用启动)[root@web02 ~]#showmount -e 172.16.1.31Export list for 172.16.1.31:/data 172.16.1.0/24[root@web02 ~]#mount -t nfs 172.16.1.31:/data /mnt[root@web02 ~]#df -hFilesystem Size Used Avail Use% Mounted ondevtmpfs 459M 0 459M 0% /devtmpfs 475M 0 475M 0% /dev/shmtmpfs 475M 6.8M 468M 2% /runtmpfs 475M 0 475M 0% /sys/fs/cgroup/dev/sda3 49G 3.8G 45G 8% //dev/sda1 195M 122M 74M 63% /boottmpfs 95M 0 95M 0% /run/user/0172.16.1.31:/data 49G 3.8G 46G 8% /mnt# 成功挂载
6.验证[root@web01 ~]#touch /mnt/web01.txt# web01[root@web02 ~]#touch /mnt/web02.txt# web02[root@web02 ~]#ll /mnttotal 0-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web01.txt-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web02.txt❤️那么问题来了???
如果我们在
客户端进行删除,那么服务端这些文件都会消失吗?
当然会消失
web01和web02挂载上后,相当于拿了根线把他们连在了一起 (web01:/mnt,web02:/mnt,和web03:/data)
对这个
客户端/mnt的操作会同步到服务端/data目录下

大家
客户端进行 永久挂载 的时候,你的NFS服务端需要一直开着因为你如果不开的话,你的
web客户端如果想要进行挂载的时候,会卡顿而且
NFS服务端启动需要时间
❤️一个小故障
[root@web02 ~]#showmount -e 172.16.1.31Export list for 172.16.1.31:/data 172.16.1.0/24[root@web02 ~]#showmount -e 10.0.0.31Export list for 10.0.0.31:/data 172.16.1.0/24# 我们客户端进行查看服务端共享信息的时候,两个IP地址都能够进行查看
# 但是挂载的时候只能挂载内网的IP地址,也就是172.16.1.0/24网段[root@web02 ~]#mount -t nfs 10.0.0.31:/data /mntmount.nfs: access denied by server while mounting 10.0.0.31:/data# 挂载10.0.0.31/24挂载不上,我们服务端nfs的配置信息他只允许172.16.1.0/24网段,这个限制的是客户端的IP地址# 公司内网或许做了限制,只允许内网之间做访问吧!我只能这么解释了# 想让10.0.0.31/24,也能访问,我们只需要修改一下nfs服务端的配置文件就可以了
[root@web02 ~]#mount -t nfs 172.16.1.31:/data /mnt[root@web02 ~]#df -hFilesystem Size Used Avail Use% Mounted on/dev/sda3 49G 3.8G 46G 8% /.............................................172.16.1.31:/data 49G 3.8G 45G 8% /mnt# 成功挂载!
-
/proc/mounts当前系统 挂载情况的一个映射 -
grep '/mnt' /proc/mounts我们这里只是过滤了一下/mnt
一个小故障:
👑如果
NFS服务器的网络突然down掉了客户端的
df -h(磁盘信息)则 夯 住了 🛠️不报错,不反应,不退出 但其他信息,或者页面能够正常显示如果想要挂载一个目录,当你df -h看,并没有,但是呢,你mount挂载还挂不上
从而出现 灵异事件?
/proc/mounts(内存中的映射)这个目录的挂载信息更加权威一点可以过滤一下,是否挂载成功!
又或者你删除的时候,来一波强制删除,
unmount -lf删除了之后再挂载试试
- 我们客户端
夯住,先过滤/proc/mounts有则强制删除(取消挂载),**再检查 **启动NFS服务- 正常启动后,客户端重新挂载
❤️小总结

NFS用来实现数据一致性服务端检测配置成功的命令
cat /var/lib/nfs/etab
客户端需要提前安装
nfs-utils,查看服务端共享信息showmount -e 172.16.1.31
NFS参数

- 我们用
同步多一点

**同步:**直接访问到网站的对应资源
**异步:**优先访问缓存
ro # 只读rw: # 可读可写sync: # 固定参数,同时写入数据到内存和硬盘,防止数据丢失!all_squash:匿名用户压缩,all_所有用户都进行压缩(默认压缩为nobody)anonuid=uid # 指定uidanongid=gid # 指定gid[root@nfs ~]#id nobodyuid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
1.验证只读ro# 修改配置文件为只读[root@nfs ~]# cat /etc/exports/data 172.16.1.0/24(ro,sync,all_squash)# 重启服务生效[root@nfs ~]# systemctl restart nfs
# 客户端测试[root@web01 mnt]# echo aaa > web02.txt-bash: web02.txt: Read-only file system[root@web02 mnt]# echo aaa > web02.txt-bash: web02.txt: Read-only file system用户压缩

- 默认压缩为
nobody,默认uid和gid是 65534

2.指定匿名用户 anonuid=666 anongid=666# 修改配置文件指定匿名用户uid为666[root@nfs ~]#cat /etc/exports/data 172.16.1.0/24(rw,sync,all_squash,anongid=666,anonuid=666)# anonuid,annogid
# 创建uid和gid为666的www虚拟用户[root@nfs ~]#groupadd -g 666 www[root@nfs ~]#useradd -g 666 -u 666 -s /sbin/nologin -M www# 记得要先创建组,再创建虚拟用户[root@nfs ~]#cat /etc/passwd | tail -1www❌666:666::/home/www:/sbin/nologin[root@nfs ~]#id wwwuid=666(www) gid=666(www) groups=666(www)
# 修改目录的属主属组为www[root@nfs ~]#chown www.www /data[root@nfs ~]#ll -d /datadrwxr-xr-x 2 www www 40 Jan 19 20:15 /data
#重启生效[root@nfs ~]# systemctl restart nfs
# 检测配置文件是否正确[root@nfs ~]#cat /var/lib/nfs/etab/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)# 检查里面配置信息和自己的配置信息是否一致
#客户端测试(提起安装nfs-utils)[root@web01 ~]#showmount -e 172.16.1.31Export list for 172.16.1.31:/data 172.16.1.0/24[root@web01 ~]#mount -t nfs 172.16.1.31:/data /mnt[root@web01 ~]#df -hFilesystem Size Used Avail Use% Mounted on/dev/sda3 49G 3.7G 46G 8% /.........172.16.1.31:/data 49G 3.8G 45G 8% /mnt# 这个就是挂载上了[root@web01 ~]#ll /mnttotal 0-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web01.txt-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web02.txt# 这里面是之前创建的文件[root@web01 ~]#touch /mnt/hh.txt[root@web01 ~]#ll /mnttotal 0-rw-r--r-- 1 666 666 0 Jan 20 19:12 hh.txt-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web01.txt-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web02.txt# 我们web01新建的hh.txt为什么没有用户名,只有uid和gid
# 切换nfs服务器中进行查看[root@nfs ~]#ll /datatotal 0-rw-r--r-- 1 www www 0 Jan 20 19:12 hh.txt-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web01.txt-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web02.txt# 但是nfs服务器中我们是可以查看到具体的用户的,这是为什么???'我们web01客户端创建的文件,来到服务端后,被压缩为www用户''服务端创建了这个用户,而web01客户端并没有创建这个用户,所以我们web01客户端查看不到具体的用户,只有uid和gid'[root@web01 ~]#id wwwid: ‘www’: no such user# web01,并没有这个用户# 如果我们想要web01显示这个用户,那么进行创建这个用户就可以了[root@web01 ~]#groupadd -g 666 www[root@web01 ~]#useradd -g 666 -u 666 -s /sbin/nologin -M www# 和服务端创建用户的过程一样[root@web01 ~]#grep www /etc/passwdwww❌666:666::/home/www:/sbin/nologin[root@web01 ~]#id wwwuid=666(www) gid=666(www) groups=666(www)# 关于www用户,两端都应该有# nfs服务端一定不能删除,要一直保持着[root@web01 ~]#ll /mnttotal 0-rw-r--r-- 1 www www 0 Jan 20 19:12 hh.txt-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web01.txt-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web02.txt# 当我们创建好用户后,再次查看/mnt下的hh.txt就显示www用户了案例
1.服务端共享两个目录/data/a rw/data/b rw2.web01挂载上面共享目录/data/a--->挂载到自己本地/oldboy/test01/data/b--->挂载到自己本地/oldboy/test02-----------------------------------------# 我们使用www用户进行压缩(三端都要有www虚拟用户,自行创建)# 修改配置文件[root@nfs ~]#cat /etc/exports/data/a 172.16.1.0/24(rw,sync,all_squash,anongid=666,anonuid=666)/data/b 172.16.1.0/24(rw,sync,all_squash,anongid=666,anonuid=666)# 创建对应的目录信息[root@nfs ~]#mkdir -p /data/{a,b}[root@nfs ~]#tree /data//data/├── a└── b[root@nfs ~]#id wwwuid=666(www) gid=666(www) groups=666(www)[root@nfs ~]#ll -d /datadrwxr-xr-x 4 root root 24 Jan 20 20:47 /data# 修改属主和属组[root@nfs ~]#chown -R www.www /data[root@nfs ~]#ll -d /data/{a,b}drwxr-xr-x 2 www www 6 Jan 20 20:47 /data/adrwxr-xr-x 2 www www 6 Jan 20 20:47 /data/b# 现在里面的文件属主和属组都是www了# 重启服务[root@nfs ~]#systemctl restart nfs# 查看更具体的配置信息[root@nfs ~]#cat /var/lib/nfs/etab/data/b 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)/data/a 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)----------------------#服务端配置完结# 来到web01客户端1)创建/oldboy/test01 /oldboy/test02[root@web01 ~]#echo /oldboy/test{01,02}/oldboy/test01 /oldboy/test02[root@web01 ~]#mkdir -p /oldboy/test{01,02}[root@web01 ~]#tree /oldboy//oldboy/├── test01└── test02
2)查看服务端共享的目录[root@web01 ~]#showmount -e 172.16.1.31Export list for 172.16.1.31:/data/b 172.16.1.0/24/data/a 172.16.1.0/24
3)挂载使用[root@web01 ~]#mount -t nfs 172.16.1.31:/data/a /oldboy/test01[root@web01 ~]#mount -t nfs 172.16.1.31:/data/b /oldboy/test02[root@web01 ~]#df -hFilesystem Size Used Avail Use% Mounted on/dev/sda3 49G 3.7G 46G 8% /................172.16.1.31:/data/a 49G 3.8G 45G 8% /oldboy/test01172.16.1.31:/data/b 49G 3.8G 45G 8% /oldboy/test02
4)测试使用[root@web01 ~]#touch /oldboy/test01/1.txt[root@web01 ~]#touch /oldboy/test02/2.txt[root@web01 ~]#tree /oldboy//oldboy/├── test01│ └── 1.txt└── test02 └── 2.txt# 这个是服务端[root@nfs ~]#tree /data//data/├── a│ └── 1.txt└── b └── 2.txt# 这个是nfs服务端[root@nfs ~]#find /data -type f -name "*.txt"/data/a/1.txt/data/b/2.txt[root@nfs ~]#find /data -type f -name "*.txt" | xargs ls -lh-rw-r--r-- 1 www www 0 Jan 20 20:59 /data/a/1.txt-rw-r--r-- 1 www www 0 Jan 20 20:59 /data/b/2.txt------------------------------#web01完结3.web02挂载上面共享目录/data/a--->挂载到自己本地/oldboy/test01/data/b---->挂载到自己本地/oldboy/test02操作和WEB01相同.优缺点与优化
NFS存储优点
NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求
NFS存储局限 1)存在 单点故障 , 如果构建高可用维护麻烦
web->nfs()->backup2)NFS数据明文, 并不对数据做任何校验 3)客户端挂载NFS服务没有密码验证, 安全性一般( 内网使用 )


-
让用户走的路越来越短,从而 用户访问网站的速度越来越快
-
把用户的请求往前推,合理运用
CDN缓存



只能上传,无法执行,防止病毒脚本…
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!



