本文目录导读:

- 核心思想:底层统一,接口多样
- 对象存储 (Object Storage) -
RADOS Gateway (RGW) - 块存储 (Block Storage) -
RADOS Block Device (RBD) - 文件系统存储 (File System Storage) -
CephFS - 总结与对比
- 如何选择?
这是一个关于Ceph分布式存储的非常核心的问题,Ceph之所以强大,很大程度上是因为它能够在同一套系统上提供三种数据访问接口:对象存储、块存储和文件系统存储。
下面我为你详细解释这三个概念在Ceph中是如何实现的、它们的区别以及适用场景。
核心思想:底层统一,接口多样
Ceph的底层核心是一个名为 RADOS(Reliable Autonomic Distributed Object Store,可靠自主分布式对象存储)的存储系统,所有数据,无论是作为对象、块设备还是文件存储,最终在RADOS层都会被切分成若干个大小固定的 Object(对象)(默认大小为4MB),然后分布在多个OSD(Object Storage Daemon,对象存储守护进程)上,并通过 CRUSH算法 实现数据的分布和冗余(如副本或纠删码)。
基于RADOS,Ceph提供了三个上层接口(网关或驱动):
对象存储 (Object Storage) - RADOS Gateway (RGW)
这是最接近底层RADOS概念的一种存储方式。
- 接口: 遵循 RESTful API 标准,即 Amazon S3 和 OpenStack Swift 兼容的API。
- 工作原理:
- 用户通过HTTP/HTTPS请求访问RGW。
- RGW是一个守护进程,充当客户端和RADOS集群之间的代理。
- RGW将用户上传的文件(如一个图片、视频)作为一个对象,存储在RADOS集群中。
- 每个对象有一个唯一的 Key(键),可以组织在 Bucket(容器)中。
- 特点:
- 无限扩展: 通过增加RGW节点和OSD节点实现性能和容量的水平扩展。
- 高并发: 适合大量小文件和大文件的非结构化数据。
- 无文件系统限制: 不依赖传统文件系统(如ext4)的元数据限制。
- 元数据丰富: 支持自定义元数据(如图片的Exif信息)。
- 访问控制: 有完善的权限模型(Bucket Policy, User/Group)。
- 典型场景:
- 云存储(如网盘、备份、归档)。
- 静态网站托管。
- 媒体存储(图片、视频、音频流)。
- 大数据分析(如Hadoop/Spark的数据源)。
- S3兼容应用: 几乎所有现代应用(如Kuberenetes的Velero, OpenStack的Glance, 移动/Web App后端)都默认支持。
块存储 (Block Storage) - RADOS Block Device (RBD)
这是最接近于传统硬盘的存储方式。
- 接口: 标准 块设备接口(如
/dev/rbd0),可以被客户端(通常是云主机)像普通硬盘一样格式化、挂载和使用。 - 工作原理:
- 客户端(如QEMU/KVM虚拟机、OpenStack Nova节点)加载一个名为
rbd的内核模块。 - 客户端直接跟RADOS集群中的Monitor (MON) 和 OSD 通信,无需经过任何网关。
- RBD将客户端对块设备的读写请求,映射为对RADOS对象的读写。
- 每个RBD设备被分割成若干个 Object,分布在集群中。
- 客户端(如QEMU/KVM虚拟机、OpenStack Nova节点)加载一个名为
- 特点:
- 高性能: 绕过文件系统的元数据开销,直接操作裸设备。
- 低延迟: 客户端直接与OSD通信,网络路径最短(无网关瓶颈)。
- 功能丰富: 支持快照、克隆(写时复制)、精简配置、在线扩容、一致性组等。
- 弹性扩展: 可以动态调整块设备的大小。
- 典型场景:
- 虚拟化: 为OpenStack、Kuberenetes(通过CSI驱动)、VMware等提供虚拟机硬盘(云硬盘)。
- 数据库: 为MySQL、PostgreSQL、MongoDB等提供高性能、低延迟的存储后端。
- 容器化应用: 为容器提供持久化存储(如Kuberenetes的PersistentVolume)。
- 裸金属服务器: 通过iSCSI或内核驱动挂载Ceph RBD块设备。
文件系统存储 (File System Storage) - CephFS
这是在块设备之上构建了一个符合POSIX标准的分布式文件系统。
- 接口: POSIX兼容的文件系统接口,可以通过 NFS、SMB/CIFS(通过Samba)或Linux内核的
ceph文件系统驱动挂载。 - 工作原理:
- 需要部署
Ceph Metadata Server (MDS)守护进程。 - MDS负责管理文件系统的元数据(目录结构、文件名、权限、文件到对象的映射)。
- 客户端通过内核驱动或FUSE挂载,读取MDS获取元数据,然后直接向OSD读写数据(通过RADOS)。
- CephFS的数据存储也使用RADOS的对象,但元数据由MDS专门管理。
- 需要部署
- 特点:
- POSIX语义: 对用户友好,上层应用无需修改即可使用(如
cp,mv,cat,ls命令)。 - 共享访问: 多个客户端可以同时挂载同一个CephFS,并发读写同一个文件(需要软件处理锁冲突)。
- 强一致性: 保证写入后立即可读(与S3的最终一致性不同)。
- 动态子树分区: MDS可以将不同的目录子树分配给不同的MDS进程,实现元数据性能的线性扩展。
- POSIX语义: 对用户友好,上层应用无需修改即可使用(如
- 典型场景:
- HPC / 高性能计算: 需要POSIX接口进行共享工作负载。
- 共享存储: 多个Web服务器、应用服务器共享同一份网页代码、配置文件。
- 数据湖 / 大数据分析: 替换HDFS(Hadoop分布式文件系统),作为Spark、Hive等框架的底层存储。
- 容器编排: Kubernetes的
StatefulSet或Deployment可以用来挂载CephFS作为共享存储。 - 传统NAS替代: 提供高性能、可横向扩展的企业级共享文件存储。
总结与对比
| 特性 | 对象存储 (RGW) | 块存储 (RBD) | 文件系统存储 (CephFS) |
|---|---|---|---|
| 核心接口 | RESTful (S3/Swift) | 块设备 (/dev/rbdX) |
POSIX (NFS, CIFS, 内核) |
| 访问方式 | HTTP/HTTPS | 内核模块 + RADOS | 内核/FUSE + MDS + RADOS |
| 使用对象 | 应用程序(云原生) | 虚拟机 / 数据库 | 用户 / 系统管理员 / 应用 |
| 性能 | 中等(受网关、网络限制) | 最高,低延迟 | 高 (MDS可能成为瓶颈) |
| 扩展性 | 容量/性能线性扩展 | 容量线性扩展 | 容量线性,元数据需MDS扩展 |
| 一致性 | 最终一致性 | 强一致性 | 强一致性 |
| 元数据 | 用户自定义 Key-Value | 无(由上层文件系统管理) | 由 MDS 管理 (目录、文件名等) |
| 典型用例 | 云存储、备份、大数据 | 云硬盘、数据库、容器 | 共享存储、HPC、NAS替代 |
| 复杂度 | 低 (部署RGW) | 中 (需要客户端驱动) | 高 (需要部署MDS) |
| 成本 | 中等 (RGW是额外进程) | 低 (无额外服务) | 较高 (MDS需要独立服务器) |
如何选择?
- 如果你需要标准POSIX文件系统 → CephFS(共享存储、NAS替代、传统应用)。
- 如果你需要高性能、低延迟的块设备 → RBD(数据库、虚拟机云硬盘)。
- 如果你需要海量非结构化数据、RESTful API、云原生 → RGW (S3对象存储)。
Ceph的最大魅力在于:你可以用一套硬件集群,同时创建RBD块设备给数据库,创建CephFS给共享Web目录,创建S3桶给前端应用上传图片,三者共享底层的RADOS集群,资源可以灵活分配,管理统一。