Skip to content

存储概述

存储是什么

存储: 用于存放用户上传的内容(数据),一般应用在网站集群中

如果不使用存储,用户上传的数据就直接存放在网站 服务器 上了,用户下次访问就可能找不到

如果使用存储,用户上传的内容存放在存储上面,用户访问就会访问存储. 位置: 网站后排.

存储分类

存储类别描述示例/相关技术
本地存储存储直接连接到计算机或服务器上的存储设备。硬盘(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将所有客户端用户映射为匿名用户(anonuidanongid 指定的用户)
同步异步区别

/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

感谢阅读,欢迎交流!