2.8. CRUSH 可调项

Ceph 项目呈指数级增长,带来了许多变化和多项新功能。Ceph 从第一个商业支持的主要版本 v0.48(Argonaut)开始,提供调整 CRUSH 算法某些参数的功能,即,这些设置没有在源代码中强制执行。

需要考虑以下几点:

  • 调整 CRUSH 值可能会导致在存储节点之间切换一些 PG。如果 Ceph 集群已存储大量数据,则需要为要移动的一小部分数据做好准备。
  • ceph-osdceph-mon 守护进程将在新连接收到更新的 map 后立即启动,要求它们具有功能位。但是,已连接的客户端实际上处于伪装中,如果客户端不支持新功能,它们就会行为错误。确保升级 Ceph 存储集群守护进程时,您也会更新 Ceph 客户端。
  • 如果 CRUSH 可调项设置为非传统值,然后随后改回到旧值,则不需要 ceph-osd 守护进程来支持该功能。不过,OSD 对等进程需要检查和了解旧 map。因此,如果集群之前使用非传统 CRUSH 值,则不应运行旧版本的 ceph-osd 守护进程,即使最新版本的 map 已切回到使用旧默认值。

2.8.1. CRUSH 可调项的演变

0.48 之前的 Ceph 客户端和守护进程无法检测到可调项,且与版本 0.48 及更高版本不兼容,您必须升级。调整可调 CRUSH 值的功能也随着主要 Ceph 发行版而得到演进。

传统值

使用 CRUSH Tunables 在较新集群中部署的传统值可能不正确。问题包括:

  • 在 leaf bucket 中含有少量设备的层次结构中,一些 PG 映射到少于所需副本数。对于"主机"节点,每个 OSD 嵌套在下面,通常会发生这种情况。
  • 对于大型集群,一些少量 PG map 到比所需的 OSD 数量更少的 map。当层次结构的多个层面存在时,这更加常见。例如,行、rack、host、osd。
  • 当某些 OSD 标出后,数据往往会重新分发到附近 OSD,而非整个层次结构中。
重要

红帽强烈建议将 Ceph 客户端和 Ceph 守护进程升级到主要的受支持版本,以利用 CRUSH 可调项。红帽建议所有集群守护进程和客户端使用相同的发行版本。

argonaut(Legacy)

这是第一个受商业支持的 Ceph 版本。

  • 版本要求:

    • Ceph 0.48、0.49 及更新的版本
    • Linux 内核 3.6 或更高版本,包括 RBD 内核客户端
  • 支持的 CRUSH 可调项:

    • select_local_tries :本地重试次数。传统值为 2,最佳值为 0。
    • select_local_fallback_tries:Le gacy 值为 5,优化值为 0。
    • select_total_tries: 尝试选择一个项目的总次数。传统值为 19,后续测试表明值 50 更适合典型的集群。对于非常大的集群,可能需要一个更大的值。

Bobtail

  • 版本要求:

    • Ceph 0.55、0.56.x 及更新的版本
    • Linux 内核 3.9 或更高版本,包括 RBD 内核客户端
  • 支持的 CRUSH 可调项:

    • selectleaf_descend_once :无论递归选手尝试是重试还是仅尝试一次,并且仅允许原始放置重试。传统默认值为 0,优化值为 1。

Firefly

这是第一个红帽支持的 Ceph 版本。

  • 版本要求:

    • Red Hat Ceph Storage 1.2.3 及更新的版本
    • Red Hat Enterprise Linux 7.1 或更高版本,包括 RBD 内核客户端
  • 支持的 CRUSH 可调项:

    • selectleaf_vary_r :是否递归选择leaf 尝试以 r 的非零值开头,具体取决于父进程已经进行的尝试数。传统默认值为 0,但使用这个值时 CRUSH 有时无法找到映射。就计算成本和正确性而言,最佳价值是 1。但是,对于具有大量现有数据的传统群集,从 0 更改为 1 将导致大量数据移动;值 4 或 5 将允许 CRUSH 查找有效的映射,但移动较少的数据。
    • straw_calc_version :在 straw bucket 的 CRUSH map 中计算并存储了内部权重存在一些问题。具体来说,当有 CRUSH 权重为 0 或两者兼有权重的项目时,CRUSH 会将数据分发错误,即不与权重成比例。0 的值保留旧的、损坏的内部权重计算;值 1 修复行为。将 straw_calc_version 设置为 1,然后调整 straw bucket,方法是添加、删除、重新加权项目,或者通过使用 reweight-all 命令,如果集群遇到问题条件之一,则可以触发少量到中等数量的数据移动。此可调项选项很特殊,因为它对客户端所需的内核版本绝对没有影响。

hammer

