写点什么

Ceph RBD 诞生 15 周年:开源创造的故事

作者:Yehuda Sadeh-Weinraub

  • 2025-07-09
    北京
  • 本文字数:3619 字

    阅读完需:约 12 分钟

大小:1.55M时长:09:01
Ceph RBD 诞生15周年:开源创造的故事

今年是 RADOS 块设备(RBD),Ceph块存储接口诞生后的第十五年。Ceph 是一个分布式存储系统。它由Sage Weil在加州大学圣克鲁斯分校的博士论文中启动,最初的设计只是作为一个从头开始构建的分布式文件系统。随着 Ceph 发展成为一个统一的企业级存储平台,除了文件系统接口外,Ceph 现在还支持对象和块存储。RESTful 对象存储接口(RADOS Gateway,或 RGW),旨在与 AWS S3 兼容,以及 RBD,一个块存储系统,是后来增加的,扩展了 Ceph 的能力。这个周年纪念是一个很好的回顾 RBD 如何诞生的机会。

 

我于 2008 年加入 Ceph 项目。我的第一次提交是在一月份;那年晚些时候我开始全职工作。一开始就很激动人心。Sage 和我在洛杉矶市中心一栋高层建筑的五十层共用一间办公室。每天午餐时,我们都有一个非常私人的 Ceph 会议。如今,Cephalocon,一年一度的 Ceph 会议吸引了来自世界各地的数百名参与者。那时,Ceph 刚刚从学术界毕业,在 DreamHost (Sage 多年前与人共同创立的一家公司)开始了第二阶段的孵化。全职从事 Ceph 工作的总人数就 2 个。

 

在我工作的第一天,Sage 告诉我,存储库里有一个 TODO 文件,我应该做我想做的。我把这句话的两个部分视为两个不同且独立的信息。在看了 TODO 文件后,我倾向于“我应该做我想做的”,并看到以下内容:


- ENOSPC - 完成客户端故障恢复(长时间退出后重新连接;以及慢速延迟重新连接)- 使kclient使用->sendpage?- 移除io中断?
缺陷 - 日志断言(header.wrap)在print_header()中
大项目 - ENOSPC- 可执行的配额?- mds安全执行 - 客户端,用户认证 - cas ......
复制代码


在早期,我们能做的事情堆积如山,所以我们真的尝试探索了很多方向。Sage 最近为 Ceph 添加的快照功能占用了这个 TODO 文件的很大一部分。我选择的第一个项目,ceph.conf 配置系统,它不那么引人注目,但却是必不可少的。在此之前,为了运行任何 Ceph 命令,你需要在命令行中传入所有配置。对于一个学术项目来说,这可能是可以接受的,但任何有用的应用程序都需要一个可行的配置系统。

 

一个 RESTful 对象存储系统

我们继续致力于让 Ceph 文件系统为黄金时间做好准备,在此过程中,我们还考虑了存储系统可以做的其他伟大的事情。在 2009 年初,我开始研究一个新的和令人兴奋的 RESTful 对象存储系统(最初命名为 C3,很快切换到临时名称 RADOS Gateway 或 RGW)。Ceph 已经有了一个名为RADOS的内部对象存储系统,那么为什么不直接通过 S3 API 暴露它呢?结果发现有很多原因可以解释为什么将 RADOS 直接 1:1 映射到 S3 不是一个好主意。

 

RADOS 语义与 S3 兼容系统所需的语义有很大不同。例如,RADOS 的对象大小限制相对较小,而 S3 可以支持高达 5TB 的对象。S3 将对象保存在索引桶中。然而,RADOS 将对象保存在未索引的池中,因此列出没有索引的对象是一种非常低效的操作。我们在弄清楚正确的 RGW 架构的过程中遇到了很多这样的问题。

 

我探索了一个并行的工作,我们称之为“活动对象”,这是 Ceph 对象类的前身。我们的想法是让计算更接近数据,这样我们就可以扩展存储做更多的事情。在第一次迭代中,你可以推送一个 Python 代码片段,然后在 Ceph 对象存储守护进程(OSDs)中执行。

 

关注谷歌新闻

那时,当你在谷歌上搜索 Ceph 时,大多数搜索结果要么是关于公共卫生教育委员会的,要么是关于电子艺术 Crysis 游戏系列中的 Ceph 外星物种的。我为“Ceph”关键词设置了一个谷歌新闻提醒,看看是否有人发表了关于我们项目的任何内容。在 2009 年 11 月初,我收到了一个通知,链接到一篇关于Sheepdog的文章,这是一个新的 QEMU 分布式块存储系统。这触发了谷歌新闻提醒,因为有人在评论中建议 Ceph 可能是一个更可行的解决方案。我指着 Sage 说:


