本文发布于Cylon的收藏册,转载请著名原文链接~


什么是块存储 RBD

Ceph RBD (RADOS Block Device) 是 Ceph 提供的三种存储类型之一 (块存储 RBD, 文件存储 CephFS, 对象存储 RGW),也是另外两个存储类型 (文件存储 CephFS, 对象存储 RGW) 的底座,位于 RADOS 架构中的最底层,由下图可以看出

图:Ceph RADOS架构图
Source:https://www.supportsages.com/ceph-part-3-technical-architecture-and-components/

RADOS 是可信赖的自动分布式对象存储 (Reliable Autonomous Distributed Object Store) 的简写,通俗来说,RADOS 代表的就是整个 Ceph 集群,数据对象在集群中的存储方式会“将对象复制为多副本” 以实现容错,所以 Ceph 集群的底座就是 RADOS,一个 RADOS 集群的组件通常包含三个,OSD Daemon , MDS, MON

  • Object Storage Device (OSD) Daemon:RADOS集群中负责存储守护进程,与 OSD (数据的物理或逻辑存储单元【通常指一个硬盘】)交互。集群中的每个 Ceph Node 都必须运行 OSD Daemon。对于每个 OSD,可以有一个关联的硬盘 (通常一个OSD Daemon 对应一个存储单元)。
  • MONITORS (Mon Daemon):Monitor (ceph-mon) 不是集群存储组件的一部分,但它通过监视 OSD 状态并生成 “Cluster Map” 而成为 RADOS 不可或缺的一部分。它监视 OSD 并跟踪在给定时间点哪些 OSD 处于运行状态、哪些 OSD 处于对等状态、OSD 的状态等。一般来说,它充当存储集群中所有 OSD 的 Monitor
  • Manager (MGR Daemon):Manager (ceph-mgr) 是与 ceph-mon 一同运行的守护进程,为外部监控和管理系统提供额外的监视和接口。默认情况下,ceph-mgr 除了确保其正在运行之外不需要其他配置。如果没有运行 ceph-mgr,ceph -s 将会看到一条 WARN;不管是使用什么方式部署的集群 ( ceph-deploy, cephadm),ceph-mgr 总会 与 ceph-mon 同时运行在一个节点上,也可单独运行在 Ceph Node 之上。

通常 Monitor (ceph-mon) 不构成“存储”集群的一部分,只是通过监视 OSD 状态并生成 Cluster map 而成为 ceph存储集群中不可缺少的组件。它通过监视 OSD 并跟踪在给定时间点哪些 OSD 处于运行状态、哪些 OSD 处于对等状态、OSD 的状态等。

如何确定 ceph-mon 的数量

ceph-mon 的数量最好是奇数,并且数量个数时有限限制的,这里在总结一下 ceph monitor 的作用:

  • Monitor 不向客户端提供存储的对象,由于它只是一个监控节点,因此它不保存/管理任何对象,也不属于对象存储的一部分,但它仍然是 RADOS 的一部分,但不用于数据/对象存储。
  • 它维护簇映射状态,即:存储集群客户端/应用程序从 ceph-mon 检索集群映射的副本
  • 通常很奇怪并且数量有限,因为他们的工作相当简单,维护 OSD 的状态。
  • 为分布式决策提供共识,当要针对 OSD 的状态做出特定决策时,它提供了一般规则。 当多个 OSD 要进行对等互连或复制时,监视器会自行决定如何进行对等互连,而不是由 ODS 自行决定。
  • Ceph OSD 守护进程检查自身状态和其他 OSD 的状态并向监视器报告。

中国铁路2020年分享的 1550+ OSD PB 级别存储 ceph-con 数量从 “3” 升级到 “5” 后,趋势稳定 [1]

RBD 存储单元

RBD 块设备 (RADOS Block Device) 在 Ceph 中被称为 image。image 由 “元数据” 和 ”数据“两部分组成,其中元数据存储在多个特殊的 RADOS 对象中,而数据被自动”条带化“成多个 RADOS 对象进行存储。除了 image 自身的元数据之外,在 image 所属的 存储池 (Pool) 中都还有一组特殊的 RADOS 对象记录 image 关联关系或附加信息等相关的 RBD 管理元数据。所有的数据对象和元数据对象都依据 CRUSH 规则 (CRUSH RULE) 存储在底层的 OSD 设备上,因此 RBD 块设备自动继承了 RADOS 对象的数据冗余保护机制和一致性策略。

对于 RBD Image 官方是这么描述的 [2]

RBD images are simple block devices that are striped over objects and stored in a RADOS object store. The size of the objects the image is striped over must be a power of two.

由此,我们可以得知,”镜像“ (RBD IMAGE) 的表现就是一个块设备

POOL

存储池是用于存储对象的逻辑分区,一个存储池中可以放置多个”IMAGE“。在官方给出的,存储池提供了如下特性:

