2.2. CRUSH 层次结构


CRUSH map 是定向式图形,因此它可以容纳多个层次结构(如性能域)。创建和修改 CRUSH 层次结构的最简单方法是使用 Ceph CLI;不过,您也可以解译 CRUSH map,编辑它,对其进行重新编译,并将它激活。

使用 Ceph CLI 声明 bucket 实例时,您必须指定其类型,并为它指定唯一名称(字符串)。Ceph 自动分配 bucket ID,将算法设置为 straw,将哈希设为 0,反映 rjenkins1,然后设置权重。在修改已编译的 CRUSH 映射时,为存储桶分配以负整数表示的唯一 ID(可选),指定相对于其项目的总容量/功能权重,指定 bucket 算法(通常是 straw)和哈希(通常表示 哈希 算法 rjenkins1)。

bucket 可以具有一个或多个项目。项目可以包含节点存储桶(如机架、行、主机)或离开(如 OSD 磁盘)。项目可以具有一个权重来反映项目的相对权重。

在修改已编译的 CRUSH map 时,您可以使用以下语法声明节点存储桶:

[bucket-type] [bucket-name] {
    id [a unique negative numeric ID]
    weight [the relative capacity/capability of the item(s)]
    alg [the bucket type: uniform | list | tree | straw ]
    hash [the hash type: 0 by default]
    item [item-name] weight [weight]
}
Copy to Clipboard Toggle word wrap

例如,我们使用上图定义两个主机 bucket 和一个机架 bucket。OSD 在主机存储桶中声明为项目:

host node1 {
    id -1
    alg straw
    hash 0
    item osd.0 weight 1.00
    item osd.1 weight 1.00
}

host node2 {
    id -2
    alg straw
    hash 0
    item osd.2 weight 1.00
    item osd.3 weight 1.00
}

rack rack1 {
    id -3
    alg straw
    hash 0
    item node1 weight 2.00
    item node2 weight 2.00
}
Copy to Clipboard Toggle word wrap
注意

在示例中,请注意机架 bucket 不包含任何 OSD。而是包含较低级别的主机 bucket,并在 item 条目中包含其权重的总和。

2.2.1. CRUSH 位置

CRUSH 位置是 OSD 在 CRUSH map 的层次结构方面的位置。当您在命令行界面上表达 CRUSH 位置时,CRUSH 位置指定符采用描述 OSD 位置的名称/值对的列表。例如,如果某一 OSD 位于特定的行、机架、机箱和主机中,并且是 默认 CRUSH 树的一部分,其 crush 位置可以描述为:

root=default row=a rack=a2 chassis=a2a host=a2a1
Copy to Clipboard Toggle word wrap

注:

  1. 密钥的顺序无关紧要。
  2. 密钥名称(左 = )必须是有效的 CRUSH 类型。默认情况下,其中包括 rootdatacenter、room、line、 pod pdurack、cha ssishost。您可以编辑 CRUSH map,以更改类型以符合您的需要。
  3. 您不需要指定所有存储桶/密钥。例如,默认情况下,Ceph 自动将 ceph-osd 守护进程的位置设置为 root=default host={HOSTNAME} (基于来自 hostname -s的输出)。

2.2.2. 添加 Bucket

若要添加 bucket 实例到 CRUSH 层次结构,可指定 bucket 名称及其类型。bucket 名称在 CRUSH map 中必须是唯一的。

ceph osd crush add-bucket {name} {type}
Copy to Clipboard Toggle word wrap

如果您计划使用多个层次结构(例如,针对不同的硬件性能配置文件),请考虑根据其硬件类型或用例命名存储桶。

例如,您可以为固态硬盘(ssd)、带有 SSD 日志(hdd-journal)的 SAS 磁盘创建层次结构,并为 SATA 驱动器创建另一个层次结构(hdd):

ceph osd crush add-bucket ssd-root root
ceph osd crush add-bucket hdd-journal-root root
ceph osd crush add-bucket hdd-root root
Copy to Clipboard Toggle word wrap

Ceph CLI 输出:

added bucket ssd-root type root to crush map
added bucket hdd-journal-root type root to crush map
added bucket hdd-root type root to crush map
Copy to Clipboard Toggle word wrap
重要

不支持在存储桶名称中使用冒号(:)。

添加层次结构所需的每种 bucket 类型的实例。以下示例演示了如何添加一行中的 bucket,其中包含 SSD 主机的机架和对象存储的主机机架。

