Ceph存储系列(八) 自定义Ceph CRUSH映射
1 | 作者:李晓辉 |
CRUSH 和对象放置策略
Ceph 会使用一种名为 CRUSH(可扩展哈希下的受控复制)的放置算法来计算哪些 OSD 应该存放哪些对象。对象分配到 PG 中,CRUSH 决定这些 PG 应使用哪些 OSD 来存储其对象。
CRUSH的算法
CRUSH 算法支持 Ceph 客户端直接与 OSD 通信,从而避免任何中央化服务瓶颈。Ceph 客户端和 OSD 使用 CRUSH 算法来高效地计算对象位置的信息,而不依赖中央查找表。Ceph 客户端检索集群映射,并使用 CRUSH 映射来通过算法确定如何存储和检索数据。这避免了单一故障点和性能瓶颈,为 Ceph 集群实现大规模可扩展性。
CRUSH 算法能够将数据均匀分布到对象存储中,管理复制,并且响应系统增长和硬件故障。当添加了新的 OSD 或现有的 OSD 或 OSD 主机出现故障时,Ceph 使用 CRUSH 在活跃的 OSD 之间重新均衡集群中的对象。
CRUSH Bucket类型
CRUSH 层次结构将 OSD 整理到由不同容器组成的树中,这些容器称为“存储桶”(bucket)。通过创建 CRUSH 映射规则,您可以使 Ceph 将对象的副本放在不同服务器上的 OSD 中,也可以使它放在位于不同的机架或不同数据中心中的服务器上
存储桶类型包括 root
、region
、datacenter
、room
、pod
、pdu
、row
、rack
、chassis
以及 host
CRUSH 映射默认层次结构示例:
自定义故障和性能域
配置 CRUSH 映射并创建单独的故障域可保证在 OSD 和集群节点出现故障时也不会丢失任何数据。集群仅以降级状态运行,直至问题得到解决。
默认情况下,CRUSH 算法将复制的对象放置到不同主机上的 OSD 中。您可自定义 CRUSH 映射,以便将对象副本跨 OSD 放置在不同的机柜上,或者放置在不同机房的主机上,或者放置在具有不同PDU的不同机架上。
另一用例是将带有 SSD 驱动器的 OSD 分配给需要极快存储的应用使用的池,并将带有传统 HDD 的 OSD 分配给支持较低需求工作负载的池。
集群安装流程部署默认的 CRUSH 映射。您可以使用 ceph osd crush tree/dump
命令以 JSON 格式打印 CRUSH 映射。也可以导出映射的二进制副本,并将它解译为文本文件:
命令查询crush map
1 | [root@serverc ~]# ceph osd crush tree |
二进制导出crush map
您可以通过以下命令,解解并手动编辑 CRUSH 映射:
命令 | 操作 |
---|---|
ceph osd getcrushmap -o binfile | 导出当前映射的二进制副本。 |
crushtool -d binfile -o textfilepath | 将 CRUSH 映射二进制文件解译为文本文件 |
crushtool -c textfilepath -o binfile | 从文本编译 CRUSH 映射。 |
crushtool -i binfile --test | 对二进制 CRUSH 映射执行空运行,并且模拟创建放置组。 |
ceph osd setcrushmap -i binfile | 将二进制 CRUSH 映射导入到集群。 |
注意
如果不想进到容器中,需要安装ceph-base软件包
1 | [root@serverc ~]# cephadm shell |
自定义OSD CRUSH设置
CRUSH 映射包含集群中所有存储设备的列表。每一存储设备都提供有以下信息:
存储设备的 ID。
存储设备的名称。
存储设备的类别。一个存储集群中可以使用多种类型的存储设备,如 HDD、SSD 或 NVMe SSD。
存储设备的权重,通常基于以 TB 为单位的容量。例如,4 TB 存储设备的权重约为 4.0。这是设备可以存储的相对数据量,CRUSH 算法用它来帮助确保对象均匀分布。
重新crush map调整权重
可以用ceph osd crush tree
来查询他们具体的权重
1 | [ceph: root@serverc /]# ceph osd crush reweight-all |
管理设备的Class类别
先查看现有的
1 | [root@serverc ~]# ceph osd crush class ls |
创建一个名为ssd的类别
1 | [root@serverc ~]# ceph osd crush class create ssd |
更改osd的class
如果osd已经关联了一个class,需要先删除,然后才能关联
1 | [root@serverc ~]# ceph osd crush set-device-class ssd osd.1 |
解读CRUSH规则
CRUSH 映射也包含数据放置规则,它们决定了 PG 如何映射到 OSD 来存储对象副本或纠删代码区块。
ceph osd crush rule ls
命令可列出现有的规则,而 ceph osd crush rule dump rule_name
命令则可打印规则的详细信息。
解译后的 CRUSH 映射也包含规则,它们可能更容易阅读:
1 | [root@serverc ~]# cephadm shell |
例如,您可以创建以下规则,以在不同的机架上选择所需数量的 OSD,但仅从 DC1 数据中心选择:
1 | rule myrackruleinDC1 { |
使用Ceph命令定制CRUSH地图
创建存储桶的命令格式如下
1 | ceph osd crush add-bucket name type |
调整层级的命令格式如下
1 | ceph osd crush move name type=parent |