我:http://www.linux-kvm.com/content/sheepdog-distributed-storage-management-qemukvm注意评论中的ceph引用 Sage:很好!是的,这让我想到,制作一个块设备驱动程序非常容易,只是覆盖对象 我:是啊..我们可能需要花点时间来做这件事,也许有一些rados内核客户端,并且在此基础上设置一个块设备Sage:这意味着清理monc,osdc接口..但无论如何这可能是件好事.........
复制代码


早期的 RBD 实现

可以理解的是,我们并没有为了实现这一点而搁置所有其他工作。我们正忙于实现 CephX,Ceph 的身份验证和授权子系统(在我们决定如何命名之前,X 是一个占位符,这是一项我们从未有时间完成的任务)。Ceph 文件系统内核模块尚未合并到 Linux 内核中,这是我们一段时间以来一直在积极努力实现的一个里程碑。为了保持 Ceph 的真正开放过程,Sage 在接下来的一周发布了一封邮件列表消息,介绍了这个想法。他建议了两个项目(Weil, Sage, Email to Ceph-devel 邮件列表。2009 年 11 月 11 日):


- 组装一个类似的qemu存储驱动程序,使用librados存储图像片段。这应该非常简单(存储驱动程序完全在用户空间实现)。我怀疑最难的部分将是决定如何命名和管理可用图像列表。
- 编写一个Linux块设备驱动程序,做同样的事情。这在功能上类似于在ceph之上创建一个回环设备,但可以避免文件系统层和与MDS的任何交互。这样做的好处是完全支持TRIM和壁垒。
复制代码


几个月后,Christian Brunner 对我们的行动呼吁做出了回应,他向我们发送了一个QEMU驱动程序的初始实现。我们能够使用他创建的基础,并开始准备将其包含到上游 QEMU 中。Ceph 文件系统模块在几周内被合并到 Linux 内核中,这对项目来说是一个巨大的成功。我还决定开发第二个内核驱动程序,这次是一个与这个 QEMU 驱动程序兼容的块设备驱动程序。

 

这两个 RBD 驱动程序是两个独立的实现;它们之间共享的代码非常少,因为其中一个是编写为在用户空间运行并与 QEMU 块接口集成,而另一个是创建为作为 Linux 内核模块运行并实现内核块驱动程序的接口。两个驱动程序都非常精简,并将 I/O 操作转换为 RADOS 对象操作。一个单一的块图像被分割成多个小尺寸的 RADOS 对象,这允许操作在多个 OSD 上并行运行,这得益于 Ceph 的横向扩展功能。

 

更多功能

我们为两个 RBD 驱动程序添加了更多功能:用于 RBD 卷的管理工具和对快照的支持。为了使快照正确工作,运行实例需要在创建时了解它们。为此,我实现了一个新的 Ceph 子系统,称为 Watch/Notify,它允许通过 RADOS 对象发送事件。RBD 实例“监视”其图像元数据对象,管理工具在创建新快照时向其发送通知。

 

我们创建的首次使用的另一个子系统是 Ceph 对象类。这种机制允许在 RADOS I/O 路径中创建专门的代码,可以被调用以对 RADOS 对象进行变异或进行复杂的读取操作。第一个对象类被实现以跟踪 RBD 快照的名称及其映射到 RADOS 快照 ID。与需要更复杂的锁或其他机制来处理竞争的动态读-修改-写周期不同,我们只会发送一个单一的 RBD 快照创建调用,它将在 OSD 上原子地完成。

 

上游验收

创建 RBD Linux 内核设备驱动程序需要清理所有 Ceph 内核代码,并将通用的 RADOS 代码移动到一个单独的内核库中。我们在创纪录的时间内将其纳入 Linux 内核。它于 2010 年 10 月在上游被合并,距离文件系统被合并后仅六个多月。

 

Christian 继续帮助 QEMU 驱动程序的开发,现在他回忆起让 QEMU 驱动程序上游的最困难的部分是:

 

“当时,为了说服 QEMU 项目相信分布式存储系统的驱动程序是必要的,我们进行了相当大的讨论。”

 

此外,在 QEMU 项目内部还有一场单独的讨论,讨论是否应该合并驱动程序,或者他们是否应该创建一个插件块存储机制,允许外部添加不同的驱动程序,而不需要它们的参与。大约在同一时间,sheepdog 项目也在审查中,并参与了同样的讨论。QEMU 项目开发人员不想处理新驱动程序不可避免会带来的问题和错误。我们和 sheepdog 开发人员都表示我们将处理我们的驱动程序出现的问题。最后,单体路径占了上风,并决定将驱动程序作为 QEMU 存储库的一部分。

 

