疑问:文件、对象、块 是什么 怎么存储到同一个系统中呢?
Ceph最核心的设计就是"统一":文件、块、对象这三种存储接口,
最终都转化为对底层**RADOS(可靠分布式对象存储)**的操作。
•
统一底层:所有存储类型都基于RADOS对象存储
•
接口抽象:不同接口提供不同的访问方式
•
数据转换:将不同格式的数据转换为对象存储
为什么最直接? 因为底层本身就是对象存储!
•
看到的结构:一个桶(Bucket),里面放着一个个对象
RGW索引结构:
┌─────────────────────────────────┐
│ Bucket索引 │
│ ├── bucket1/ │
│ │ ├── object1.jpg │
│ │ └── object2.pdf │
│ └── bucket2/ │
│ └── document.docx │
└─────────────────────────────────┘
•
使用方式:直接上传文件,通过API访问
1
直接映射:RGW将用户上传的每个文件直接映射为一个或多个RADOS对象
2
元数据存储:对象数据、元数据(如用户自定义的键值对)都存储在这些RADOS对象中
3
扁平命名空间:
•
扁平结构:所有对象都在同一层级
•
无目录概念:通过对象ID直接访问
/------+------------------------------+----------------\
| ID | Binary Data | Metadata |
+------+------------------------------+----------------+
| 1234 | 0101010101010100110101010010 | name1 = value1 |
| | 0101100001010100110101010010 | name2 = value2 |
| | 0101100001010100110101010010 | nameN = valueN |
\------+------------------------------+----------------/
为什么需要切分? 块设备是连续的线性地址空间,需要被切分后存入RADOS。
•
看到的结构:一块虚拟硬盘(如/dev/rbd0),可以分区、格式化文件系统
•
使用方式:像使用物理硬盘一样,可以挂载到虚拟机
1
条带化切割:RBD将这块完整的虚拟硬盘切分成固定大小的块(例如4MB)
2
映射为对象:每一块都被存储在一个独立的RADOS对象里
📊 举例:一个1GB的RBD镜像大约对应256个4MB的RADOS对象
•
高性能:可以并行读写多个对象
•
可扩展:块设备大小不受单对象限制
为什么最复杂? 文件系统有目录树结构和文件元数据(权限、创建时间等)。
•
看到的结构:传统的目录树结构(/home/user/file.txt)
•
使用方式:像使用本地文件系统一样,支持POSIX语义
CephFS采用数据和元数据分离的架构:
1
文件数据:
•
一个文件的内容会被切分成条带
•
分布存储在多个RADOS对象中
•
这些对象存放在专门的数据池(Data Pool)
2
元数据:
•
所有文件的元信息(文件名、目录结构、权限、大小等)由**MDS(元数据服务器)**管理
•
最终也存储在RADOS对象中
•
这些对象存放在专门的元数据池(Metadata Pool)
•
高性能访问:MDS集群缓存元数据
•
强一致性:所有数据都持久化在RADOS中
•
POSIX兼容:完全兼容传统文件系统接口
存储接口 | 用户视角 | Ceph的"翻译"过程 | 最终存储在RADOS中的形式 |
---|---|---|---|
对象 | 桶和对象 | 直接映射 | 一个文件对应一个或多个RADOS对象 |
块 | 一块虚拟硬盘 | 切块后映射 | 一个块设备对应很多个RADOS对象 |
文件 | 目录和文件 | 数据和元数据分离,数据切条带后映射,元数据由MDS管理 | 文件内容对应很多对象,元数据也对应专门的对象 |