0

我想知道这两条规则之间的区别:

# rules
rule rack_rule{
 ruleset 0
 type replicated
 min_size 1
 max_size 10
 step take default
 step chooseleaf firstn 0 type rack
 step emit
}

rule 2rack_2host{
 ruleset 0
 type replicated
 min_size 1
 max_size 10
 step take default
 step choose firstn 2 type rack
 step chooseleaf firstn 2 type host
 step emit
}

据我了解,第一条规则 rack_rule 将 rack 作为故障域,因此在每个 PG 中,我们都会有来自不同机架的 osd。例如,如果我有 2 个机架并且复制大小 = 2,我将有一个 PG [osd.1,osd.2],这 2 个 osd 应该来自不同的机架。

在第二条规则中,我认为它应该选择 2 个不同的机架,并且对于每个机架,它将选择 2 个不同的主机。所以,如果我有 2 个机架并且复制大小 = 2,我将有一个 PG [osd.1,osd.2],这 2 个 osd 应该来自不同的机架。

这在理论上是我所理解的,但我在实践中看不到这些预期的结果。使用这两个规则,我在同一个机架中为 PG 在复制大小为 2 的池中设置了 osd

4

1 回答 1

1

你的结论并不完全正确。第一条规则

step take default
step chooseleaf firstn 0 type rack

你确实理解正确。Ceph 将选择size与池参数定义的一样多的机架(在粉碎树中的“默认”根下)。第二条规则有点不同:

step take default
step choose firstn 2 type rack
step chooseleaf firstn 2 type host

Ceph 将在根“默认”下精确选择 2 个机架,然后在每个机架中选择 2 个主机。但是这条规则size = 4不是为 2 设计的。顺便说一句,不要使用size = 2! 如果你使用这个大小为 2 的规则,你最终会得到和你写的完全一样的结果,同一个机架中的两个主机将拥有两个 PG。因此,如果一个机架发生故障,您的 PG 将变为非活动状态,并且客户端将遇到 I/O 错误,直到此问题解决。

有一个工具可以crushtool在实际实施之前测试您的更改,它非常有帮助,试试吧!

于 2021-03-30T09:27:51.467 回答