Luminous 中的新增功能:CRUSH 设备类

sage

Ceph 中 CRUSH 映射控制数据放置的灵活性是该系统的一大优势。 同样,它也是集群中最难管理的部分之一。 以前,任何非平凡的数据放置策略都需要手动编辑 CRUSH 映射,无论是调整层次结构还是编写实现数据放置策略的规则。 在 Luminous 中,我们添加了一个新的“设备类”功能,可以自动执行直接编辑 CRUSH 映射的最常见原因之一,使我们更接近于实现无需管理员手动修改 CRUSH 映射的目标。

CRUSH 管理问题

Ceph 集群通常使用多种类型的存储设备构建:HDD、SSD、NVMe,甚至上述类别的各种类型。 我们将这些不同类型的存储设备称为设备类,以避免与 CRUSH 存储桶的类型属性(例如,主机、机架、行等)混淆。 由 SSD 支持的 Ceph OSD 明显比由旋转磁盘支持的 OSD 快得多,因此更适合某些工作负载。 Ceph 允许轻松创建用于不同数据集或工作负载的 RADOS 池,并分配不同的 CRUSH 规则来控制这些池的数据放置。

但是,设置 CRUSH 规则以仅将数据放置在特定设备类上是一项繁琐的任务。 规则在 CRUSH 层次结构中工作,但如果设备混合在相同的主机或机架中(如上所示的示例层次结构),它们将(默认情况下)混合在一起并出现在层次结构的相同子树中。 以前,手动将它们分成单独的树需要为每个设备类创建中间节点的多个版本(例如,“host h1-ssd”和“host h1-hdd”),并且需要管理员禁用“osd crush update on start”选项,该选项可以自动执行大部分 CRUSH 层次结构管理负担。 这太糟糕了。

设备类

为了解决这个问题,Luminous 为每个 OSD 添加了一个新的属性:设备类。 默认情况下,OSD 将自动根据 Linux 内核公开的硬件属性将其设备类设置为hddssdnvme(如果尚未设置)。 这些设备类在 ceph osd tree 命令的输出的新列中报告

$ ceph osd tree ID CLASS WEIGHT   TYPE NAME      STATUS REWEIGHT PRI-AFF -1       83.17899 root default -4       23.86200     host cpach 2   hdd  1.81898         osd.2      up  1.00000 1.00000 3   hdd  1.81898         osd.3      up  1.00000 1.00000 4   hdd  1.81898         osd.4      up  1.00000 1.00000 5   hdd  1.81898         osd.5      up  1.00000 1.00000 6   hdd  1.81898         osd.6      up  1.00000 1.00000 7   hdd  1.81898         osd.7      up  1.00000 1.00000 8   hdd  1.81898         osd.8      up  1.00000 1.00000 15   hdd  1.81898         osd.15     up  1.00000 1.00000 10  nvme  0.93100         osd.10     up  1.00000 1.00000 0   ssd  0.93100         osd.0      up  1.00000 1.00000 9   ssd  0.93100         osd.9      up  1.00000 1.00000 11   ssd  0.93100         osd.11     up  1.00000 1.00000 12   ssd  0.93100         osd.12     up  1.00000 1.00000 13   ssd  0.93100         osd.13     up  1.00000 1.00000 14   ssd  0.93100         osd.14     up  1.00000 1.00000 16   ssd  0.93100         osd.16     up  1.00000 1.00000 17   ssd  0.93100         osd.17     up  1.00000 1.00000 18   ssd  0.93100         osd.18     up  1.00000 1.00000 ...

如果自动设备类检测出现错误(例如,因为设备驱动程序未正确通过/sys/block公开设备信息),您还可以从命令行调整设备类

$ ceph osd crush rm-device-class osd.2 osd.3 完成删除 osd(s) 2,3 的类 $ ceph osd crush set-device-class ssd osd.2 osd.3 设置 osd(s) 2,3 为 'ssd' 类

CRUSH 放置规则

CRUSH 规则可以限制放置到特定设备类。 例如,我们可以轻松创建一个“fast”池,该池仅在 SSD 上分发数据(故障域为主机),命令为ceph osd crush rule create-replicated<rule-name<root<failure-domain-type<device-class>

$ ceph osd crush rule create-replicated fast default host ssd

创建擦除码规则的过程略有不同。 首先,您创建一个包含所需设备类属性的擦除码配置文件。 然后在创建擦除码池时使用该配置文件。 例如,您可以执行以下操作

$ ceph osd erasure-code-profile set myprofile k=4 m=2 crush-device-class=ssd crush-failure-domain=host $ ceph osd pool create ecpool 64 erasure myprofile

如果您必须手动编辑 CRUSH 映射以自定义规则,则语法已扩展为允许指定设备类。 例如,上述命令生成的 CRUSH 规则如下所示

rule ecpool { id 2 type erasure min_size 3 max_size 6 step set_chooseleaf_tries 5 step set_choose_tries 100 step take default class ssd step chooseleaf indep 0 type host step emit }

重要的区别在于“take”命令包含额外的“class<class-name>”后缀。

有关更多信息,请参阅CRUSH 文档

向后兼容

新设备类功能的一个重要特性是它与旧客户端 100% 兼容。 您可以在将集群升级到 Luminous 后立即开始使用设备类(实际上,OSD 会在升级时自动开始在 CRUSH 映射中添加其设备类注释)。 使用 Ceph 的任何先前版本的旧 RBD、CephFS 或其他客户端都将理解使用新设备类的 CRUSH 规则。

唯一的限制是,旧版本的crushtool实用程序将无法理解如何反编译和编译使用设备类的 CRUSH 映射,并且集群的监视器必须运行 Luminous(或更高版本)。

管理

还有一些其他设备类命令可用。 您可以列出类

$ ceph osd crush class ls [   "hdd",   "ssd" ]

您可以列出属于某个类的 OSD

$ ceph osd crush class ls-osd ssd 0 1 ...

您还可以重命名类,这可以安全地更新所有相关元素:OSD 设备类属性和 CRUSH 规则会安全地同步更新,使用“ceph osd crush class rename”命令。

未来

我们正在努力实现一个未来,即没有操作员需要手动编辑 CRUSH 映射:这既繁琐又耗时且容易出错。 我们希望设备类已经消除了 Ceph 管理员必须这样做的一个主要原因。 如果您发现您的 Ceph 集群仍然需要您自定义 CRUSH,而 CLI 命令不足以满足您的需求,我们希望收到您的反馈!