【问题标题】:Understanding the mechanism of crush rule in ceph了解ceph中crush规则的机制
【发布时间】:2021-03-19 19:48:16
【问题描述】:

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

# 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 中,我们都会有来自不同 rack 的 osd。例如,如果我有 2 个机架且复制大小 = 2,我将有一个 PG [osd.1,osd.2],这 2 个 osd 应该来自不同的机架。

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

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

【问题讨论】:

    标签: linux ceph cephfs crush cephadm


    【解决方案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 错误,直到此问题解决。

    有一个名为crushtooltool 可以在实际实施之前测试您的更改,非常有用,试试吧!

    【讨论】:

    • 嘿,非常感谢您的回答,我现在回来了,拥有更好的 ceph 知识,我试验了该工具并创建了许多规则,并查看了它们在真实集群上的工作方式。因此,就像您在第二条规则中所说的那样,将选择 2 个机架,并从每个机架中选择 2 个主机。这适用于复制大小 4 甚至 3,因为 ceph 将忽略第 4 个主机
    • 如果您有两个机架并且故障域也是机架,请不要使用size = 3。想想一个机架有一个副本,另一个机架有两个。如果带有两个副本的机架出现故障,您将只剩下一个“好”副本。当故障机架恢复时,它有两个较旧的 PG 副本和只有一个当前版本,这可能会导致数据损坏,因为正确的版本可能会被覆盖。这也是不使用 size = 2 的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多