2.5. CRUSH 权重
CRUSH 算法为每个 OSD 设备分配一个 太字节(按惯例)的权重值,旨在为写入请求分配新数据对象到 PG 和 PG 到 OSD 的写入请求。因此,作为最佳实践,我们建议使用相同类型和大小的设备创建 CRUSH 层次结构,并分配相同的权重。我们还建议使用具有相同 I/O 和吞吐量的设备,这样您也会在 CRUSH 层次结构中具有统一的性能特征,即使性能特性不会影响数据分发。
由于使用统一硬件并不现实,因此您可以纳入不同大小的 OSD 设备并使用相对权重,以便 Ceph 将更多数据分发到较大的设备,并将数据更小到较小的设备。
2.5.1. 设置 OSD 的 CRUSH 权重
要在 CRUSH map 中的 Terabytes 中设置 OSD CRUSH 权重,请执行以下命令
ceph osd crush reweight _NAME_ _WEIGHT_
其中:
- name
- 描述
- OSD 的全名。
- 类型
- 字符串
- 必需
- 是
- 示例
-
osd.0
- Weight
- 描述
-
OSD 的 CRUSH 权重。这应该是 Terabytes 中的 OSD 的大小,其中
1.0
为 1 TB。 - 类型
- 双
- 必填
- 是
- 示例
-
2.0
此设置用于创建 OSD 或在添加 OSD 后立即调整 CRUSH 权重。它通常不会更改 OSD 生命周期。
2.5.2. 设置 Bucket 的 OSD Weights
使用 ceph osd crush reweight
可能非常耗时。您可以通过执行以下内容来设置(或重置)存储桶下的所有 Ceph OSD 权重(row、rack 和 node 等):
语法
osd crush reweight-subtree NAME
其中,
name
是 CRUSH bucket 的名称。
2.5.3. 设置 OSD 的 in
权重
对于 ceph osd in
和 ceph osd out
,一个 OSD 为 in
集群,或 out
集群。这是 monitor 如何记录 OSD 的状态。但是,尽管一个 OSD 为 in
集群,它可能遇到了一个故障情况,在出现这种情况下,您不应该完全依赖它,直到相关的问题被解决(例如,替换存储驱动器、更改控制器等)。
您可以通过执行以下操作为为一个特定的 OSD 增加或减少 in
权重(无需改变它在 Terabytes 中的权重):
语法
ceph osd reweight ID WEIGHT
其中:
-
ID
是 OSD 号。 -
weight
是 0.0-1.0 的一个范围,其中0
代表不是in
集群(也就是说,没有分配给它的 PG),1.0 代表为in
集群(即OSD 接收与其他 OSD 相同的 PG 数量)。
2.5.4. 根据使用率设置 OSD 权重
CRUSH 的设计旨在对将新数据对象 PG 和 PG 分配给 OSD 的写入请求大约一种统一的概率分布。但是,集群可能会变为不平衡。这样做的原因有很多。例如:
- 多个池: 您可以将多个池分配给 CRUSH 层次结构,但池可能具有不同的放置组数量、大小(用于存储的副本数)和对象大小特征。
-
自定义客户端: Ceph 客户端(如块设备、对象网关和文件系统)共享来自其客户端的数据,并将数据作为对象条带化,就像统一较小的 RADOS 对象一样。因此,除了忘记的场景外,CRUSH 通常达到其目标。但是,还有另一个情况,集群可能会变为 imbalanced:即,使用
librados
存储数据而无需规范化对象大小。这种情境可能会导致集群不平衡(例如,存储 100 1 MB 对象和 10 4 MB 对象),使得一些 OSD 的数据比其他 OSD 更多的数据。 - Probability: 统一分布将导致一些 OSD 带有更多 PG,一些 OSD 有更少的 PG。对于有大量 OSD 的集群,统计外部会进一步推出。
您可以通过执行以下命令来重新加权 OSD:
语法
ceph osd reweight-by-utilization [THRESHOLD_] [WEIGHT_CHANGE_AMOUNT] [NUMBER_OF_OSDS] [--no-increasing]
示例
[ceph: root@host01 /]# ceph osd test-reweight-by-utilization 110 .5 4 --no-increasing
其中:
-
阈值
是利用率百分比,使得 OSD 面临更高的数据存储负载将收到较低的权重,从而减少分配给它们的 PG。默认值为120
,反映 120%。100+
的任何值都是有效的阈值。可选。 -
weight_change_amount
是更改权重的数量。有效值大于0.0 - 1.0。
默认值为0.05
。可选。 -
number_of_OSDs
是重新加权的最大 OSD 数量。对于大型集群,将 OSD 数量限制为重新加权可防止大量重新平衡。可选。 -
no-increasing
默认为 off。在使用reweight-by-utilization
或test-reweight-utilization
命令时允许增加 osd 权重。如果此选项与这些命令搭配使用,它会防止 OSD 权重增加,即使 OSD 未被充分利用。可选。
建议使用 重新加权使用
,对于大型集群来说,最好有可能性。利用率可能会随时间变化,随着集群大小或硬件的变化,可能需要更新权重来反映更改的利用率。如果您选择通过使用率重新加权,则可能需要在利用率、硬件或集群大小发生变化时重新运行该命令。
执行这个命令或其他权重命令会覆盖由这个命令分配的权重(例如,osd reweight-by-utilization
, osd crush weight
, osd weight
, in
或 out
)。
2.5.5. 根据 PG 分发设置 OSD 的 Weight
在具有较少 OSD 的 CRUSH 层次结构中,一些 OSD 可能会获得比其他 OSD 更多的 PG,从而导致负载更高。您可以通过执行以下操作来重新加权 OSD 来应对这种情况:
语法
osd reweight-by-pg POOL_NAME
其中:
-
POOLNAME
是池的名称。Ceph 将检查池如何为 OSD 分配 PG 以及根据这个池的 PG 分发来重新加权 OSD。请注意,可以将多个池分配到相同的 CRUSH 层次结构。根据一个池的分发,重新加权 OSD 可能会对分配给同一 CRUSH 层次结构的其他池具有意外的影响(如果它们没有相同的大小(副本数)和 PG。
2.5.6. 重新计算 CRUSH Tree 的权重
CRUSH 树 bucket 应当是其叶权重的总和。如果手动编辑 CRUSH map 权重,您应该执行下列命令,以确保 CRUSH bucket 树准确反映 bucket 下叶 OSD 的总和。
语法
osd crush reweight-all