2.2. CRUSH 层次结构
CRUSH map 是一种有向的 acyclic 图,因此可以容纳多个层次结构,如性能域。创建和修改 CRUSH 层次结构的最简单方式是使用 Ceph CLI,但您也可以编译 CRUSH map、对其进行编辑、重新编译并激活它。
在使用 Ceph CLI 声明存储桶实例时,您必须指定其类型,并为它指定一个唯一的字符串名称。Ceph 自动分配 bucket ID,将算法设为 straw2
,将哈希设置为 0,
反映 rjenkins1
并设置一个权重。当修改 decompiled CRUSH map 时,将 bucket 分配为负整数的唯一 ID(可选),指定相对于其项目的总容量/大写性的权重,请指定存储桶算法(通常是 straw2
),以及 hash(通常为 0
,代表哈希算法 rjenkins1
)。
bucket 可以具有一个或多个项目。这些项目可由节点存储桶(如 racks、rows、hosts)或 leaves(如 OSD 磁盘)组成。项目可以有一个权重,来反映项目的相对权重。
在修改 decompiled CRUSH map 时,您可以使用以下语法声明节点存储桶:
例如,使用上图,我们将定义两个主机存储桶和一个机架 bucket。OSD 声明为主机存储桶中的项目:
在示例中,请注意 rack 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
root=default row=a rack=a2 chassis=a2a host=a2a1
备注:
- 密钥的顺序无关紧要。
-
密钥名称(
=
的左)必须是有效的 CRUSH类型
。默认情况下,包括root
,datacenter
,room
,row
,pod
,pdu
,rack
,chassis
和host
.您可以编辑 CRUSH 映射,以更改类型以满足您的需求。 -
您不需要指定所有存储桶/密钥。例如,Ceph 默认自动将
ceph-osd
守护进程的位置设置为root=default host={HOSTNAME}
(基于hostname -s
的输出)。
2.2.2. 添加存储桶 复制链接链接已复制到粘贴板!
要将存储桶实例添加到 CRUSH 层次结构中,请指定存储桶名称及其类型。bucket 名称在 CRUSH map 中必须是唯一的。
ceph osd crush add-bucket {name} {type}
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 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
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
不支持在 bucket 名称中使用冒号(:)。
为层次结构所需的每个存储桶类型添加一个实例。以下示例演示了为具有 SSD 主机机架和对象存储的主机机架添加 bucket。
完成这些步骤后,查看您的树。
ceph osd tree
ceph osd tree
请注意,层次结构仍然是扁平。在将存储桶添加到 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 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 tree
您还可以使用 ceph osd crush create-or-move
在移动 OSD 时创建一个位置。
2.2.4. 删除存储桶 复制链接链接已复制到粘贴板!
要从 CRUSH 层次结构中删除存储桶实例,请指定存储桶名称。例如:
ceph osd crush remove {bucket-name}
ceph osd crush remove {bucket-name}
或者:
ceph osd crush rm {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 算法为:
-
统一的 : 统一存储桶聚合具有相同权重的设备。例如,当公司委托或停用硬件时,它们通常使用完全相同的物理配置(例如批量购买)的机器。当存储设备有完全相同的权重时,您可以使用
统一的
bucket 类型,允许 CRUSH 将副本映射到固定时间一致的 bucket 中。对于非统一权重,您应该使用另一个存储桶算法。 - 列表 :将存储桶作为链接列表来聚合。基于 RUSH (Replication Under Scalable Hashing) P 算法,对于一个扩展集群,列表是一种自然而直观的选择:一个对象会被重新定位到具有一些适当的概率的新设备上,或者仍保留在旧的设备上。当项目添加到存储桶时,结果是最佳的数据迁移。但是,从列表的中间或尾部删除项目可能导致大量不必要的移动,因此列表存储桶最适用于永不或很少被缩小的情况。
- Tree :树形 bucket 使用二进制搜索树。当存储桶包含大量项目时,它们比列表存储桶更高效。基于 RUSH (Replication Under Scalable Hashing) R 算法,树形存储桶可将放置时间缩短为零(log n),使它们适合管理大型设备或嵌套的存储桶。
-
Straw2(默认):类别和树存储桶以某种方式划分和排序策略,例如,在列表开始时提供某些项目优先级;例如,列表开头或组合需要考虑整个项目的整个子树。这提高了副本放置过程的性能,但也可以因为项目的添加、删除或重新加权更改存储桶内容时引入不够优化的重新组织行为。
straw2
bucket 类型允许所有项目通过类似于 straws 的一种进程来相互看似"竞争"处理。