目录
Toggle3.1 nfs核心掌握
1) 内容
存储是什么,网站架构地位
为何使用存储
存储分类
NFS存储原理
NFS部署,配置与使用
NFS配置案例与详解
总结
2) 目标
说出来网站为何是否存储服务(共享存储)
说出常见存储服务.
搭建NFS存储,对服务进行配置(比如共享/nfsdata目录)
故障与排查
3.2 概述
存储: 用于存放用户上传的内容(数据),一般应用在网站集群中.
为何用?
如果不使用存储,用户上传的数据就直接存放在网站服务器上了,用户下次访问就可能找不到.
如果使用存储,用户上传的内容存放在存储上面,用户访问就会访问存储.
位置: 网站后排
3.3 存储选型
怎么实现?
简单一点的网站用NFS
对象存储的本质就是物理服务器+分布式存储搭建好,负责维护,给用户使用
3.4 NFS原理
NFS (Network File System): 网络文件系统.
NFS服务端:2个服务组成
NFS服务:rpcbind(portmap)rpc服务(远程调用协议)
关于RPC的说明:
RPC:远程过程调用,本质起到调度作用.
rpc服务从CentOS 6开始叫rpcbind,之前叫portmapper.
3.5 部署及使用
1.环境说明
2.服务端部署使用
1)部署(安装软件)
#检查是否安装
rpm -qa |egrep 'nfs|rpcbind'
#如果没有就安装
yum install -y rpcbind nfs-utils
启动(先启动RPC)
#启动rpcbind
systemctl enable rpcbind
systemctl start rpcbind
rpcinfo -p
##查看rpc服务信息,这个服务另一个名字是portmapper
#启动nfs
systemctl enable nfs
systemctl start nfs
rpcinfo -p
2)NFS服务器配置
#1.创建共享目录/nfsdata/
#2.修改/nfsdata所有者为nobody (centos 系统中 nfsnobody)
chown -R nobody.nobody /nfsdata/
#3.修改nfs服务端配置文件/etc/exports
[root@nfs01 ~]# cat /etc/exports
#1.共享/nfsdata/目录 用户 nobody
/nfsdata/ 172.16.1.0/24(rw)
#配置表示: 172.16.1.0/24网段对NFS服务端的/data/目录,拥有
rw读写权限.
[root@nfs01 ~]# systemctl reload nfs
查看是否配置成功nfs:showmount -e/nfs机器ip/主机名
[root@nfs01 ~]# showmount -e
Export list for nfs01:
/nfsdata 172.16.1.0/24
[root@nfs01 ~]# showmount -e nfs01
Export list for nfs01:
/nfsdata 172.16.1.0/24
reload表示优雅重启,不会断开已有连接(目前只有nfs和nginx有). restart在nfs中,会导致客户端一段时间的夯住
NFS服务端本地进行测试:使用(挂载 mount 或 /etc/fstab )
#挂载存储
mount -t nfs 172.16.1.31:/data/ /mnt/
排错指令: rpcinfo -p ip 和showmount -e ip
NFS服务端小结
部署:nfs-utils,rpcbind
1. 准备环境:目录,权限
服务配置文件:/etc/exports
2.启动服务:rpc,nfs(后面修改配置文件,只需要重启nfs reload)
3.服务端本地测试(mount)
mount -t nfs 172.16.1.31:/data/ /mnt/
3)客户端挂载
客户端操作:
如果客户端没有安装NFS,挂载会显示:选项错误,需要安装NFS系统才能挂载nfs类型的文件系统
临时挂载:安装nfs-utils,不用启动,使用挂载命令mount -t nfs 172.16.1.31:/data/ /mnt/即可使用(-t 指定类型)
卸载:umount /mnt
强制卸载:umount -lf /mnt
永久挂载:
①mkdir -p /upload
②vim /etc/fstab
👉添加 172.6.1.31:/nfsdata/ /upload/ nfs defaults 0 0
注意:永久挂载之后必须保证NFS服务器比客户端先启动,保证正常挂载
故障案例:
mount: wrong fs type 错误的文件系统类型,客户端无法识别nfs.
5) 服务端与客户端小结(步骤)
3.6 NFS相关的文件
服务端配置文件:/etc/exports👉相当于/var/lib/nfs/etab(不用修改)
客户端配置文件:
/etc/fstab(开机自动挂载)对应👉
/proc/mounts(当前系统的实时挂载情况)
小结
核心:服务端配置/etc/exports
核心:客户端永久挂载方式.
核心:客户端挂载与使用失败,df -h夯住,去看看,/proc/mounts查找是否有失败挂载.
3.7 NFS服务端的配置文件
/etc/exports由来nfs管理systemctl命令的背后是在调用exportfs命令
1) 配置文件格式
/etc/exports
第一部分 第二部分
共享目录 网段(nfs配置)
2) NFS配置文件中网络配置
网段
172.16.1.0/24(最常用)
172.16.1.7(指定ip)
baidu.com(指定域名)
3) 服务端核心配置(NFS默认同步)
理解:同步与异步⭐ ⭐ ⭐ ⭐ ⭐
幼儿园工作
同步: 挨个小伙伴问,你是否要上wc.
异步: 画了个圈圈,需要去wc的到这个圈圈中,定时去带走圈圈里面的人.
CPU 👉内存 👉 磁盘
同步在网站架构中指的是直接访问对应的资源.
异步在网站架构中利用各种缓存达到用户优先访问缓存,缓存没有再访问对应服务.
异步可以防止网站并发过高导致的卡顿,但是数据可能丢失
4) 服务端用户压缩
user mapping 用户压缩或用户映射?
现象:客户端 访问的时候的用户root,到了服务端变成了nfsnobody.
NFS客户端挂载NFS服务端后,创建的文件默认属于nfsnobody,这种操作就叫用户压缩(映射).
用户压缩是通过NFS服务端的配置实现.
默认情况只能root用户对共享目录进行读写操作,其他用户没权限
all_squash:所有用户都有权限,在nfs中被设置为匿名用户
用户压缩/用户映射: NFS客户端访问NFS共享目录的时候变成了什么用户.
nfs客户端用户 nfs服务端用户
root 👉nfsnoboby
想把默认的nfsnobody修改,需要在所有的客户端服务端创建统一用户且UID,GID一致,就可以在服务端配置文件中加上anonuid和anongid
5) 用户压缩案例
用户压缩案例:
搭建网站,对存储提出一些需求
nfs服务端设置/nfs/pics共享目录,匿名用户为www(都压缩为www).
www用户的uid,gid:1999 (服务端,客户端统一)
客户端挂载到/upload-pic/
流程 C(Client 客户端) S(Server 服务端)
①CS:部署nfs服务,rpcbind ✅
② CS:添加用户www,指定uid,gid ✅
③S:创建目录,修改权限,修改服务端配置文件 ✅
④ C:客户端进行挂载测试 ✅
#1. 所有主机(nfs服务端和nfs客户端)添加用户 www uid统一1999 1999
#2. nfs服务端配置
#3. nfs客户端挂载
#1. 所有主机(nfs服务端和nfs客户端)添加用户 www uid统一1999 1999
创建用户及用户组之前先id命令查询用户id,在grep/etc/passwd查看是否有uidgid号冲突
#groupadd -g 1999 www
#useradd -u 1999 -g www -s /sbin/nologin -M www
(-u设置用户id,-s 设置默认shell 无法登录,-M不创建家目录,-g 设置用户对应的基本用户组)
虽然省略 -g
参数时,系统会自动创建一个与用户名同名的组作为主组,但正确严谨的操作顺序如上,先创建一个名为www的用户组,id为1999,再将用户www加入1999的用户组中(显式指定)
useradd -u 1999 -s /sbin/nologin -M www
(此种方法可能出现的问题:组gid随机分配时:
如果主机A自动分配 GID=1999,主机B分配 GID=2000,在 NFS 共享目录中:
- 主机A创建的文件在主机B显示为未知用户
- 导致权限错误或文件访问失败
#2. nfs服务端配置
cat /etc/exports
/nfsdata/ 172.16.1.0/24 (rw,all_squash)
/nfs/pics/ 172.16.1.0/24 (rw,all_squash,anonuid =1999,anongid=1999)
systemctl reload nfs
重载服务生效修改
showmount -e
查看是否配置成功
❌注意,这里不可以同时共享/nfs/和/nfs/pics/,后面的子目录会失效
#3. nfs客户端挂载
mount - nfs 172.16.1.31:/nfs/pics/ /upload-pic/
du -h /upload-pic/
touch /upload-pic/test.txt
测试效果,之后去服务端看是否创建成功
ll /upload-pic/
项目小结:
项目web服务器和nfs服务器统一虚拟用户为www.为了系统安全.
nfs服务器配置文件中主要修改的:all_squash,anonuid,anongid.
3.8 NFS优化
终极优化目标: ⭐ ⭐ ⭐ ⭐ ⭐
尽可能让用户的请求在访问网站架构之前解决掉。(尽可能把用户的请求往前推)
NFS优化: 硬件(物理服务器+nfs服务)
NFS安全优化: 客户端挂载 只能上传,无法执行.
有可能用户上传的数据中有病毒等不安全因素,存储中的解决方案:
mount -o 指定挂载选项,有这个概念
mount -o noexec,nosuid,nodev -t nfs
在web服务器的程序代码中也可以拦住类似的危险操作,在存储中是最后一道防线
noexec:取消挂载后重新挂载时加上选项,禁止执行命令,mount -t nfs -o noexec 172.16.1.31:/nfs/pics/ /upload-pic/
172.16.1.31:/data /video/
#这几个是客户端挂载选项
noexec 挂载的nfs目录中如果有命令,无法运行。
nosuid 带有suid的命令
nodev 带有特殊属性的文件。
永久生效实现方法:/etc/fstab中的defaults改成这三个如👇:
#/etc/fstab
172.16.1.31:/data/ /video/ nfs noexec,nosuid,nodev 0 0
NFS有单点故障的解决方案:
准备个nfs备用节点(数据),故障的时候进行切换(取决于nfs可以挂多久).
或者直接用多个节点的服务:
分布式存储:GlusterFS(GFS),MinIO,Ceph…………,FastDFS,Mfs
公有云OSS(阿里云) (对象存储在代码里面调用)
3.9 NFS小结
说出来网站为何是否存储服务(共享存储)
存储选型
核心:①搭建NFS存储,对服务进行配置(比如共享/nfsdata目录)
②用户映射选项:all_squash,anonuid,anongid
常用:故障与排查:rpcinfo -p ip ,showmount -e ip
解决nfs服务单点问题: 实时同步lsyncd.
完成项目:全网备份项目,共享存储,nfs存储实时同步(解决单点)
1.服务器重启后NFS服务没有正常启动:
解决方案:排查配置文件/共享目录是否有问题
注意:status查看运行状态excited是正常情况
2.访问被拒绝(access denied):
原因:挂载用的ip与服务端配置文件里指定的主机ip地址不符,导致无法找到对应的机器,或者共享目录权限不对(所属主nobody)
3.使用nfs客户端挂载或查看nfs挂载目录时卡住了:
排查:先ping ip,然后检查防火墙/selinux
当df -h卡住了如何寻找挂载点:客户端/proc/mounts里面过滤nfs即可
服务端没有日志文件,使用status查看运行状况/报错信息
客户端排查问题使用showmount -e nfs01
检查