RADOS 分布式对象存储
Ceph 架构可以很整洁地划分为两个关键层。第一层是 RADOS,一个可靠的自治分布式对象存储,为变长对象提供极其可扩展的存储服务。Ceph 文件系统构建在该底层抽象之上:文件数据在对象上条带化,而 MDS(元数据服务器)集群提供对最终由更多对象支持的 POSIX 文件系统命名空间(目录层次结构)的分布式访问。
到目前为止,RADOS 的唯一用户是 Ceph。但如果亚马逊的 S3(简单存储服务)的成功表明了什么,那就是对可靠且可扩展的基于对象的存储接口存在充足的需求(和需求)。
RADOS 提供的底层存储抽象相对简单
- 存储单元是对象。每个对象都有一个名称(当前是固定大小的 20 字节标识符,但可能会更改)、一些命名的属性(即 xattrs)和一个变长的数据有效负载(如文件)。
- 对象存储在对象池中。每个池都有一个名称(例如“foo”)并形成一个不同的对象命名空间。每个池还具有一些参数,定义了对象的存储方式,即复制级别(2x、3x 等)和映射规则,描述了副本应如何在存储集群中分布(例如,每个副本位于单独的机架中)。
- 存储集群由一些(可能很大)数量的存储服务器或OSD(对象存储守护程序/设备)组成,组合后的集群可以存储任意数量的池。
RADOS 的一个关键设计特性是 OSD 能够在相对自主地从故障中恢复或响应集群扩展而迁移数据。通过最大限度地减少中央集群协调器(实际上是一个管理关键集群状态的小型 Paxos 集群)的作用,整个系统具有极强的可扩展性。一个由少量节点组成的系统可以无缝地扩展到数百或数千个节点(或再次收缩)。
librados 提供的 API 将非常简单。类似于
/* 初始化 */
int rados_initialize(int argc, const char **argv);
void rados_deinitialize();int rados_open_pool(const char *name, rados_pool_t *pool);
void rados_close_pool(rados_pool_t pool);int rados_write(rados_pool_t pool, struct ceph_object *oid, const char *buf, off_t off, size_t len);
int rados_read(rados_pool_t pool, struct ceph_object *oid, char *buf, off_t off, size_t len);
还将暴露异步 I/O 接口,以及缓冲/缓存设施(当前由 Ceph fuse 客户端使用),能够选择性地刷新/使一组对象失效(例如,文件条带化的对象集)。
使用这种接口有什么好处?显然,您可以对对象执行的操作也可以在分布式文件系统(如 Ceph)中对文件执行:只需在 /foo/$poolname/$objectname 创建一个文件。
- 简单性——许多应用程序不需要 POSIX 文件系统提供的所有复杂性。反过来,这意味着对象存储可以针对更简单的接口和工作负载进行优化
- 可扩展性——大多数使分布式文件系统扩展到大量存储节点的问题与 POSIX 施加的规则有关(以 Ceph 的 MDS 为例,它非常复杂)。简单的对象抽象更具可扩展性。
- 稳定性——简单的系统更容易验证。
一个目标是使当前使用 S3 客户端库的应用程序可以轻松地移植到 librados,从而允许用户控制整个存储堆栈。
