分布式存储与NFS:现代架构选型指南
一、存储方式介绍
1.块存储(Block Storage Service)
设备不能被操作系统直接访问,需要创建分区或逻辑卷,再创建 文件系统 (EXT3, EXT4, NTFS 等),然后再经过挂载,才能使用。对于主机而言,其并不能识别出存储设 备是真正的物理设备还是二次划分的逻辑设备(RAID等),块存储不仅仅是直接使用物理设备,间接使用物理 设备的也叫块设备。比如虚拟机上创建的虚拟磁盘。
块存储大多数时候是本地存储,读写速度很快,但不利于扩展,数据不能被共享。
2.文件存储(File Storage Service)
可以分为本地文件存储和网络文件存储。文件存储最明显的特征 是支持POSIX的文件访问接口,例如 open、read、write、seek、close 等 (这几个是常用的文件操作 API接口 ),与块存储不同,主机不需要再对文件存储进行格式化和创建文件系统,文件管理功能已由文件存储 自行管理。
文件存储的特点是便于扩展和共享,但读写速度较慢。
3.对象存储(Object Storage Service)
也叫基于对象的存储,是一种解决和处理离散单元的方法,可 提供基于分布式系统之上的对象形式的数据存储服务。对象存储和我们经常接触到的块和文件系统等存储形态不 同,它提供 RESTful API数据读写接口及丰富的 SDK 接口,并且常以网络服务的形式提供数据的访问。
对象存储不支持随机读写,只能进行全读和全写操作(无法直接在存储上进行数据更改,只能以文件为单 位进行获取和删除),如果要修改数据,需要先在本地编辑完成后整文件上传。
4.分布式存储
在海量数据和文件的场景下,单一服务器所能连接的物理介质有限,能提供的存储空间和IO性能也是有限 的,所以可以通过多台服务器协同工作,每台服务器连接若干物理介质,再配合分布式存储系统和虚拟化技术, 将底层多个物理硬件设备组合成一个统一的存储服务。一个分布式存储系统,可以同时提供块存储,文件存储和 对象存储这三种存储方式。
二、网络文件系统:Network File System (NFS)
1.简介
NFS是由 SUN 公司研制的 UNIX 表示层协议,配合客 户端和服务端软件,可以在本地挂载远程的存储空间,让本地用户和程序直接访问本地目录从而实现数据和存储 空间的共享。 NFS 中的远程访问是基于 RPC ( Remote Procedure Call Protocol,远程过程调用) 来实现 的。 RPC采用C/S模式,客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信 息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算 结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调 用执行继续进行。
2.应用场景
多个机器共享一台CDROM或其他设备:
通过NFS,可以将CDROM或其他设备挂载到NFS服务器上,然后通过网络共享给多个客户端使用。
用户home目录的集中管理:
在大型网络中,可以配置一台中心NFS服务器用来放置所有用户的home目录。这些目录能被输出到网络, 以便用户不管在哪台工作站上登录,总能得到相同的home目录。
影视文件的共享:
不同客户端可以在NFS上观看影视文件,从而节省本地存储空间。
工作数据的备份: 在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下,以确保数据的安全性和可恢复性。
三、生产环境存储方式类型对比
存储方式类型 | 适用场景 | 性能 | 可靠性 | 扩展性 | 成本 | 运维 | 架构师建议 |
---|---|---|---|---|---|---|---|
分布式存储 (核心架构类型) | 大规模数据处理、高可用需求场景 | ⭐⭐~ ⭐⭐⭐⭐ 高吞吐,ms级延迟 (取决于子类型) | ⭐⭐⭐ 多副本/纠删码,高容错 | ⭐⭐⭐ 强横向扩展 | 低~中 | ⭐⭐⭐ | 现代架构核心: • 文件子类型:CephFS/GlusterFS(容器共享、AI训练) • 块子类型:Ceph块存储(虚拟化、数据库) • 对象子类型:S3/OSS(静态资源、备份归档) |
云块存储 (如EBS/CBS) | 数据库、中间件、有状态服务 | ⭐⭐⭐~ ⭐⭐⭐⭐ =高IOPS,ms级延迟 | 多副本/跨AZ,强一致性 | 在线扩容 | 中 | ⭐ | 云原生首选;按IOPS选型;必须开启快照+跨AZ |
对象存储 (如S3/OSS) | 静态资源、备份归档、数据湖 | ⭐⭐<br>高吞吐,百ms级延迟 | ⭐ 11个9持久性 | ⭐⭐⭐ 无限扩展 | 极低 | ⭐ | 归档首选;非结构化数据首选;严格管理生命周期 |
内存存储 (如Redis) | 缓存、会话、实时计数 | ⭐⭐⭐⭐⭐微秒级延迟,极高IOPS | 持久化可选 | 分片集群支持 | 极高 | ⭐⭐⭐ | 仅作缓存;必须集群+持久化+监控;规避大Key/热Key |
NFS (传统网络文件系统) | 传统应用共享、临时文件挂载 | ⭐⭐ 中等吞吐, 延迟高(ms~100ms) | ⭐⭐ 单点故障风险 | ⭐ 有限扩展 | 低~中 | ⭐⭐⭐ | 生产慎用;必须配高可用;优先选分布式文件系统 |
1.关键说明(NFS专项)
维度 | NFS 在文件存储中的定位 |
---|---|
性能 | ⭐⭐ 中等吞吐,延迟高(ms~100ms)→ 依赖后端存储(如SAN) |
可靠性 | ⭐⭐ 单点故障风险高→ 无高可用 = 服务中断 |
典型问题 | - 小文件操作性能暴跌- 缓存不一致(NFSv3默认)- 元数据瓶颈 |
生产用法 | 禁止默认配置 必须改造:1. 配置NFS高可用(如LVS+多节点)2. 仅用于非关键场景(如静态文件挂载)3. 替代方案:优先CephFS(云厂商托管版更优) |
四、选型黄金法则
场景 | 推荐存储 | 为什么 |
---|---|---|
数据库主库 | 块存储(云盘) | 低延迟+强一致性+可扩容 |
容器共享数据 | 文件存储(CephFS) | 分布式扩展+高可用 |
用户头像/图片 | 对象存储 | 无限扩展+极低成本 |
热点缓存 | 内存存储(Redis) | 微秒级响应+降低DB负载 |
传统Web静态文件 | ❌ NFS → ✅ 对象存储 | 避免NFS单点风险 |
1.为什么分布式存储是现代架构的核心?
维度 | 说明 |
---|---|
架构本质 | 不是单一存储类型,而是整体架构,包含文件/块/对象子类型 |
与集中式存储对比 | • 无中心节点,数据分散存储<br>• 高可靠性(多副本)<br>• 强扩展性(水平扩展)<br>• 高性能(并行处理) |
实际生产价值 | • 云原生架构的基础组件<br>• 从传统SAN向云存储演进的关键路径<br>• 满足大数据/AI/物联网等场景需求 |
2.分布式存储 vs. 传统存储(关键差异)
特性 | 分布式存储 | 传统集中式存储 |
---|---|---|
数据分布 | 分散在多个节点 | 集中在中心节点 |
可靠性 | ⭐⭐⭐⭐⭐(多副本) | ⭐⭐(单点故障) |
扩展性 | ⭐⭐⭐⭐⭐(水平扩展) | ⭐⭐(垂直扩展) |
应用场景 | 大数据、云原生、物联网 | 传统数据库、小规模文件服务器 |
五、选型建议(聚焦分布式存储)
分布式存储是云原生架构的基础设施,不是可选项:
- 传统SAN/NAS → 分布式块存储(Ceph)
- 传统NFS → 分布式文件系统(CephFS)
- 传统备份 → 对象存储(S3/OSS)
生产落地三步走:
一句话总结:
NFS是文件存储的“旧时代实现”,生产环境应淘汰默认配置。
云原生场景:文件存储 → 选CephFS/GlusterFS;
传统迁移:NFS需强制高可用改造,否则成为系统瓶颈。
六、NFS业务场景
某电商平台旧版Web服务(PHP+MySQL)需临时挂载静态资源(用户头像/商品图),原存储为本地磁盘,因业务压力需快速迁移至共享存储。
核心要求:
10分钟内完成挂载(避免停机)
保障7×24小时可用(旧系统无高可用)
禁止用于数据库/会话存储(仅限静态文件)
服务端配置(NFS Server)
# 1. 安装NFS服务(CentOS 7)(rocky8/9/10)(ubuntu2404)
yum install -y nfs-utils
yum install -y nfs-utils rpcbind
apt install -y nfs-kernel-server# 2. 共享目录(仅限静态资源,禁止写入数据库)
mkdir -p /data/static_www && chown -R www-data:www-data /data/static_www# 3. 配置共享(/etc/exports)
/data/static_www 10.0.0.10/24(rw,sync,no_root_squash,fsid=0,no_subtree_check)
# 关键参数说明:
# - rw: 读写权限
# - sync: 同步写入(避免数据丢失,但性能略低)
# - no_root_squash: 允许root用户挂载(临时方案,后续迁移需移除)
# - fsid=0: 标记为根目录(避免挂载点嵌套问题)# 4. 启动服务并设为开机自启
systemctl enable rpcbind nfs-server
systemctl start rpcbind nfs-server
exportfs -a # 刷新配置
客户端挂载配置(Web服务器)
# 1. 安装NFS客户端
yum install -y nfs-utils
apt install nfs-common# 2. 挂载命令(/etc/fstab 持久化)
echo "nfs-server.example.com:/data/static_www /var/www/html/static nfs4 defaults,soft,rsize=32768,wsize=32768,timeout=600,retry=10 0 0" >> /etc/fstab# 关键挂载参数说明:
# - soft: 超时后返回错误(避免进程卡死)
# - rsize/wsize: 提升传输效率(32KB)
# - timeout=600: 超时600秒(避免短时间网络波动导致挂载失败)
# - retry=10: 重试10次(保障稳定性)# 3. 手动挂载验证
mount -a && df -h | grep static_www