hammer 可调项配置文件仅通过更改可调配置文件来影响现有 CRUSH map 的映射,但现在支持新 bucket 类型 straw2

  • 版本要求:

    • Red Hat Ceph Storage 1.3 及更新的版本
    • Red Hat Enterprise Linux 7.1 或更高版本,包括 RBD 内核客户端
  • 新 Bucket 类型:

    • 新的 straw2 bucket 类型修复了原始 straw bucket 中的几个限制。具体来说,旧的 straw bucket 会更改调整权重时应更改的一些映射,而 straw2 bucket 的原始目标则是仅更改与权重已更改的 bucket 项的映射或更改。straw2 bucket 是任何新创建的 bucket 的默认 bucket。将 bucket 类型从 straw 改为 straw2 将导致数量相对少的数据移动量,具体取决于 bucket 项权重之间的不同程度。当权重相同时,不会移动任何数据,当项目权重有显著变化时,移动度也会更多。

jewel

Red Hat Ceph Storage 2 在 Red Hat Enterprise Linux 7.2 或更高版本上被支持,但只有 Red Hat Enterprise Linux 7.3 或更高版本支持 jewel 可调项配置集。jewel 可调项配置文件改进了 CRUSH 的整体行为,因此当 OSD 签出集群时,它会显著减少映射更改。

  • 版本要求:

    • Red Hat Ceph Storage 2 及更新的版本
    • 红帽企业 Linux 7.3 或更高版本,包括 RBD 内核客户端和 CephFS 内核客户端
  • 支持的 CRUSH 可调项:

    • selectleaf_stable :递归选择leaf 尝试是否将对内环使用更好的值,从而在 OSD 标出时显著减少映射更改数量。传统值为 0,而 1 的新值则使用新方法。在现有集群上更改此值将导致大量数据移动,因为几乎所有 PG map 都可能会改变。

2.8.2. 调优 CRUSH

在您调优 CRUSH 之前,您应该确保所有 Ceph 客户端和所有 Ceph 守护进程都使用相同的版本。如果您最近升级了,请确保已重启守护进程并重新连接了客户端。

调整 CRUSH 可调项的最简单方法是更改为已知的配置文件。这些是:

  • 传统 :来自 v0.47(Argonaut 前)和更早版本的旧行为。
  • Argonaut: v0.48(Argonaut)版本支持的旧值。
  • Bob tail :v0.56(Bobtail)版本支持的值。
  • Firefly :v0.80(Firefly)版本支持的值。
  • hammer :v0.94(Hammer)发行版本所支持的值。
  • jewel :v10.0.2(Jewel)发行版本支持的值。
  • Best :当前的最佳值。
  • 默认值 :新集群的当前默认值。

您可以使用以下命令在正在运行的集群中选择配置集:

# ceph osd crush tunables <profile>
注意

这可能导致某些数据移动。

通常,您应该在升级后或者收到警告时设置 CRUSH 可调项。从版本 v0.74 开始,如果 CRUSH 可调项未设置为其最佳值,Ceph 将发出健康警告,优化值是 v0.73 的默认值。要使此警告消失,有两个选项:

  1. 调整现有群集上的 可调项。请注意,这将导致一些数据移动(可能多达 10%)。这是首选的路由,但在数据移动可能会影响性能的生产集群上应小心。您可以通过以下方法启用最佳可调项:

    # ceph osd crush tunables optimal

    如果事情进展较差(例如,负载过大),或者出现了客户端兼容性问题(旧的内核 cephfs 或 rbd 客户端,或预 Bbtail librados 客户端),您可以切回到较早的配置集:

    # ceph osd crush tunables <profile>

    例如,要恢复 pre-v0.48(Argonaut)值,请执行:

    # ceph osd crush tunables legacy
  2. 您可以通过向 ceph.conf 文件的 [mon] 部分添加以下选项,使警告退出而不对 CRUSH 进行任何更改:

    mon warn on legacy crush tunables = false

    要使更改生效,重启 monitor,或者应用 选项来运行 monitor:

    # ceph tell mon.\* injectargs --no-mon-warn-on-legacy-crush-tunables

2.8.3. 调优 CRUSH,硬方式

如果可以确保所有客户端都运行最新的代码,您可以通过提取 CRUSH map、修改值并将它重新注入到集群中来调整可调项。

  • 提取最新的 CRUSH map:

    ceph osd getcrushmap -o /tmp/crush
  • 调整可调项.这些值似乎为我们测试的大型和小型集群提供最佳行为。您还需要为 crushtool 指定 --enable-unsafe-tunables 参数才能 执行此操作。请谨慎使用这个选项:

    crushtool -i /tmp/crush --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 -o /tmp/crush.new
  • 重新注入修改的映射:

    ceph osd setcrushmap -i /tmp/crush.new

2.8.4. 传统值

为便于参考,可使用以下方法设置 CRUSH 可调项的旧值:

crushtool -i /tmp/crush --set-choose-local-tries 2 --set-choose-local-fallback-tries 5 --set-choose-total-tries 19 --set-chooseleaf-descend-once 0 --set-chooseleaf-vary-r 0 -o /tmp/crush.legacy

再强调一下,需要使用特殊的 --enable-unsafe-tunables 选项。此外,如上所述,在还原旧值后,请小心运行 ceph-osd 守护进程的旧版本,因为功能位没有被完全强制实施。