Appearance
存储概述
存储是什么
存储: 用于存放用户上传的内容(数据),一般应用在网站集群中
如果不使用存储,用户上传的数据就直接存放在网站 服务器 上了,用户下次访问就可能找不到
如果使用存储,用户上传的内容存放在存储上面,用户访问就会访问存储. 位置: 网站后排.
存储分类
存储类别 | 描述 | 示例/相关技术 |
---|---|---|
本地存储 | 存储直接连接到计算机或服务器上的存储设备。 | 硬盘(HDD)、固态硬盘(SSD)、SATA、SCSI、IDE、NVMe 等 |
网络存储 | 通过网络访问的存储资源,通常由专门的存储设备提供。 | NAS(Network Attached Storage)、SAN(Storage Area Network)、iSCSI 等 |
块存储 | 将存储分为固定大小的块,通常用于直接存储。可以按需扩展。 | 硬盘、SSD、LVM(Logical Volume Manager)、RAID(Redundant Array of Independent Disks) |
文件存储 | 基于文件的存储,通常由操作系统管理。适合存储文件和目录。 | NFS(Network File System)、SMB/CIFS(Samba)、FTP、S3(Amazon Simple Storage Service) |
对象存储 | 存储数据对象而不是文件或块,适用于海量数据存储。 | AWS S3、Ceph、OpenStack Swift、MinIO 等 |
云存储 | 通过互联网提供的存储服务,通常由云提供商提供。 | Amazon S3、Google Cloud Storage、Azure Blob Storage、阿里云 OSS 等 |
光存储 | 使用光盘等光学介质存储数据。 | CD、DVD、Blu-ray、光纤存储(例如光纤磁盘阵列) |
虚拟存储 | 通过虚拟化技术提供的存储资源,通常由多个物理存储资源组合而成。 | VMware vSphere、KVM、Hyper-V 中的虚拟磁盘、vSAN 等 |
NFS 原理
bash
A[1. rpc服务启动,收集信息] --> B[2. 启动NFS服务,主动向rpc注册]
B --> C[3. 向rpc发送请求]
C --> D[客户端]
D --> E[4. rpc服务响应,响应用户端口号]
E --> F[5. 发出请求,进行挂载(mount),使用NFS共享目录]
流程说明
rpc服务启动,收集信息
当rpc服务启动时,它会收集系统中可用的服务信息,包括它们所监听的端口等。
启动NFS服务,主动向rpc注册
NFS(Network File System)服务启动后,会主动向rpc注册自己的服务信息,包括提供的服务类型、监听的端口等。
向rpc发送请求
当客户端需要访问NFS服务时,它会向rpc发送请求,询问NFS服务的详细信息,如端口号等。
rpc服务响应,响应用户端口号
rpc服务接收到客户端的请求后,会查找已注册的NFS服务信息,并将相关信息(如端口号)响应给客户端。
发出请求,进行挂载(mount),使用NFS共享目录
客户端接收到rpc服务响应的NFS服务信息后,会向NFS服务发出挂载请求。
NFS服务接收到挂载请求后,会进行相应的处理,并允许客户端挂载共享目录。
客户端成功挂载后,就可以像访问本地目录一样访问NFS共享目录中的文件了
环境配置
NFS 两个命令
rpcinfo -p
rpcinfo
是一个用于查询和显示 RPC(Remote Procedure Call) 服务状态的命令。rpcinfo -p
命令用于列出系统中所有正在运行的 RPC 服务及其端口号。
命令解释:
**rpcinfo**
:这是一个查询 RPC 服务的工具。**-p**
:该选项表示列出所有在当前主机上注册的 RPC 服务及其相关信息
showmount -e
showmount -e
命令是一个用于查看远程 NFS 服务器上共享的目录的工具。它可以列出远程服务器共享的 NFS 目录及其允许的客户端。
命令解释:
**showmount**
:这是一个用来显示远程 NFS 服务器共享信息的工具。**-e**
:该选项表示列出远程 NFS 服务器共享的目录
shell
[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
100005 1 udp 20048 mountd
[root@nfs01 ~]# showmount -e
Export list for nfs01:
/nfs/zrlog 172.16.1.0/24
/nfs/blog 172.16.1.0/24
/nfs/wordpress 172.16.1.0/24
/nfsdata 172.16.1.0/24
shell
yum install -y nfs-utils rpcbind
systemctl enable --now rpcbind nfs
``shell
/nfsdata 172.16.1.0/24(rw)
共享目录 可以访问nfs服务端的网段(可读写)
# rw读写 ro只读
shell
mkdir /nfsdata
root@nfs01 ~]# id nobody
用户id=65534(nobody) 组id=65534(nobody) 组=65534(nobody)
chown -R nobody.nobody /nfsdata
systemctl reload nfs#优雅重启,前提服务运行中
mount -t nfs 172.16.1.31:/nfsdata /mnt/
#-t指定类型 nfs
#nfs服务端IP:共享目录 172.16.1.31:/nfsdata
#挂载点: /mnt
#查看挂载是否成功
[root@nfs01 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
172.16.1.31:/nfsdata nfs4 97G 4.2G 93G 5% /mnt
#本地测试
[root@nfs01 ~]# echo 123>/mnt/ttt.txt
[root@nfs01 /nfsdata]# ll
总用量 0
-rw-r--r-- 1 nobody nobody 0 3月 23 19:30 ttt.txt
**<font style="color:rgba(0, 0, 0, 0.88);">systemctl reload</font>** | <font style="color:rgba(0, 0, 0, 0.88);">nginx.conf</font>``<font style="color:rgba(0, 0, 0, 0.88);">exports</font> | |
**<font style="color:rgba(0, 0, 0, 0.88);">systemctl restart</font>** |
shell
yum install -y nfs-utils # CentOS/RedHat
apt-get install nfs-common # Ubuntu/Debian
#注意:客户端无需启动 nfs 或 rpcbind 服务,仅需安装工具包以支持挂载。
#手动挂载
mount -t nfs 172.16.1.31:/nfsdata /mnt
# 永久挂载(编辑/etc/fstab)
[root@web01 ~]# cat /etc/fstab
172.16.1.31:/nfsdata /upload nfs defaults 0 0
<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(246, 246, 246);">mount -t nfs 172.16.1.31:/nfsdata /mnt/</font>
**<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(246, 246, 246);">mount</font>**
**<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(246, 246, 246);">-t nfs</font>**
**<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(246, 246, 246);">172.16.1.31:/nfsdata</font>**
**<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(246, 246, 246);">172.16.1.31</font>**
<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(246, 246, 246);">nfs01</font>
**<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(246, 246, 246);">:/nfsdata</font>**
<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(246, 246, 246);">/etc/exports</font>
**<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(246, 246, 246);">/mnt/</font>**
NFS 配置解析以及案例
NFS 服务端配置文件
/etc/exports
/etc/exports
是 NFS 服务器的配置文件,用于配置哪些目录被共享以及如何共享。
shell
/nfs/wordpress/ 172.16.1.0/24(rw,all_squash,anonuid=1999,anongid=1999)
/nfs/blog/ 172.16.1.0/24(rw,all_squash,anonuid=1999,anongid=1999)
**rw**
:读写权限,表示客户端可以对共享目录进行读写操作。**all_squash**
:所有客户端用户都将被映射为匿名用户(nobody
用户)。也就是说,不管客户端使用哪个用户来访问 NFS 共享,都会被转换为匿名用户。**anonuid=1999**
和**anongid=1999**
:这两个选项指定了匿名用户的 UID 和 GID。即便是被映射为匿名用户,访问目录时,系统会将其视为 UID 为1999
和 GID 为1999
的用户
配置选项 | 说明 |
---|---|
rw | 读写权限,表示允许客户端进行读写操作 |
ro | 只读权限,表示客户端只能进行读取操作 |
sync | 同步模式,所有写操作都必须在确认写入后才返回 |
async | 异步模式,写操作不需要等待服务器确认即可返回 |
用户映射
bash
NFS(Network File System)是一种允许网络中不同计算机之间共享文件的协议。在NFS的配置中,用户映射(user mapping)是一个重要的环节,它决定了客户端用户如何与服务端的文件系统进行交互。本文将详细解释NFS客户端与服务端之间的用户映射配置。
基础配置
1. 默认配置
在默认配置下,NFS客户端的用户直接映射到服务端的同名用户。例如,客户端的root用户将映射到服务端的root用户,客户端的oldboy用户将映射到服务端的oldboy用户。
2. 匿名用户配置
为了安全考虑,通常会将客户端的root用户映射到服务端的一个匿名用户,如nfsnobody。这样,即使客户端以root身份访问,也只能拥有nfsnobody的权限。
配置示例:
root_squash:将客户端的root用户映射为服务端的匿名用户(默认nfsnobody)。
no_root_squash:不将客户端的root用户映射为匿名用户,即root用户保持其权限。
高级配置
1. 匿名用户指定
可以通过anonuid和anongid选项指定匿名用户的UID和GID。这样,所有被映射为匿名用户的客户端用户都将使用指定的UID和GID。
配置示例:
all_squash,anonuid=9999,anongid=9999:将所有客户端用户映射为服务端的匿名用户,且该用户的UID和GID均为9999。
2. 用户映射逻辑
客户端用户请求:当客户端用户尝试访问NFS共享时,其请求首先被发送到NFS服务端。
服务端处理:NFS服务端根据配置的用户映射规则,决定将客户端用户映射为哪个服务端用户。
访问控制:映射完成后,服务端根据映射后的用户身份,决定是否允许访问以及访问的权限。
配置示例图解
1. 基础用户映射
客户端root用户 -> 服务端nfsnobody用户(通过root_squash配置)。
客户端oldboy用户 -> 服务端oldboy用户(默认映射)。
2. 高级用户映射
客户端所有用户(包括root和oldboy)-> 服务端匿名用户(UID=9999, GID=9999)(通过all_squash,anonuid=9999,anongid=9999配置)。
配置项 | 说明 |
---|---|
anonuid | 指定匿名用户的 UID(用户标识符) |
anongid | 指定匿名用户的 GID(组标识符) |
root_squash | 将客户端的 root 用户映射为匿名用户,通常是 nobody |
no_all_squash | 禁用所有用户的映射为匿名用户 |
all_squash | 将所有客户端用户映射为匿名用户(anonuid 和 anongid 指定的用户) |
同步异步区别
/var/lib/nfs/etab 解析
shell
[root@nfs01 /nfsdata]# cat /var/lib/nfs/etab
/nfs/zrlog 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)
1. /nfs/zrlog
这是 NFS 服务器上导出的共享目录的路径。在客户端访问该 NFS 目录时,实际上访问的就是 /nfs/zrlog 目录。
2. 172.16.1.0/24
这是允许访问该共享目录的客户端 IP 地址范围。172.16.1.0/24 表示允许 172.16.1.0 到 172.16.1.255 网段的主机访问该目录。
3. (rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys)
这些是 NFS 导出目录的具体选项,解释如下:
rw:读写权限,表示客户端可以对该目录进行读写操作。
sync:同步模式,表示所有的写操作都必须等待服务器确认才会返回客户端,确保数据的一致性和完整性。
wdelay:允许一定的延迟写操作。即客户端可以在一段时间内合并写操作,减少网络负担。
hide:隐藏目录中的特殊文件,通常用来隐藏一些特定的文件,比如 .nfs* 类型的临时文件。
nocrossmnt:表示 NFS 服务器不允许跨越挂载点进行访问,即不能通过该目录访问其他挂载的文件系统。
secure:只允许使用低于 1024 的端口进行访问,从而提高安全性。
root_squash:将客户端的 root 用户映射为匿名用户(通常是 nobody),防止客户端 root 用户具有对共享目录的超级权限。
all_squash:将所有客户端用户映射为匿名用户,默认是 nobody。
no_subtree_check:禁止对子目录的检查,减少 NFS 服务的负担,但可能导致某些情况下的安全问题。
secure_locks:启用文件锁定机制,在文件操作时确保锁定的一致性和安全性。
acl:启用访问控制列表(ACL),允许对共享目录进行更加精细的权限控制。
no_pnfs:禁用 Pnfs(Parallel NFS),这是针对大规模存储系统的一种优化机制,通常用于增强性能。
anonuid=65534 和 anongid=65534:指定匿名用户和匿名组的 UID 和 GID,这通常是 nobody 用户和组的默认值(65534)。
sec=sys:指定使用系统安全模式,即基于用户名和密码的验证机制,而不是基于 Kerberos 等高级安全机制。
案例:nfs统一用户www(1999,1999) 服务端共享/nfs/wordpress/ 客户端载/app/code/wordpress/
服务端
shell
[root@nfs01 ~]# useradd -u 1999 -g 1999 -s /sbin/nologin -M www
[root@nfs01 ~]# id www
用户id=1999(www) 组id=1999(www) 组=1999(www)
[root@nfs01 ~]# cat /etc/exports
/nfsdata/ 172.16.1.0/24(rw)
/nfs/wordpress/ 172.16.1.0/24(rw,all_squash,anonuid=1999,anongid=1999)
[root@nfs01 ~]# mkdir -p /nfs/wordpress
[root@nfs01 ~]# chown -R www.www /nfs/wordpress
[root@nfs01 ~]# ll -d /nfs/wordpress
drwxr-xr-x 4 www www 76 3月 3 19:48 /nfs/wordpress
systemctl reload nfs
客户端
shell
#客户端顺便也添加
[root@web01 ~]# useradd -u 1999 -g 1999 -s /sbin/nologin -M www
[root@nfs01 ~]# id www
用户id=1999(www) 组id=1999(www) 组=1999(www)
#手动挂载
[root@web01 ~]# mount -t nfs nfs01:/nfs/wordpress/ /app/code/wordpress/
[root@web01 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
172.16.1.31:/nfs/wordpress nfs4 97G 4.2G 93G 5% /app/code/wordpress
测试
shell
#测试
[root@web01 /app/code/wordpress]# touch testest.log
[root@nfs01 ~]# ll /nfs/wordpress/
总用量 0
-rw-r--r-- 1 www www 0 3月 23 21:03 testest.log
#永久挂载
vim /etc/fstab