HOWTO 测试 Ceph crush 规则
crushtool 工具可用于在将其应用于集群之前测试 Ceph crush 规则。
$ crushtool --outfn crushmap --build --num_osds 10 \ host straw 2 rack straw 2 default straw 0
id weight type name reweight
-9 10 default default -6 4 rack rack0 -1 2 host host0 0 1 osd.0 1 1 1 osd.1 1 -2 2 host host1 2 1 osd.2 1 3 1 osd.3 1 -7 4 rack rack1 -3 2 host host2 4 1 osd.4 1 5 1 osd.5 1 -4 2 host host3 6 1 osd.6 1 7 1 osd.7 1 -8 2 rack rack2 -5 2 host host4 8 1 osd.8 1 9 1 osd.9 1
从头开始创建 crushmap(–build)。它假定有 10 个可用的 OSD(–num_osds 10)。然后将两个 OSD 放置在每个主机中(host straw 2)。生成的宿主机(五个)然后被放置在机架中,每个机架最多两个(rack straw 2)。所有机架都放置在默认根目录中(这就是零的含义:所有机架)(default straw 0)。最后一个机架只有一个主机,因为可用的主机数量是奇数。
要测试的 crush 规则可以注入到 crushmap 中,使用
crushtool --outfn crushmap --build --num_osds 10 host straw 2 rack straw 2 default straw 0 crushtool -d crushmap -o crushmap.txt cat >> crushmap.txt <<EOF rule myrule { ruleset 1 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 } EOF crushtool -c crushmap.txt -o crushmap
此 crushmap 应该能够提供两个 OSD(例如,用于放置组),并且可以使用 –test 选项进行验证。
$ crushtool -i crushmap --test --show-statistics --rule 1 --min-x 1 --max-x 2 --num-rep 2 rule 1 (myrule), x = 1..2, numrep = 2..2 CRUSH rule 1 x 1 [0,2] CRUSH rule 1 x 2 [7,4] rule 1 (myrule) num_rep 2 result size == 2: 2/2
–rule 1 指定注入的规则。–rule 0 是默认规则,默认情况下会创建该规则。x 可以被认为是用于检索 OSD 的放置组的唯一名称。–min-x 1 –max-x 2 将 x 的值从 1 更改为 2,因此仅尝试该规则两次。–min-x 1 –max-x 2048 将创建 2048 行。每行显示规则编号后的 x 值。在 rule 1 x 2 中,1 是规则编号,而 2 是 x 的值。最后一行显示,对于所有 x 值(2/2,即 x 的 2 个值中的 2 个),当要求提供 2 个 OSD 时(num_rep 2),crush 规则能够提供 2 个(result size == 2)。
如果要求提供 4 个 OSD,则相同的 crush 规则可能会失败,因为它几乎没有足够的资源来满足要求。
$ crushtool -i crushmap --test --show-statistics --rule 1 --min-x 1 --max-x 2 --num-rep 4 rule 1 (myrule), x = 1..2, numrep = 4..4 CRUSH rule 1 x 1 [0,2,9] CRUSH rule 1 x 2 [7,4,1,3] rule 1 (myrule) num_rep 4 result size == 3: 1/2 rule 1 (myrule) num_rep 4 result size == 4: 1/2
结尾的统计信息显示,其中一个映射失败了:result size == 3 低于所需的数量 num_rep 4。如果要求提供的 OSD 比规则能够提供的更多,则该规则始终会失败。
crushtool -i crushmap --test --show-statistics --rule 1 --min-x 1 --max-x 2 --num-rep 5 rule 1 (myrule), x = 1..2, numrep = 5..5 CRUSH rule 1 x 1 [0,2,9] CRUSH rule 1 x 2 [7,4,1,3] rule 1 (myrule) num_rep 5 result size == 3: 1/2 rule 1 (myrule) num_rep 5 result size == 4: 1/2
可以在 Ceph 源代码的 crushtool 目录中找到 crushtool 用法的更多示例。