Skip to content

存储选型与接入

存储选型从数据访问方式开始区分:应用需要的是"块"、"文件"还是"对象",三者不能互相替代。然后再看容量、性能、可用性、备份、团队维护能力和接入 K8s 的方式。

三种存储语义

类型形式常见实现典型场景
块存储远端磁盘云盘、Ceph RBD、SAN数据库数据盘、虚拟机磁盘、K8s RWO
文件存储共享目录NFS、CephFS、NAS共享附件、制品、多 Pod 共享读写
对象存储S3 APIMinIO、Ceph RGW、云 OSS/S3备份、图片、日志归档、数据交换

三种语义的边界很关键:对象存储不适合当数据库盘(不是块设备,不支持 fsync 语义);块存储不适合多节点直接同时挂载(需要集群文件系统或应用协议配合);NFS 看起来像目录但不等于高性能分布式文件系统。

常见方案对比

方案存储类型优点风险
本地盘块/文件延迟低、简单节点坏了数据跟着受影响
云盘托管稳定、快照方便可用区限制、成本
NFS文件简单直观、接入快单点、权限映射、小文件性能
Ceph RBD分布式块存储,副本保护运维成本和恢复复杂度
CephFS文件分布式共享文件系统MDS 元数据压力
MinIO对象S3 兼容、适合备份和制品非 POSIX、应用要适配 S3 API
Ceph RGW对象和 Ceph 共用集群底座Ceph 运维门槛
NAS文件厂商支持、硬件托管成本、黑盒、扩展方式受限

GlusterFS(Red Hat Gluster Storage)已于 2024-12-31 EOL。存量环境按现状维护,新建设施不再优先考虑。

按场景选型

场景常见选择为什么
MySQL/PostgreSQL 单实例云盘、Ceph RBD、本地盘需要稳定块设备和低 fsync 延迟
Redis 持久化云盘、本地盘、Ceph RBD看延迟要求和恢复方式
多副本无状态临时数据emptyDir、本地盘数据可丢,重点在性能
多 Pod 共享附件NFS、CephFS、NAS需要 RWX 文件语义
备份文件MinIO、云对象存储、NFS对象存储版本和生命周期更适合长期保留
镜像仓库本地盘、云盘、对象存储后端看 Harbor/Registry 支持的后端
日志归档对象存储、HDFS 类大量追加后归档,不频繁访问
K8s RWO PVC云盘 CSI、Ceph RBD CSI单 Pod/单节点读写
K8s RWX PVCNFS、CephFS、NAS CSI多节点共享目录

核心数据库选存储,低延迟和故障恢复比"能不能共享"更重要。NFS 能挂上不等于适合跑数据库;对象存储能存文件不等于适合应用当目录写。

选型前需要回答的问题

问题为什么重要
数据是否可丢?决定副本数、快照频率、备份策略和恢复投入
是否多节点同时读写?直接决定块还是文件——RWO vs RWX
IO 模式是什么?顺序写 vs 随机写,大文件 vs 小文件,差异巨大
延迟要求多高?数据库 2ms 和归档 200ms 是两种方案
容量增长速度?决定扩容方式和成本——MinIO 按 pool 扩和云盘按 GB 扩不同
谁来维护?Ceph 的维护成本和 NAS 的厂商支持是两种投入
怎么备份?存储高可用不等于备份——多副本挡不住误删
怎么恢复?RTO/RPO 要落到具体命令和演练,不是纸上指标

存储事故里最常见的是"有高可用,没有备份"。三副本能防磁盘坏,防不了误删、误覆盖、勒索加密和应用写坏数据。

K8s 接入链路

后端K8s 接入常见访问模式
云盘云厂商 CSIRWO
Ceph RBDceph-csi rbdRWO
CephFSceph-csi cephfsRWX
NFS静态 PV 或 nfs-subdir provisionerRWX
NAS厂商 CSI 或 NFS 协议RWX
Local PVlocal provisioner / 静态 PVRWO

