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 可能会自动将类分配给设备。但是,类名称只是任意字符串。不要求遵循 hdd
、ssd 或
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