Ceph RBD 诞生15周年:开源创造的故事
创始人
2025-07-09 14:12:31

作者 | Yehuda Sadeh-Weinraub

译者 | 刘雅梦

策划 | 丁晓昀

今年是 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 提供的宝贵意见。

相关内容

热门资讯

最新一款“福州十八扑辅助软件”... 最新一款“福州十八扑辅助软件”[确实真的有挂]您好:福州十八扑这款游戏可以开挂,确实是有挂的,需要了...
玩家攻略“明星麻将辅助软件”(... 玩家攻略“明星麻将辅助软件”(详细开挂教程)亲,明星麻将这个游戏其实有挂的,确实是有挂的,需要了解加...
实测讲解“好玩茶楼辅助开挂神器... 实测讲解“好玩茶楼辅助开挂神器”(太坑了原来有挂)亲,好玩茶楼这个游戏其实有挂的,确实是有挂的,需要...
实测分享“微乐锄大地怎么开挂”... 有 亲,根据资深记者爆料微乐锄大地是可以开挂的,确实有挂(咨询软件无需打...
德扑ai辅助挂!微扑克wpk辅... 德扑ai辅助挂!微扑克wpk辅助存在吗(德州之星插件)原来真的有挂(安装教程)1、构建自己的微扑克w...