PVC Bound 只说明对象绑定成功。后端 IO 是否健康,要单独验证——挂载成功、权限正确、读写正常,一层一层确认。

访问模式与后端的真实关系

K8s 访问模式是对后端能力的抽象,不是 PVC 写了 RWX 后端就自动支持:

模式含义常见支持后端
RWO单节点读写云盘、Ceph RBD、Local PV
RWX多节点读写NFS、CephFS、NAS
ROX多节点只读NFS、CephFS
RWOP单 Pod 独占读写较新的 CSI 特性

很多云盘只支持 RWO。应用层也要匹配:多个 Pod 同时写同一个共享目录,应用自己没做并发写控制,存储支持 RWX 也不代表数据不乱。

备份和保护的层次

几个概念要区分开,它们解决不同层面的问题:

概念解决什么问题解决不了什么问题
副本(多副本/RAID)磁盘或节点故障误删、误改、应用写坏
快照某个时间点的状态保存存储集群整体的灾难
备份(独立副本)误删、集群故障、灾难恢复需要恢复演练来验证
复制(跨集群/跨区域)站点级故障源端逻辑损坏可能同步到副本
归档长期保留、合规恢复速度慢

不同后端常见保护方式:

后端常见保护
云盘定期快照、跨区复制、备份服务
Ceph RBD镜像快照、rbd mirror、外部备份
CephFS目录快照、rsync、对象存储备份
NFS底层快照 + rsync 保留多版本 + 对象存储
MinIOversioning、replication、lifecycle、object lock

误删数据时,最重要的是有没有独立备份和恢复演练。"底层三副本"救不了 DELETE FROMrm -rf

性能瓶颈定位

不同存储类型的瓶颈点不同,排查要找准对应的工具:

类型常见瓶颈定位工具
本地盘单盘 IO、inode、文件系统iostatdf -i
云盘IOPS/吞吐规格、突发额度云厂商监控、iostat
NFS服务端磁盘、网络、同步写、小文件nfsiostatiostat
Ceph RBDOSD 延迟、网络、PG recoveryceph osd perfceph -s
CephFSMDS 元数据、目录规模、OSD 延迟ceph fs statusceph mds stat
MinIO磁盘、网络、对象大小、入口超时mc admin info

fio 压测时要贴近真实 IO 模式。大文件顺序写的结果不能代表小文件随机写的表现——数据库和对象归档的 IO 模式完全不同。

故障排查分层

应用报 Input/output error 时,原因可能出在客户端挂载、CSI、网络、后端服务或磁盘的任意一层:

现象第一排查入口
PVC PendingStorageClass、CSI Pod、PV 事件
Pod 挂载失败kubelet 日志、CSI 日志、后端权限
NFS 卡住服务端状态、客户端 dmesg、网络连通
Ceph 写慢ceph -sceph osd perf、PG 状态
MinIO 403用户 policy、bucket 权限
容量不释放快照、版本控制、进程持有已删除文件
节点坏数据丢Local PV 和备份策略

选型记录模板

给一个具体服务选存储时,把这几项写清楚:

项目内容
业务名称哪个系统或服务用
数据类型数据库 / 附件 / 备份 / 日志 / 制品
访问方式块 / 文件 / 对象
读写模式随机/顺序、小文件/大文件、并发量
容量当前大小、增长速度、保留周期
可用性单机可接受还是要求跨节点
备份频率、保存位置、恢复演练记录
恢复要求RTO/RPO——落到具体数值
运维谁维护、常用命令、监控看板
风险当前方案的单点、容量天花板、权限面

落到具体场景的参数会自然推导出不同方案。"附件目录 500G、每天增长 5G、多 Web Pod 读写、分钟级恢复"和"PostgreSQL 数据盘 2T、P99 延迟低于 2ms、RPO 5 分钟"——这两个场景的存储选择会完全不同。选型不是选最好的技术方案,是选最匹配这些约束的方案。