ceph osd crush add-bucket ssd-row1 row
ceph osd crush add-bucket ssd-row1-rack1 rack
ceph osd crush add-bucket ssd-row1-rack1-host1 host
ceph osd crush add-bucket ssd-row1-rack1-host2 host
ceph osd crush add-bucket hdd-row1 row
ceph osd crush add-bucket hdd-row1-rack2 rack
ceph osd crush add-bucket hdd-row1-rack1-host1 host
ceph osd crush add-bucket hdd-row1-rack1-host2 host
ceph osd crush add-bucket hdd-row1-rack1-host3 host
ceph osd crush add-bucket hdd-row1-rack1-host4 host
Copy to Clipboard Toggle word wrap
注意

如果您已经使用 Ansible 自动化应用或其他工具来添加 OSD 到集群中,则主机节点可以已在 CRUSH map 中。

完成这些步骤后,请查看您的树。

ceph osd tree
Copy to Clipboard Toggle word wrap

请注意,层次结构保持扁平状态。将存储桶添加到 CRUSH map 后,您必须将它们移到层次结构位置。

2.2.3. 移动 Bucket

在创建初始集群时,Ceph 具有名为 default 的根 bucket 的默认 CRUSH map,您的初始 OSD 主机显示在 默认 bucket 下。当您添加 bucket 实例到 CRUSH map 时,它会出现在 CRUSH 层次结构中,但不一定显示在特定 bucket 下。

若要将 bucket 实例移到 CRUSH 层次结构中的特定位置,可指定 bucket 名称及其类型。例如:

ceph osd crush move ssd-row1 root=ssd-root
ceph osd crush move ssd-row1-rack1 row=ssd-row1
ceph osd crush move ssd-row1-rack1-host1 rack=ssd-row1-rack1
ceph osd crush move ssd-row1-rack1-host2 rack=ssd-row1-rack1
Copy to Clipboard Toggle word wrap

完成这些步骤后,您可以查看树。

ceph osd tree
Copy to Clipboard Toggle word wrap
注意

您还可以使用 ceph osd crush create-or-move 在移动 OSD 时创建一个位置。

2.2.4. 删除 Bucket

若要从 CRUSH 层次结构中移除 bucket 实例,可指定 bucket 名称。例如:

ceph osd crush remove {bucket-name}
Copy to Clipboard Toggle word wrap

或者:

ceph osd crush rm {bucket-name}
Copy to Clipboard Toggle word wrap
注意

bucket 必须为空才能将其删除。

如果您要删除更高级别的存储桶(如 default),请检查池是否使用 CRUSH 规则来选择该 bucket。如果是这样,您需要修改 CRUSH 规则;否则,peering 会失败。

2.2.5. bucket Algorithms

在使用 Ceph CLI 创建 bucket 时,Ceph 会默认将算法设置为 straw。Ceph 支持四种 bucket 算法,每种算法代表性能和提升效率之间的权衡。如果您不确定要使用的存储桶类型,我们建议使用 straw bucket。bucket 算法是:

  1. 统一: 统一存储桶聚合设备,其权重 完全相同。例如,当公司委托或停用硬件时,他们通常使用许多具有完全相同的物理配置(例如批量采购)的机器。当存储设备的权重完全相同时,您可以使用 统一 bucket 类型,它允许 CRUSH 持续将副本映射到统一 bucket。使用非统一权重时,您应该使用其他 bucket 算法。
  2. list :列出存储桶将其内容聚合为链接列表。根据 RUSH(Replication Under Scalable Hashing) P 算法,列表是 扩展集群的 自然和直观选择:对象被重新定位到具有某种适当概率的最新设备,或者像以前一样保留在旧设备上。结果是在将项目添加到存储桶时的最佳数据迁移。但是,从列表中的中部或尾部删除的项目可能会导致大量不必要的移动,使列表存储桶非常适合 (或很少)缩小 的情况。
  3. :树形 bucket 使用二进制搜索树。当 bucket 包含较大的项目集时,它们比列出存储桶更高效。根据 RUSH(可扩展哈希下的复制) R 算法,树 bucket 减少了 O(log n)的放置时间,使其适合管理大得多的设备或嵌套 bucket。
  4. straw(默认): list 和 Tree bucket 使用拆分和聚合策略,从而指定特定项目(例如,列表开头的项目)或无需考虑整个项目子树。这提高了副本放置流程的性能,但也可能会在 bucket 的内容因为项目的添加、删除或重新加权而改变时引入不最佳的行为。straw bucket 类型允许所有项目都比较"compete",通过类似于大量 straws 的过程进行副本放置。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat