2.5. 开发 CRUSH 层次结构
作为存储管理员,在部署 Ceph 存储集群和对象网关时,Ceph 对象网关通常具有默认的 zone group 和 zone。Ceph 存储群集将具有默认的池,后者使用 CRUSH 层次结构和默认 CRUSH 规则的 CRUSH map。
默认 rbd
池可以使用默认的 CRUSH 规则。如果 Ceph 客户端已使用它们存储客户端数据,请不要 删除 默认规则或层次结构。
生产网关通常使用自定义域、zone group 和 zone,具体取决于网关的使用和地理位置。此外,Ceph 存储群集将具有具有多个 CRUSH 层次结构的 CRUSH map。
-
服务池: 至少一个 CRUSH 层次结构将用于服务池,并且可能用于数据。服务池包含
.rgw.root
以及与区域关联的服务池。服务池通常位于单个 CRUSH 层次结构下,并使用复制来实现数据持久性。数据池也可能使用 CRUSH 层次结构,但池通常配置有纠删代码以实现数据持久性。 - 索引: 至少有一个 CRUSH 层次结构 SHOULD 用于索引池,其中 CRUSH 层次结构映射到高性能介质,如 SSD 或 NVMe 驱动器。bucket 索引可能会成为性能瓶颈。红帽建议在 CRUSH 层次结构中使用 SSD 或 NVMe 驱动器。在用于 Ceph OSD 日志的 SSD 或 NVMe 驱动器上创建索引分区。另外,索引应该配置有存储桶分片。
- 放置池: 每个放置目标的放置池包括 bucket 索引、数据存储桶和 bucket 额外内容。这些池可以属于单独的 CRUSH 层次结构。由于 Ceph 对象网关可以支持多种存储策略,存储策略的 bucket 池可能与不同的 CRUSH 层次结构关联,反映不同的用例,如 IOPS 优化、吞吐量优化和容量优化。bucket 索引池 SHOULD 使用自己的 CRUSH 层次结构将 bucket 索引池映射到更高性能存储介质,如 SSD 或 NVMe 驱动器。
2.5.1. 创建 CRUSH roots
从管理节点上的命令行,为各个 CRUSH 层次结构在 CRUSH map 中创建 CRUSH roots。必须 至少有一个 CRUSH 层次结构,用于可能也提供数据存储池的服务池。SHOULD 至少有一个 CRUSH 层次结构用于 bucket 索引池,映射到高性能存储介质,如 SSD 或 NVMe 驱动器。
有关 CRUSH 层次结构的详细信息,请参见 Red Hat Ceph Storage 策略指南 7 中的 CRUSH 层次结构 章节。
要手动编辑 CRUSH map,请参阅 Red Hat Ceph Storage 策略指南 7 中的 编辑 CRUSH map 部分。
在以下示例中,名为 data0
、data1
和 data2
的主机使用扩展逻辑名称,如 data0-sas-ssd
、data0-index
等,因为 CRUSH 层次结构有多种指向同一物理主机的 CRUSH 层次结构。
典型的 CRUSH root 可能代表具有 SAS 驱动器和 SSD 的节点(用于日志)。例如:
## # SAS-SSD ROOT DECLARATION ## root sas-ssd { id -1 # do not change unnecessarily # weight 0.000 alg straw hash 0 # rjenkins1 item data2-sas-ssd weight 4.000 item data1-sas-ssd weight 4.000 item data0-sas-ssd weight 4.000 }
用于 bucket 的 CRUSH root 索引 SHOULD 代表高性能介质,如 SSD 或 NVMe 驱动器。考虑在存储 OSD 日志的 SSD 或 NVMe 介质上创建分区。例如:
## # INDEX ROOT DECLARATION ## root index { id -2 # do not change unnecessarily # weight 0.000 alg straw hash 0 # rjenkins1 item data2-index weight 1.000 item data1-index weight 1.000 item data0-index weight 1.000 }
2.5.2. 在 CRUSH map 中使用逻辑主机名
在 RHCS 3 及更高版本中,CRUSH 支持存储设备"类"的概念,此概念在 RHCS 2 及早期版本中不受支持。在 RHCS 3 集群中,包含多类存储设备的主机或节点,如 NVMe、SSD 或 HDD,使用单一 CRUSH 层次结构和设备类别来区分不同类型的存储设备。这无需使用逻辑主机名。在 RHCS 2 和更早的版本中,使用多个 CRUSH 层次结构,分别对应于每类设备,以及逻辑主机名,以区分 CRUSH 层次结构中的主机或节点。
在 RHCS 3 及更高版本中,CRUSH 支持存储设备"类"的概念,这在 RHCS 2 及更早的版本中不被支持。在 RHCS 3 集群中,主机或节点包含多个存储设备类,如 NVMe、SSD 或 HDD,使用单一 CRUSH 层次结构和设备类来区分不同的存储设备类别。这无需使用逻辑主机名。在 RHCS 2 和更早的版本中,使用多个 CRUSH 层次结构,分别对应于每类设备,以及逻辑主机名,以区分 CRUSH 层次结构中的主机或节点。
在 CRUSH map 中,主机名必须是唯一的,并且仅使用一次。当主机服务多个 CRUSH 层次结构和使用案例时,CRUSH map 可以使用逻辑主机名而不是实际的主机名,以确保主机名仅使用一次。例如,节点可能有多个类型的驱动器,如 SSD、SAS 驱动器和 SSD 日志,以及带有并置日志的 SATA 驱动器。要在 RHCS 2 及更早的版本中为同一主机创建多个 CRUSH 层次结构,层次结构需要使用逻辑主机名来代替实际主机名,使得存储桶名称在 CRUSH 层次结构中是唯一的。例如,如果主机名是 data2
,CRUSH 层次结构可能会使用逻辑名称,如 data2-sas-ssd
和 data2-index
:
host data2-sas-ssd { id -11 # do not change unnecessarily # weight 0.000 alg straw hash 0 # rjenkins1 item osd.0 weight 1.000 item osd.1 weight 1.000 item osd.2 weight 1.000 item osd.3 weight 1.000 }
在示例中,主机 data2
使用逻辑名称 data2-sas-ssd
将带有 SSD 上日志的 SAS 驱动器映射到一个层次结构中。OSD ID osd.0
到 osd.3
代表在高吞吐量硬件配置中使用 SSD 日志的 SAS 驱动器。以下示例中的 OSD ID 与 OSD ID 不同。
在以下示例中,主机 data2
使用逻辑名称 data2-index
将 bucket 索引的 SSD 驱动器映射到第二个层次结构。OSD ID osd.4
代表 SSD 驱动器或其他高速度存储介质,专门用于 bucket 索引池。
host data2-index { id -21 # do not change unnecessarily # weight 0.000 alg straw hash 0 # rjenkins1 item osd.4 weight 1.000 }
在使用逻辑主机名时,请确保 Ceph 配置文件中存在以下设置之一,以防止 OSD 启动脚本在启动时使用实际主机名,因此无法在 CRUSH map 中查找数据。
当 CRUSH map 使用逻辑主机名时,如示例中所示,OSD 启动脚本会阻止 OSD 启动脚本在初始化时根据其实际主机名识别主机。在 Ceph 配置文件的 [global]
部分中,添加以下设置:
osd_crush_update_on_start = false
另一种定义逻辑主机名的方法是在 Ceph 配置文件的 [osd.<ID>]
部分中为各个 OSD 定义 CRUSH map 的位置。这将覆盖 OSD 启动脚本定义的任何位置。在示例中,条目可能类似如下:
[osd.0] osd crush location = "host=data2-sas-ssd" [osd.1] osd crush location = "host=data2-sas-ssd" [osd.2] osd crush location = "host=data2-sas-ssd" [osd.3] osd crush location = "host=data2-sas-ssd" [osd.4] osd crush location = "host=data2-index"
如果 CRUSH map 在重启时使用逻辑主机名而不是实际主机名时,Ceph Storage Cluster 假定 OSD 映射到实际主机名,则 CRUSH 映射中没有找到实际的主机名,Ceph 存储集群客户端将找不到 OSD 及其数据。
2.5.3. 创建 CRUSH 规则
与默认的 CRUSH 层次结构一样,CRUSH map 也包含默认的 CRUSH 规则。
默认 rbd
池可能使用此规则。如果其他池已使用它存储客户数据,请不要删除默认规则。
有关 CRUSH 规则的一般详细信息,请参见 Red Hat Ceph Storage 7 策略指南中的 CRUSH 规则 部分。要手动编辑 CRUSH map,请参阅 Red Hat Ceph Storage 7 的 Red Hat Ceph Storage 策略指南中的 编辑 CRUSH map 部分。
对于每一 CRUSH 层次结构,创建一个 CRUSH 规则。下例演示了 CRUSH 层次结构的规则,该层次结构将存储服务池,包括 .rgw.root
。在本例中,根 sas-ssd
充当 CRUSH 主层次结构。它使用名称 rgw-service
来区分其自身和默认规则。step take sas-ssd
行告知池使用 Creating CRUSH roots 中创建的 sas-ssd
root,其子 bucket 包含具有 SAS 驱动器的 OSD 和高性能存储介质,如 SSD 或 NVMe 驱动器,用于高吞吐量硬件配置中的日志。step chooseleaf
的 type rack
部分是故障域。在以下示例中,这是一个机架。
## # SERVICE RULE DECLARATION ## rule rgw-service { type replicated min_size 1 max_size 10 step take sas-ssd step chooseleaf firstn 0 type rack step emit }
在示例中,如果数据被复制三次,集群中的至少应该有三个机架,其中包含相似数量的 OSD 节点。
type replicated
设置与数据持久性、副本数或纠删代码 无关。仅支持 replicated
。
下例演示了将存储数据池的 CRUSH 层次结构的规则。在本例中,根 sas-ssd
充当 CRUSH 主层次结构- 与服务规则相同的 CRUSH 层次结构。它使用 rgw-throughput
来区分其自身与默认规则和 rgw-service
。step take sas-ssd
行告知池使用 Creating CRUSH roots 中创建的 sas-ssd
root,其子 bucket 包含具有 SAS 驱动器的 OSD 和高性能存储介质,如 SSD 或 NVMe 驱动器。step chooseleaf
的 type host
部分是故障域。在以下示例中,这是主机。注意该规则使用相同的 CRUSH 层次结构,但使用了不同的故障realm。
## # THROUGHPUT RULE DECLARATION ## rule rgw-throughput { type replicated min_size 1 max_size 10 step take sas-ssd step chooseleaf firstn 0 type host step emit }
在示例中,如果池将纠删代码与更多的数据进行纠删代码,且编码区块数超过默认值,则集群中的机架应至少包含数量相似的 OSD 节点,以便于纠删代码区块。对于较小的集群,这可能不实际,因此,示例中使用 host
作为 CRUSH 故障realm。
下例演示了 CRUSH 层次结构的规则,该规则将存储索引池。在本例中,根 index
充当 CRUSH 主层次结构。它使用 rgw-index
将自身与 rgw-service
和 rgw-throughput
区分开来。step take index
行告知池使用 Creating CRUSH Roots 创建 index
root,其子存储桶包含高性能存储介质,如 SSD 或 NVMe 驱动器或 SSD 上存储 OSD 日志的 NVMe 驱动器或 NVMe 驱动器上。step chooseleaf
的 type rack
部分是故障域。在以下示例中,这是一个机架。
## # INDEX RULE DECLARATION ## rule rgw-index { type replicated min_size 1 max_size 10 step take index step chooseleaf firstn 0 type rack step emit }
其它资源
- 有关 CRUSH 层次结构的一般详细信息,请参见 Red Hat Ceph Storage 策略指南中的 CRUSH 管理 章节。