Appearance
存储选型与接入
存储选型从数据访问方式开始区分:应用需要的是"块"、"文件"还是"对象",三者不能互相替代。然后再看容量、性能、可用性、备份、团队维护能力和接入 K8s 的方式。
三种存储语义
| 类型 | 形式 | 常见实现 | 典型场景 |
|---|---|---|---|
| 块存储 | 远端磁盘 | 云盘、Ceph RBD、SAN | 数据库数据盘、虚拟机磁盘、K8s RWO |
| 文件存储 | 共享目录 | NFS、CephFS、NAS | 共享附件、制品、多 Pod 共享读写 |
| 对象存储 | S3 API | MinIO、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 PVC | NFS、CephFS、NAS CSI | 多节点共享目录 |
核心数据库选存储,低延迟和故障恢复比"能不能共享"更重要。NFS 能挂上不等于适合跑数据库;对象存储能存文件不等于适合应用当目录写。
选型前需要回答的问题
| 问题 | 为什么重要 |
|---|---|
| 数据是否可丢? | 决定副本数、快照频率、备份策略和恢复投入 |
| 是否多节点同时读写? | 直接决定块还是文件——RWO vs RWX |
| IO 模式是什么? | 顺序写 vs 随机写,大文件 vs 小文件,差异巨大 |
| 延迟要求多高? | 数据库 2ms 和归档 200ms 是两种方案 |
| 容量增长速度? | 决定扩容方式和成本——MinIO 按 pool 扩和云盘按 GB 扩不同 |
| 谁来维护? | Ceph 的维护成本和 NAS 的厂商支持是两种投入 |
| 怎么备份? | 存储高可用不等于备份——多副本挡不住误删 |
| 怎么恢复? | RTO/RPO 要落到具体命令和演练,不是纸上指标 |
存储事故里最常见的是"有高可用,没有备份"。三副本能防磁盘坏,防不了误删、误覆盖、勒索加密和应用写坏数据。
K8s 接入链路
| 后端 | K8s 接入 | 常见访问模式 |
|---|---|---|
| 云盘 | 云厂商 CSI | RWO |
| Ceph RBD | ceph-csi rbd | RWO |
| CephFS | ceph-csi cephfs | RWX |
| NFS | 静态 PV 或 nfs-subdir provisioner | RWX |
| NAS | 厂商 CSI 或 NFS 协议 | RWX |
| Local PV | local provisioner / 静态 PV | RWO |
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 保留多版本 + 对象存储 |
| MinIO | versioning、replication、lifecycle、object lock |
误删数据时,最重要的是有没有独立备份和恢复演练。"底层三副本"救不了 DELETE FROM 或 rm -rf。
性能瓶颈定位
不同存储类型的瓶颈点不同,排查要找准对应的工具:
| 类型 | 常见瓶颈 | 定位工具 |
|---|---|---|
| 本地盘 | 单盘 IO、inode、文件系统 | iostat、df -i |
| 云盘 | IOPS/吞吐规格、突发额度 | 云厂商监控、iostat |
| NFS | 服务端磁盘、网络、同步写、小文件 | nfsiostat、iostat |
| Ceph RBD | OSD 延迟、网络、PG recovery | ceph osd perf、ceph -s |
| CephFS | MDS 元数据、目录规模、OSD 延迟 | ceph fs status、ceph mds stat |
| MinIO | 磁盘、网络、对象大小、入口超时 | mc admin info |
用 fio 压测时要贴近真实 IO 模式。大文件顺序写的结果不能代表小文件随机写的表现——数据库和对象归档的 IO 模式完全不同。
故障排查分层
应用报 Input/output error 时,原因可能出在客户端挂载、CSI、网络、后端服务或磁盘的任意一层:
| 现象 | 第一排查入口 |
|---|---|
| PVC Pending | StorageClass、CSI Pod、PV 事件 |
| Pod 挂载失败 | kubelet 日志、CSI 日志、后端权限 |
| NFS 卡住 | 服务端状态、客户端 dmesg、网络连通 |
| Ceph 写慢 | ceph -s、ceph osd perf、PG 状态 |
| MinIO 403 | 用户 policy、bucket 权限 |
| 容量不释放 | 快照、版本控制、进程持有已删除文件 |
| 节点坏数据丢 | Local PV 和备份策略 |
选型记录模板
给一个具体服务选存储时,把这几项写清楚:
| 项目 | 内容 |
|---|---|
| 业务名称 | 哪个系统或服务用 |
| 数据类型 | 数据库 / 附件 / 备份 / 日志 / 制品 |
| 访问方式 | 块 / 文件 / 对象 |
| 读写模式 | 随机/顺序、小文件/大文件、并发量 |
| 容量 | 当前大小、增长速度、保留周期 |
| 可用性 | 单机可接受还是要求跨节点 |
| 备份 | 频率、保存位置、恢复演练记录 |
| 恢复要求 | RTO/RPO——落到具体数值 |
| 运维 | 谁维护、常用命令、监控看板 |
| 风险 | 当前方案的单点、容量天花板、权限面 |
落到具体场景的参数会自然推导出不同方案。"附件目录 500G、每天增长 5G、多 Web Pod 读写、分钟级恢复"和"PostgreSQL 数据盘 2T、P99 延迟低于 2ms、RPO 5 分钟"——这两个场景的存储选择会完全不同。选型不是选最好的技术方案,是选最匹配这些约束的方案。