我们经历了审查过程,并确保我们对审查人员提出的所有问题做出了回应和解决。例如,驱动程序使用的原始线程模型是错误的,需要解决。最后,在将内核 RBD 驱动程序合并到 Linux 内核几周后,我们还合并了上游的 QEMU 驱动程序。

 

从第一个想法到两个驱动程序被合并,只花了大约一年的时间。整个项目催生了多个子项目,这些项目现在已成为 Ceph 生态系统的基础。RBD 建立在 RADOS 提供的坚实基础之上,因此,它得益于所有 Ceph 项目贡献者的辛勤工作。

 

RBD 的好处

RBD 几乎一夜成名。现在,它成为了虚拟化和云系统中的关键存储基础设施。由于其无缝集成和可扩展性,它成为了 OpenStack 事实上的标准持久存储。在 Kubernetes 中,它提供了有状态容器化应用程序所需的可靠持久存储层。在传统的虚拟化和私有云环境中,它提供了一个开放的、分布式的、高可用的虚拟机存储,作为专有存储的替代品。由于许多 Ceph 项目贡献者和其他与之交叉的项目的努力,它仍在不断改进和演变。

 

展望未来

这是一个展示开源力量的合作努力。希望取代旧 TODO 文件的内容不会那么模糊,但不会更短。我们仍然有很多工作要做,还有更多我们甚至无法想象的创新领域。有时,一个想法的火花和一个有愿意的社区就是所需要的一切。

 

感谢 Christian Brunner 和 Sage Weil 提供的宝贵意见。

 

原文链接:

https://www.infoq.com/articles/ceph-rbd-open-source/

2025-07-09 17:0010597

评论

发布
暂无评论

SpringBoot整合SpringSecurity超详细入门教程

Java 程序员 后端

Apache Flink CDC 批流融合技术原理分析

Apache Flink

大数据 flink

SpringCloud—— eureka+feign实现声明式服务治理

Java 程序员 后端

Java的jvm与gc概述

小鲍侃java

11月日更

SpringBoot系列:Spring Boot配置文件与常用注解

Java 程序员 后端

SpringBoot系列:Spring Boot集成定时任务Quartz

Java 程序员 后端

SpringCloud Gateway入门实战(中篇)

Java 程序员 后端

SpringCloud-Alibaba之Nacos

Java 程序员 后端

springboot整合mybatis

Java 程序员 后端

SpringBoot配置全局的异常捕获 - ajax形式

Java 程序员 后端

SpringBoot:RabbitMQ-延迟队列

Java 程序员 后端

SpringBoot自动装配原理分析,手写starter组件

Java 程序员 后端

SpringCloud Alibaba 入坑(四)Sentinel基本流控规则

Java 程序员 后端

区块链技术是关键?元宇宙热潮背后的三股驱动力

时空云

区块链 科技信息 元宇宙

手把手教你如何配置DBeaver对接FusionInsigth MRS Spark2x

华为云开发者联盟

数据库 开源 Dbeaver FusionInsigth MRS Spark2x

SpringBoot整合Elasticsearch

Java 程序员 后端

微软资深算法工程师为AI初学者量身打造的机器学习入门书上市啦!

图灵教育

机器学习 入门

SpringBoot核心【基本配置】

Java 程序员 后端

SpringBoot集成Shiro,并使用多个Realm

Java 程序员 后端

SpringBoot整合Redis实现声明式缓存

Java 程序员 后端

springboot整合缓存Redis

Java 程序员 后端

SpringBoot注解最全详解(整合超详细版本)

Java 程序员 后端

2022,了不起的程序员日历来啦!

图灵教育

程序员 日历

Flink Forward Asia Hackathon 正式启动,10W 奖金等你来!

Apache Flink

大数据 flink

SpringCloud-Stream实战快速入门

Java 程序员 后端

焱融科技 YRCloudFile 与安腾普完成兼容认证,共创存储新蓝图

焱融科技

云计算 分布式 高性能 文件存储 科技

springboot整合rabbitMq

Java 程序员 后端

云图说|威胁检测服务赐您“火眼金睛” ,让潜在威胁无处遁行!

华为云开发者联盟

华为云 云图说 威胁检测服务 MTD

鸿蒙轻内核虚拟内存基础知识:虚拟内存进程空间编号

华为云开发者联盟

鸿蒙 虚拟内存 鸿蒙轻内核 虚拟内存进程空间编号

TDengine在住建行业工地管理系统落地的“操作手册”

TDengine

数据库 tdengine 后端

springcloud(一)注册中心eureka

Java 程序员 后端

Ceph RBD 诞生15周年:开源创造的故事_架构_InfoQ精选文章