不仅仅是一个对象存储
今天,Dmitry Ukov 在 Mirantis 博客上写了一篇很棒的文章,题为 OpenStack 云的对象存储方法:理解 Swift 和 Ceph。Dmitry 对 Ceph 的概述是对那些需要为他们的 OpenStack 部署提供对象存储的人来说一个很好的介绍,而且读起来很有意思。谢谢你,Dmitry!
自然地,由于我大部分时间都在思考 Ceph,我忍不住想深入探讨 Dmitry 的一些想法。我们开始吧
Ceph 不仅仅是一个对象存储 ¶
Ceph 是一个很棒的对象存储。如果你把它简化到最基本的形式,它就是这样的。然而,将整个 Ceph 平台与 Swift 进行比较,就像是比较苹果和橘子,因为 Ceph 可以比仅仅是一个对象存储更多。第一个写出最能配合最后一部分的口号的人将获得奖励。
Ceph 对象存储(也称为 RADOS)是两类服务的集合:对象存储守护进程(ceph-osd)和监控器(ceph-mon)。监控器的主要功能是跟踪哪些节点在任何给定时间是可运行的,而 OSD 执行实际的数据存储/检索操作。一个集群可以有几个到数千个 OSD,但只需要少量的监控器——通常是 3、5 或 7——就足以满足大多数集群的需求。有一个客户端库,librados,允许应用程序存储和检索对象。
RADOS 网关 (radosgw) 是一个运行在 RADOS 之上的独立守护进程,它提供基于 REST 的对象存储 API。这使得 Ceph 能够与为 S3 或 Swift 编写的应用程序一起工作。它不如 librados(它消耗的资源)高效或强大,但它更简单。
RADOS 块设备 允许用户在 Ceph 对象存储内部创建虚拟磁盘,并使用 Linux 内核模块挂载它们或从它们启动虚拟机。它根本不需要额外的服务器端组件(尽管它仍然非常整洁且完全有用)。
Ceph 元数据服务器(ceph-mds)对于 Ceph 表现为共享文件系统是必需的,它负责维护目录层次结构、文件元数据以及管理并发访问所需的所有锁定和权限。它也设计为可扩展的(尽管它仍然需要大量的测试),我们相信它可以避免困扰许多分布式文件系统的集中式元数据挑战。
由于 Ceph 的大多数服务都是构建的,或多或少,作为运行在 Ceph 对象存储之上的应用程序,我们倾向于将 Ceph 视为一个统一的平台,而不仅仅是一个分布式文件系统或对象存储。谁知道呢——有一天,有人可能会在其之上构建一个关系数据库、邮件系统或流行的新的图片共享网站。
仅运行您需要的组件 ¶
由于 Ceph 的构建方式,您并不总是需要部署每个组件。例如,除非您计划使用 Ceph 的共享文件系统,否则您不需要运行元数据服务器。同样,对于 radosgw:只有在您希望您的集群使用 REST 接口时才需要它。
如果您的应用程序只需要通过 librados 使用 Ceph 对象存储,您只需要 OSD 和监控器。如果您需要基于 REST 的对象存储,则需要 RADOS 网关。如果您需要共享文件系统,请运行元数据服务器。但仅在需要时运行它们。
这种函数分离(以及关闭平台整个部分的能力)是专为在不依赖大量相互依赖的情况下进行扩展而设计的架构的优势之一。
CRUSH 足够酷,可以写很多关于它的文字 ¶
Dmitry 没有过多地谈论 CRUSH,这有点遗憾,因为——最重要的是——CRUSH 是让 Ceph 与众不同的地方。CRUSH 是一个首字母缩写词,意思是“可控的可扩展哈希下的复制”。
如果您必须建造一座拥有百万间客房的酒店,您认为需要多少个前台?您可以通过扩展小型酒店的所有组件来建造一座大型酒店吗?不,您必须 以全新的方式思考酒店。CRUSH 对数据放置所做的事情就是这样。它是一种完全不同的方法。
集群中的数据放置通常以三种方式完成
- 客户端跟踪它将东西放在哪里
- 集群中的某个服务跟踪所有东西的位置
- 客户端计算东西应该放在哪里
Dmitry 将 CRUSH 描述为“一种算法,可以根据对象名称作为输入查找 Ceph 中的数据物理位置”,这个想法是对的,但并不完全准确。关于 CRUSH 的第一件重要的事情是,它什么都不查找,它计算出来。当客户端想要访问集群中存储的对象时,它使用 CRUSH 算法来计算其所在的位置。该位置没有存储在任何地方,从而避免了难以扩展的集中式数据放置记录。
关于 CRUSH 的第二件重要的事情(使其成为完全不同的方法的部分)是,您不仅传递对象名称作为输入。您传递三件事
CRUSH 是可重复的,这意味着使用相同的输入两次调用它将产生相同的结果。这就是为什么 CRUSH 必须拥有最新的集群地图的原因:当集群发生变化时,CRUSH 的结果也必须发生变化。在任何变化发生时,OSD 会协同工作以相应地重新定位数据(尽管它移动尽可能少的数据:例如,如果您在一堆驱动器中丢失一个驱动器,则 1% 的数据必须移动)。
CRUSH 可以通过 crush 地图进行配置,允许您指定所需的副本数量、定义故障域和调整权重。例如,crush 地图允许您指定希望每个对象有四个副本,其中两个在同一个机架中,另外两个在自己的行中。
您可以在这里阅读关于 CRUSH 的所有学术荣耀:CRUSH:受控、可扩展、去中心化的复制数据放置
再次感谢 Dmitry 开启了如此有趣的话题。欢迎提出问题和评论。甚至鼓励!

