2.4. 设备类

Ceph 的 CRUSH map 在控制数据放置方面提供了非凡的灵活性。这是 Ceph 的最大优势之一。早期 Ceph 部署使用硬盘几乎专用。如今,Ceph 集群经常使用多种类型的存储设备构建:HDD、SSD、NVMe,甚至各种级别的存储设备。例如,Ceph 对象网关部署中通常具有存储策略,客户端可在较慢的 HDD 和其他存储策略中存储数据,从而将数据存储在快速 SSD 上。Ceph 对象网关部署甚至可能具有由用于 bucket 索引快速 SSD 支持的池。此外,OSD 节点通常还会专门用于不显示在 CRUSH map 中的日志或 write-ahead 日志。过去,这些复杂的硬件方案需要手动编辑 CRUSH map,这可能十分耗时且繁琐。在 RHCS 3 中,红帽添加了一个新的"设备类",这大大简化了创建 CRUSH 层次结构,在 RHCS 3 及更高版本中,不再需要对不同类型的存储设备具有不同的 CRUSH 层次结构。

CRUSH 规则在 CRUSH 层次结构方面起作用。但是,如果同一主机上存在不同类别的存储设备,则流程变得更加复杂 - 需要用户为每一类设备创建多个 CRUSH 层次结构,然后在 启动选项时禁用 osd crush update,以 自动化大部分 CRUSH 层次结构管理。设备类通过告知 CRUSH 规则要使用的设备类别来消除这种繁琐问题,从而大大简化了 CRUSH 管理任务。

注意

在 RHCS 3 及更高版本中,ceph osd tree 命令有一个列来反映设备类。

以下小节详细介绍了设备类使用情况。如需更多 示例,请参阅 在 RHCS 3、terter 和 CRUSH 存储策略 示例中使用不同的设备类

2.4.1. 设置设备类

要为 OSD 设置设备类,请执行以下操作:

# ceph osd crush set-device-class <class> <osdId> [<osdId>...]

例如:

# ceph osd crush set-device-class hdd osd.0 osd.1
# ceph osd crush set-device-class ssd osd.2 osd.3
# ceph osd crush set-device-class bucket-index osd.4
注意

Ceph 可能会自动将类分配给设备。但是,类名称只是任意字符串。不要求遵循 hddssd 或 nvme。在 foregoing 示例中,名为 bucket-index 的设备类可能表示 Ceph Object Gatway 池使用唯一的存储桶索引工作负载的 SSD 设备。若要更改已设置的设备类,请先使用 ceph osd crush rm-device-class

2.4.2. 删除设备类

要删除 OSD 的设备类,请执行以下操作:

# ceph osd crush rm-device-class <class> <osdId> [<osdId>...]

例如:

# ceph osd crush rm-device-class hdd osd.0 osd.1
# ceph osd crush rm-device-class ssd osd.2 osd.3
# ceph osd crush rm-device-class bucket-index osd.4

2.4.3. 重命名设备类

要为所有使用该类的 OSD 重命名设备类,请执行以下操作:

# ceph osd crush class rename <oldName> <newName>

例如:

# ceph osd crush class rename hdd sas15k

2.4.4. 列出设备类

要列出 CRUSH map 中的设备类,请执行以下操作:

# ceph osd crush class ls

输出将类似如下:

[
    "hdd",
    "ssd",
    "bucket-index"
]

2.4.5. 列出设备类的 OSD

要列出属于特定类的所有 OSD,请执行以下操作:

# ceph osd crush class ls-osd <class>

例如:

# ceph osd crush class ls-osd hdd

输出只是 OSD 编号的列表。例如:

0
1
2
3
4
5
6

2.4.6. 按类列出 CRUSH 规则

要列出所有引用同一类的规则,请执行以下操作:

# ceph osd crush rule ls-by-class <class>

例如:

# ceph osd crush rule ls-by-class hdd