池提供以下功能:

  1. 冗余性 (Resilience):可以设置允许失败的 OSD 数量,而不会丢失任何数据。如果您的集群使用 ”复制池“ (replicated ),那么可以容忍的 OSD 故障数量等于复制的数量。

    例如:典型配置存储一个对象及其每个 RADOS 对象的两个副本(即size=3,默认值),但您可以根据池的需求配置副本数量。对于纠删码池 (erasure-coded),冗余性定义为编码块的数量(例如,默认纠删码配置文件中的m = 2)。

  2. 放置组(Placement Groups,PGs):您可以为池设置放置组(PGs)的数量。在典型配置中,每个 OSD 的目标 PG 数量约为 100 个 PGs。这提供了合理的负载均衡,而不会消耗过多的计算资源。在设置多个存储池时,请小心为每个存储池和整个集群设置合适数量的 PGs。每个 PG 都属于特定的存储池:当多个存储池使用相同的 OSDs 时,请确保每个 OSD 上的 PG 副本总数在所需的 “每个 OSD 上 PG数量的目标范围内”。要计算适合您的池的PG数量,请使用 pgcalc [3] 工具。

  3. CRUSH规则:当数据存储在池中时,对象及其副本(或在纠删码池中的块)在您的集群中的放置由 CRUSH 规则管理。如果默认规则不适合您的用例,可以为池创建自定义 CRUSH 规则。

  4. 快照:命令 ceph osd pool mksnap 可创建基于存储池的快照。

librdb 和 librados

要想使用块设备,就涉及到 RADOS 之上数据的交互,我们已经了解到了 RBD 是为 KVM 等虑拟化技术和云 OS(如 OpenStack 和 CloudStack)提供高性能和无限可扩展性的存储后端,这些系统依赖于 libvirt 和 QEMU 实用程序与 RBD 进行集成。

在Ceph中,提供了一种 librados 的库,它可以使得 客户端 与 Ceph 集群间的交互,在 RADOS 之上 存在一个 “librados"库,而 “librbd” 库则是构建与 “librados” 之上的的库,提供了块存储的功能,下面是两个库在“用途”和“功能”上有一些重要区别:

  1. librados(RADOS客户端库):
    • 用途:librados是用于与Ceph的底层RADOS存储层交互的库。它提供了与Ceph集群中的对象存储进行直接通信的API,允许应用程序执行各种存储操作,如读取、写入、删除和管理存储对象。
    • 功能:librados允许应用程序直接访问Ceph集群,而不需要高级抽象,这意味着应用程序可以更精细地控制数据的读写和存储策略。librados可以用于构建自定义数据存储和管理解决方案。
  2. librbd(RBD客户端库):
    • 用途:librbd是用于与Ceph中的RBD(Rados Block Device)存储层交互的库。它构建在librados之上,提供了更高级别的抽象,用于处理块设备(镜像)操作,如创建、映射、快照和克隆等。
    • 功能:librbd简化了块设备操作,并提供了易于使用的API,使应用程序能够轻松地管理RBD镜像。它是构建虚拟化平台、云存储、容器存储等应用的关键组件。

要使用 RBD 存储池需要先启用,而却需要注意的是 rbd 存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),而 “映像” 代表了真正的块设备

RBB 支持的功能

  • 快照
  • 排他锁/独占锁
  • 镜像
  • 实时迁移
  • ..

快照

RBD 快照 (snapshot) 是 image 在某个特定时间点的只读逻辑副本,类似于虚拟机的快照,快照也是 RBD 的高级功能之一,使得可以用户创建映像快照以保留时间点状态历史记录。 Ceph还支持快照分层,使您可以快速轻松地克隆镜像(例如虚拟机镜像)。 Ceph RBD 快照的使用通过命令 rbd 和几个更高级的接口进行管理,包括 QEMU, libvirt, OpenStack 和 CloudStack。

由于 Ceph RBD 不知道 “镜像” 内的任何文件系统,因此快照仅是崩溃一致的,除非它们在挂载(mouting) 操作系统内进行协调。因此,我们建议您在拍摄快照之前暂停或停止 I/O。

如果镜像包含文件系统,则在拍摄快照之前文件系统应处于内部一致状态。即需要停止IO

快照的操作

ceph 有专门的命令 rbd 可以进行 RBD 相关的操作,例如快照的命令为 rbd snapshot

命令 语法 样例
创建快照 rbd snap create {pool-name}/{image-name}@{snap-name} rbd snap create rbd/foo@snapname
列出快照 rbd snap ls {pool-name}/{image-name} rbd snap ls rbd/foo
回滚快照 rbd snap rollback {pool-name}/{image-name}@{snap-name} rbd snap rollback rbd/foo@snapname
删除一个快照 rbd snap rm {pool-name}/{image-name}@{snap-name} rbd snap rm rbd/foo@snapname
清除所有快照 rbd snap purge {pool-name}/{image-name} rbd snap purge rbd/foo

列出快照

Reference

[1] 中国铁路:Ceph在单集群1551个OSD下的挑战

[2] rbd – manage rados block device (RBD) images

[3] pgcalc

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2019/09/03-1-acquaintance-rdb/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。