2.8. CRUSH 可调项
Ceph 项目呈指数级增长,带来了许多变化和多项新功能。Ceph 从第一个商业支持的主要版本 v0.48(Argonaut)开始,提供调整 CRUSH 算法某些参数的功能,即,这些设置没有在源代码中强制执行。
需要考虑以下几点:
- 调整 CRUSH 值可能会导致在存储节点之间切换一些 PG。如果 Ceph 集群已存储大量数据,则需要为要移动的一小部分数据做好准备。
-
ceph-osd和ceph-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:Legacy 值为 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 类型:
-
新的
straw2bucket 类型修复了原始 straw bucket 中的几个限制。具体来说,旧的 straw bucket 会更改调整权重时应更改的一些映射,而 straw2 bucket 的原始目标则是仅更改与权重已更改的 bucket 项的映射或更改。straw2bucket 是任何新创建的 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>
# ceph osd crush tunables <profile>
这可能导致某些数据移动。
通常,您应该在升级后或者收到警告时设置 CRUSH 可调项。从版本 v0.74 开始,如果 CRUSH 可调项未设置为其最佳值,Ceph 将发出健康警告,优化值是 v0.73 的默认值。要使此警告消失,有两个选项:
调整现有群集上的 可调项。请注意,这将导致一些数据移动(可能多达 10%)。这是首选的路由,但在数据移动可能会影响性能的生产集群上应小心。您可以通过以下方法启用最佳可调项:
ceph osd crush tunables optimal
# ceph osd crush tunables optimalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果事情进展较差(例如,负载过大),或者出现了客户端兼容性问题(旧的内核 cephfs 或 rbd 客户端,或预 Bbtail librados 客户端),您可以切回到较早的配置集:
ceph osd crush tunables <profile>
# ceph osd crush tunables <profile>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,要恢复 pre-v0.48(Argonaut)值,请执行:
ceph osd crush tunables legacy
# ceph osd crush tunables legacyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以通过向
ceph.conf文件的[mon]部分添加以下选项,使警告退出而不对 CRUSH 进行任何更改:mon warn on legacy crush tunables = false
mon warn on legacy crush tunables = falseCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要使更改生效,重启 monitor,或者应用 选项来运行 monitor:
ceph tell mon.\* injectargs --no-mon-warn-on-legacy-crush-tunables
# ceph tell mon.\* injectargs --no-mon-warn-on-legacy-crush-tunablesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.8.3. 调优 CRUSH,硬方式 复制链接链接已复制到粘贴板!
如果可以确保所有客户端都运行最新的代码,您可以通过提取 CRUSH map、修改值并将它重新注入到集群中来调整可调项。
提取最新的 CRUSH map:
ceph osd getcrushmap -o /tmp/crush
ceph osd getcrushmap -o /tmp/crushCopy to Clipboard Copied! Toggle word wrap Toggle overflow 调整可调项.这些值似乎为我们测试的大型和小型集群提供最佳行为。您还需要为
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
crushtool -i /tmp/crush --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 -o /tmp/crush.newCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新注入修改的映射:
ceph osd setcrushmap -i /tmp/crush.new
ceph osd setcrushmap -i /tmp/crush.newCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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
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 守护进程的旧版本,因为功能位没有被完全强制实施。