1.1工作内容与目标
1)内容
- 存储是什么,网站架构的地位
- 为何使用存储
- 存储分类
- NFS存储原理
- NFS部署,配置与使用
- NFS配置案例与详解
- 总结
2)目标
- 说出网站为何使用存储服务(共享存储)
- 说出常见存储服务
- 搭建NFS存储,对服务进行配置(比如共享/nfsdata/目录)
- 故障排查与解决
1.2概述
- 存储:用于存放用户上传的内容(数据),一般应用在网站集群中
- 为何用?
- 如果不使用存储,用户上传的数据就直接存放在网站服务器(多台)上了,用户下次访问就可能找不到(用户体验不好)
- 如果使用存储,用户上传的内容存放在存储上面,用户访问就会访问存储。
- 位置:网站后排(共享目录,通过网站服务器访问)
1.3存储选型⭐⭐⭐
| 分类 | 说明 | 选型 |
| 硬件存储 | 硬件存储,硬盘多,使用的时候挂载即可。SAN存储,NAS存储,厂商华为,H3C..硬件存储,Dell EMC | 物理服务器使用 |
| 开源软件 | 普通存储(单点):NFS(linux服务端客户端),Samba(linux服务端,Windows客户端)分布式存储:MinIO,Ceph,GlisterFS,FastDFS… | 物理服务器,云服务器,NFSDocker,k8s选择minio/ceph… |
| 云产品存储 | 阿里云OSS(对象存储),七牛云存储,腾讯云COS,华为OSS | 一般云服务器使用,使用最简单(只需关注使用) |
- 单点存储是“把所有鸡蛋放在一个篮子里”
- 而分布式存储是“把鸡蛋分放在多个篮子里,并且每个鸡蛋都有备份”—其中1台挂了还有其他服务器
- 服务选型要选择适合网站需求的。
1.4 NFS原理⭐⭐⭐⭐⭐
- NFS服务
- rpcbind(portmap)rpc服务(远程调用协议)
- 关于RPC服务的说明:
- PRC:远程过程调用,本质起到调度作用
- rpc服务从CentOS 6开始叫rpcbind,之前叫portmapper
1.5极速上手指南⭐⭐⭐⭐⭐
1)环境准备
| 环境 | 主机 | ip地址 | 说明 |
| nfs服务端 | nfs01 | 10.0.0.31/172.16.1.31 | |
| nfs客户端 | web01 | 10.0.0.7/172.16.1.7 | 通过挂载使用nfs服务 |
| nfs客户端 | web02 | 10.0.0.8/172.16.1.8 | 通过挂载使用nfs服务 |
| 服务端流程 | 客户端流程 |
| 1️⃣检查与部署(安装软件包) | 1️⃣检查与部署(安装软件包) |
2️⃣修改配置文件并reload nfs | 2️⃣不需要启动 |
| 3️⃣根据共享目录,创建目录,修改所有者权限(默认nobody) | 3️⃣创建挂载点(不用改权限) |
| 4️⃣服务启动(rpcbind—>nfs,注意先后) | 4️⃣mount挂载(df -hT查看)与修改/etc/fstab永久挂载 |
5️⃣检查(showmount -e 服务端ip)与测试(mount,df -hT)临时挂载点/mnt/ | |
2)服务端部署
①检查与部署
#1.检查是否安装
rpm -qa|egrep 'nfs|rpcbind'
#2.如果没有软件包就yum安装即可
yum install -y rpcbind nfs-utils
②启动
#1.启动rpcbind
systemctl enable rpcbind
systemctl start rpcbind
rpcinfo -p 服务端ip #由于未启动nfs,此时信息中还没有关于nfs的信息
#2.启动nfs
systemctl enable nfs
systemctl start nfs
rpcinfo -p 服务端ip #再查看就有了(端口等信息)。在服务端时,可以只写rpcinfo -p
③NFS服务端的配置
#1.修改配置文件
vim /etc/exports
#2.共享/nfsdata/目录
写入内容:/nfsdata/ 172.16.1.0/24(rw) #1.共享的/nfsdata/目录 用户为nobody, 允许的网段进行(rw读写,ro只读)
#配置表示:172.16.1.0/24网段对NFS服务端的/nfsdata/目录,拥有rw读写权限.
#3.创建共享目录/nfsdata/
mkdir -p /nfsdata/
#4.修改/nfsdata/所有者为nobody(centos系统中为nfsnobody)
chown -R nobody.nobody /nfsdata/
#5.重启服务
systemctl reload nfs #使用reload,不会断开已有连接
#6.检查
showmount -e nfs01 #查看共享的目录
reload表示优雅地重启,不会断开已有连接。(目前只在nfs,nginx服务中有reload)
restart在nfs中,会导致客户端一段时间夯(卡)住。
④NFS服务端本地测试
#1.挂载存储
mount -t nfs 172.16.1.31:/nfsdata/ /mnt/ #先临时挂载到/mnt/上
在/mnt/(相当于大门,从这进入)创建文件,实际就创建到了/nfsdata/目录下
⑤排错指令:rpcinfo -p ip和showmount -e ip
rpcinfo -p 服务端ip:检查nfs服务端的rpc信息,主要检查是否有NFS信息(如端口)即可
showmount -e ip:检查nfs服务端共享信息(共享哪些目录,允许访问的网段)
#1.查看nfs服务端共享哪些目录
showmount -e ip或不写 #ip为nfs服务端ip
[root@nfs01 ~]# showmount -e
Export list for nfs01:
/nfsdata 172.16.1.0/24
[root@nfs01 ~]# showmount -e nfs01 #因为配置过hosts解析
Export list for nfs01:
/nfsdata 172.16.1.0/24
[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/nfsdata 172.16.1.0/24
⑥NFS服务端小结
- 部署:nfs-utils,rpcbind
- 修改配置:/etc/exports
- 准备环境:目录,修改权限
- 启动服务:rpc,nfs(后面修改配置文件,只需要重启
systemctl reload nfs)
- 服务端本地测试(mount)
3)客户端挂载
#1.检查是否安装了nfs,rpcbind
rpm -qa|egrep 'nfs|rpcbind'
#2.如果没有安装,则yum安装下
yum install -y nfs-utils
#3.临时挂载(要创建挂载点的目录)
mount -t nfs 172.16.1.31:/nfsdata/ /upload/
#永久挂载到/upload/--->/etc/fstab
在/etc/fstab写入即可:172.16.1.31:/nfsdata/ /upload/ nfs defaults 0 0
①挂载时故障案例
- 错误提示:mount:wrong fs type:错误的文件系统类型,客户端无法识别nfs
- 需要在客户端安装nfs-utils,不用启动
4)服务端与客户端小结
| 角色 | 流程 |
| 服务端 | 1️⃣部署软件nfs-utils,rpcbind2️⃣创建共享目录,修改所有者(nobody),centos系统为nfsnobody3️⃣修改配置文件(/etc/exports)4️⃣启动rpcbind,nfs((重启时reload nfs即可))5️⃣挂载测试(mount) |
| 客户端 | 1️⃣部署软件nfs-utils,系统可以挂载nfs2️⃣挂载nfs3️⃣永久挂载–>/etc/fstab |
tips:如果做了永久挂载,后面开机需要先启动存储服务器,然后启动web服务器。否则读取到/etc/fstab文件,挂载不上,会卡住,因为存储服务器未开机。
1.6 NFS相关的文件
| nfs服务端和客户端 | 说明 |
| nfs服务端配置 | /etc/exports(配置文件里面的)–>/var/lib/nfs/etab(详细,当前使用的nfs服务端配置) |
| nfs客户端配置 | /etc/rc.local或/etc/fstab–>/proc/mounts(当前系统的挂载情况) |
#方法1:挂载命令写入到/etc/rc.local
chmod +x /etc/rc.d/rc.local
#方法2:按照/etc/fstab格式要求书写
设备 挂载点 文件系统类型 挂载参数 是否检查 是否备份
172.16.1.31:/nfsdata/ /upload nfs defaults 0 0
tips:如果配置了nfs客户端永久挂载,未来要优先启动nfs服务端
1)故障案例–df -h夯住(卡死)
小结:
- 核心:服务端配置/etc/exports
- 核心:客户端永久挂载方式
- 核心:客户端挂载与使用失败,
df -h夯住,去看看/proc/mounts查找是否有失败挂载
故障案例:nfs服务端异常
- 现象:
df -h或ls 挂载点的时候夯住
- 原因:一般nfs服务端问题
- 解决:在/proc/mounts中过滤nfs,找出nfs挂载点,通过
umount -lf强制卸载,然后重新挂载即可。
①故障复现
#1.挂载好nfs客户端
mount -t nfs 172.16.1.31:/nfsdata/ /upload/
#2.关闭nfs服务端
#3.来到客户端使用ll -d /upload/或df -h命令
#4.在/proc/mounts中过滤nfs,找出nfs挂载点,通过umount -lf强制卸载,然后重新挂载即可。
②故障解决
1.7 NFS服务端的配置文件
- 了解:/etc/exports由来,nfs管理systemctl命令的背后是在调用exportfs命令
systemctl cat nfs
1)配置文件格式
| /etc/exports | 说明 |
| 第1部分 | 共享目录 |
| 第2部分 | 网段(nfs配置) |
2)NFS配置文件中网络配置
| 网段 | 说明 |
| 172.16.1.0/24 | 指定网段(最常用) |
| 172.16.1.7 | 指定ip |
| baidu.com | 指定域名 |
3) 服务端核心配置⭐⭐⭐⭐⭐
| 服务端配置选项 | 说明 |
| rw | read write 可以读写共享目录 |
| ro | read only 只读 |
| sync | 同步,只要用户上传,就把数据写到磁盘上 |
| async | 异步,用户上传的数据,nfs先临时存放到内存中,过一段时间写入到磁盘,并发高(用户访问量大),数据可能丢失 |
同步与异步⭐⭐⭐⭐⭐(eg:幼儿园工作)
- 同步:挨个小伙伴问,你是否要上wc
- 异步:画了个圈圈,需要去wc的到这个圈圈中,定时去带走圈圈里面的人
- CPU->先到内存->再写入磁盘
- 同步在网站架构中指的是直接访问对应的资源。
- 异步在网站架构中利用各种缓存达到用户优先访问缓存,缓存没有再访问对应服务。(CDN)
4)服务端用户压缩⭐⭐
user mapping 用户压缩或用户映射
- 现象:客户端访问的时候的用户root,到了服务端变成了nobody或nfsnobody
- NFS客户端挂载NFS服务端后,创建的文件默认属于nobody,这种操作就叫用户压缩(映射)
- 用户压缩是通过NFS服务端的配置实现
| 服务端配置选项-用户压缩系列 | 说明 |
| root_squash | 如果客户端是root用户访问,则到了nfs服务端会被压缩(默认的)匿名用户 |
| no_all_squash | 如果客户端不是root用户访问,则不进行压缩(保存原始用户) |
| all_squash | 所有用户都进行压缩(设置为匿名用户,默认的)–不安全 |
| anonuid和anongid | 用于指定压缩的匿名用户(默认是nobody用户),anonuid=65534,anongid=65534 |
- 用户压缩/用户映射:NFS客户端访问NFS共享目录的时候变成了什么用户
- root(nfs客户端用户)—->nobody(nfs服务端用户)
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,gid统一1999,1999
#2.nfs服务端配置
#3.nfs客户端挂载
#第一步(可省略添加用户组(部分不行))
#groupadd -g 1999 www
#useradd -s /sbin/nologin -M -u 1999 -g www www #第1个www是用户组的名字,第2个是虚拟用户的名字
useradd -s /sbin/nologin -M -u 1999 www
#第二步(nfs服务端配置)vim写入配置文件内容,创建用户,创建目录,修改权限,reload重启nfs,
[root@nfs01 ~]# cat /etc/exports
/nfsdata/ 172.16.1.0/24(rw)
/nfs/pics 172.16.1.0/24(rw,all_squash,anonuid=1999,anongid=1999) #新添加的
groupadd -g 1999 www #创建用户组www,gid:1999
useradd -s /sbin/nologin -M -u 1999 -g www www #创建虚拟用户www,指定uid,gid(gid名)
mkdir -p /nfs/pics #创建共享目录
chown -R www.www /nfs/pics #修改共享目录权限为www
systemctl reload nfs #优雅地重启nfs
showmount -e #检查
[root@nfs01 ~]# cat /var/lib/nfs/etab
/nfs/pics 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=1999,anongid=1999,sec=sys,rw,secure,root_squash,all_squash)
/nfsdata 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)
#第三步(nfs客户端挂载)
mount -t nfs 172.16.1.31:/nfs/pics /upload-pic/ #在客户端/upload-pic/下创建文件,真正存储在服务端的/nfs/pics目录下
[root@web01 ~]# df -hT /upload-pic/
文件系统 类型 容量 已用 可用 已用% 挂载点
172.16.1.31:/nfs/pics nfs4 96G 4.2G 92G 5% /upload-pic
touch /upload-pic/lidao.txt
[root@web01 ~]# ll /upload-pic/
总用量 0
-rw-r--r-- 1 www www 0 10月 20 19:29 lidao.txt
①客户端若不创建虚拟用户www的麻烦
您看到的1999 1999正是 NFS 身份压缩机制成功工作的铁证。它证明了服务端确实将所有用户都映射到了 UID=1999,并且因为客户端/etc/passwd和/etc/group缺少对应的用户记录,所以无法将其翻译成友好的用户名。
项目小结:
- 项目web服务器和nfs服务器统一虚拟用户
- 为了系统安全
- nfs服务器配置文件:all_squash,anonuid,anongid
小结
- 说出网站为何使用存储服务器(共享存储)
- 存储选型
- 搭建NFS存储,对服务进行配置(比如共享/nfsdata/目录)
- 用户映射选型:all_squash,anonuid,anongid
- 故障与排查:
rpcinfo -p ip,showmount -e ip