2.2. CRUSH 层次结构


CRUSH map 是一个圆环图,因此它可以容纳多个层次结构,如性能域。创建和修改 CRUSH 层次结构的最简单方式是使用 Ceph CLI,但您也可以编译 CRUSH map、对其进行编辑、重新编译并激活它。

使用 Ceph CLI 声明 bucket 实例时,您必须指定其类型并为其提供唯一的字符串名称。Ceph 自动分配 bucket ID,将算法设置为 straw2,将哈希设置为 0, 反映 rjenkins1,并设置权重。当修改 decompiled CRUSH map 时,将 bucket 分配为负整数的唯一 ID(可选),指定相对于其项目的总容量/大写性的权重,请指定存储桶算法(通常是 straw2),以及 hash(通常为 0,代表哈希算法 rjenkins1)。

bucket 可以有一个或多个项目。这些项目可由节点存储桶(如 racks、rows、hosts)或 leaves(如 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 | straw2 ]
    hash [the hash type: 0 by default]
    item [item-name] weight [weight]
}

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

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

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

rack rack1 {
    id -3
    alg straw2
    hash 0
    item node1 weight 2.00
    item node2 weight 2.00
}
注意

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

2.2.1. CRUSH 位置

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

root=default row=a rack=a2 chassis=a2a host=a2a1

备注:

  1. 键的顺序无关紧要。
  2. 密钥名称(属于 = )必须是有效的 CRUSH 类型。默认情况下,包括 root, datacenter, room, row, pod, pdu, rack, chassishost.您可以编辑 CRUSH 映射,以更改类型以满足您的需求。
  3. 您不需要指定所有存储桶/密钥。例如,Ceph 默认自动将 ceph-osd 守护进程的位置设置为 root=default host={HOSTNAME} (基于 主机名 -s的输出)。

2.2.2. 添加存储桶

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

ceph osd crush add-bucket {name} {type}

如果您计划使用多个层次结构,例如,对于不同的硬件性能配置集,请考虑基于硬件类型或用例命名存储桶。

例如,您可以为固态驱动器创建一个层次结构(ssd)、带有 SSD 日志的 SAS 磁盘的层次结构(hdd-journal),以及 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

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
重要

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

为层次结构所需的每个存储桶类型添加一个实例。以下示例演示了为 SSD 主机机架和对象存储的主机机架添加行的 bucket。

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

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

ceph osd tree

请注意,层次结构仍为 flat。在将存储桶添加到 CRUSH map 后,您必须将存储桶移到分级位置。

2.2.3. 移动存储桶

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

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

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

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

ceph osd tree
注意

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

2.2.4. 删除存储桶

要从 CRUSH 层次结构中删除存储桶实例,请指定存储桶名称。例如:

ceph osd crush remove {bucket-name}

或者:

ceph osd crush rm {bucket-name}
注意

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

如果您要删除更高级别的存储桶(例如,一个 root 用户(如 default)),请检查池是否使用了选择该 bucket 的 CRUSH 规则。如果是这样,您需要修改 CRUSH 规则;否则,对等失败。

2.2.5. CRUSH Bucket 算法

在使用 Ceph CLI 创建存储桶时,Ceph 默认将算法设置为 straw2。Ceph 支持四种 bucket 算法,各自代表性能和重新组织效率之间的权衡。如果您不确定要使用的存储桶类型,我们建议使用 straw2 存储桶。bucket 算法有:

  1. 统一: 统一 bucket 聚合设备,其权重 完全相同。例如,当公司委托或停用硬件时,它们通常对具有相同物理配置(例如批量购买)的多台计算机执行此操作。当存储设备完全相同的权重时,您可以使用 统一 存储桶类型,这允许 CRUSH 将副本映射到统一的 bucket 中。使用非统一权重时,您应该使用另一个存储桶算法。
  2. 列表 :将存储桶作为链接列表来聚合。基于 RUSH (Replication Under Scalable Hashing) P 算法,对于一个扩展集群,列表是一种自然而直观的选择:一个对象会被重新定位到具有一些适当的概率的新设备上,或者仍保留在旧的设备上。当项目添加到存储桶时,结果是最佳的数据迁移。但是,从列表的中间或尾部删除项目可能导致大量不必要的移动,因此列表存储桶最适用于永不或很少被缩小的情况。
  3. Tree :树形 bucket 使用二进制搜索树。当存储桶包含大量项目时,它们比列表存储桶更高效。基于 RUSH (Replication Under Scalable Hashing) R 算法,树形存储桶可将放置时间缩短为零(log n),使它们适合管理大型设备或嵌套的存储桶。
  4. Straw2(默认):类别和树存储桶以某种方式划分和排序策略,例如,在列表开始时提供某些项目优先级;例如,列表开头或组合需要考虑整个项目的整个子树。这提高了副本放置过程的性能,但也可以因为项目的添加、删除或重新加权更改存储桶内容时引入不够优化的重新组织行为。straw2 bucket 类型允许所有项目通过与 straws 类似的进程,相互公平"请求"副本放置的过程。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.