Menu Close

第 7 章 开发存储策略

为生产设置 Ceph 存储集群和 Ceph 对象网关的一个更具挑战性的方面是定义有效的存储策略。存储策略包括以下因素:

有关存储 策略和命令行使用情况的一般指导,请参阅红帽 Ceph 存储 4 存储策略指南。

7.1. 开发 CRUSH 层次结构

在部署 Ceph 群集和对象网关时,对象网关通常具有默认的 zone group 和 zone。Ceph 存储群集将具有默认的池,后者使用 CRUSH 层次结构和默认 CRUSH 规则的 CRUSH map。

重要

默认 rbd 池可能使用默认的 CRUSH 规则。如果 Ceph 客户端已使用它们存储客户端数据,请不要 删除 默认规则或层次结构。

如需有关 CRUSH 层次结构的常规详细信息,请参见《存储策略指南》中的 CRUSH 管理 小节。

生产网关通常使用自定义 域、zone group 和 zone,具体取决于网关的使用和地理位置。此外,Ceph 群集将具有具有多个 CRUSH 层次结构的 CRUSH map。

  • 服务池: 至少一个 CRUSH 层次结构将用于服务池,并且可能用于数据。服务池包括 .rgw.root 和与区关联的服务池。服务池通常位于单个 CRUSH 层次结构下,并使用复制来实现数据持久性。数据池也可能使用 CRUSH 层次结构,但池通常配置有纠删代码以实现数据持久性。
  • 索引: 至少有一个 CRUSH 层次结构 SHOULD 用于索引池,其中 CRUSH 层次结构映射到 SSD 或 NVMe 驱动器等高性能介质。bucket 索引可能会成为性能瓶颈。强烈建议在此 CRUSH 层次结构中使用 SSD 或 NVMe 驱动器。要经济化,请在用于 OSD 日志的 SSD 或 NVMe 驱动器上创建索引分区。另外,索引应该配置有存储桶分片。详情请参阅 创建索引池 和支持链接。
  • 放置池: 每个放置目标的放置池包括 bucket 索引、数据存储桶和 bucket 额外内容。这些池可能属于单独的 CRUSH 层次结构。由于 Ceph 对象网关可以支持多种存储策略,存储策略的存储桶池可能会与不同的 CRUSH 层次结构关联,分别反映不同用例,如 IOPS 优化、吞吐量优化和容量优化。bucket 索引池 SHOULD 使用自己的 CRUSH 层次结构将 bucket 索引池映射到更高性能存储介质,如 SSD 或 NVMe 驱动器。

7.1.1. 创建 CRUSH Roots

从管理节点上的命令行,为各个 CRUSH 层次结构在 CRUSH map 中创建 CRUSH roots。必须 至少有一个 CRUSH 层次结构,用于可能也提供数据存储池的服务池。SHOULD 至少有一个 CRUSH 层次结构用于 bucket 索引池,映射到 SSD 或 NVMe 驱动器等高性能存储介质。

如需有关 CRUSH 层次结构的详细信息,请参见《 红帽 Ceph 存储策略指南》中的 CRUSH 层次结构章节

若要手动编辑 CRUSH map, 请参阅红帽 Ceph 存储策略指南 4 中的编辑 CRUSH map 部分

在以下示例中,名为 data0data1data2 的主机在 CRUSH 映射中使用扩展逻辑名称,如 data0-sas-ssddata0-index 等,因为有多个 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
}

7.1.2. 在 CRUSH map 中使用逻辑主机名

在 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-ssddata2-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 驱动器映射到一个层次结构中。for 示例中的 osd.0osd.3 的 OSD ID 代表使用高吞吐量硬件配置中的 SSD 日志的 SAS 驱动器。以下示例中的 OSD ID 与 OSD ID 不同。

在以下示例中,主机 data2 使用逻辑名称 data2-index 将存储桶索引的 SSD 驱动器映射到第二个层次结构中。以下示例中的 OSD ID osd.4 代表 SSD 驱动器或其他高速存储介质,专门用于存储桶索引池。

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>] 部分中定义 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 存储群集将假设 OSD map 到实际主机名,并且实际的主机名不会在 CRUSH map 中找到,而 Ceph 存储群集客户端将无法找到 OSD 及其数据,则其中一种建议方式不予以使用。

7.1.3. 创建 CRUSH 规则

与默认的 CRUSH 层次结构一样,CRUSH map 也包含默认的 CRUSH 规则。

注意

默认 rbd 池可能会使用这个规则。如果其他池已使用它存储客户数据,请不要删除默认规则。

有关 CRUSH 规则的一般详情,请参见《红帽 Ceph 存储 4 存储策略指南 》中的 CRUSH 规则部分。若要手动编辑 CRUSH map,请参阅红帽 Ceph 存储 4 存储策略指南中的编辑 CRUSH map 部分。

对于每一 CRUSH 层次结构,创建一个 CRUSH 规则。下例演示了 CRUSH 层次结构的规则,该层次结构将存储服务池,包括 .rgw.root。在本例中,根 sas-ssd 用作 CRUSH 主层次结构。它使用名称 rgw-service 来区分其自身与默认规则。step take sas-ssd 行告知池使用创建 CRUSH Root 中创建的 sas-ssd root, 其子存储桶包含带有 SAS 驱动器的 OSD 和高性能存储介质,如 SSD 或 NVMe 驱动器,用于高吞吐量硬件配置中的日志。step chooseleaftype 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 行告知池使用创建 CRUSH Roots 中创建sas-ssd root,其子存储桶包含具有 SAS 驱动器的 OSD 和高性能存储介质,如 SSD 或 NVMe 驱动器。step chooseleaftype 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 故障域。

下例演示了 CRUSH 层次结构的规则,该规则将存储索引池。在本例中,根 index 用作 CRUSH 主层次结构。它使用 rgw-indexrgw-servicergw-throughput 区分。step take index 行告知池使用创建 CRUSH Root 中创建的 index root,其子 存储桶包含高性能存储介质,如 SSD 或 NVMe 驱动器或者 SSD 或 NVMe 驱动器上也存储 OSD 日志的分区。step chooseleaftype 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
}