我有一个 SSD 存储系统,包含两个节点,每个节点有 6 个 SSD 驱动器。不太理想,所以我会在某个时候引入另一个节点。不过现在我想要三向复制。
根据默认规则,这种情况不会发生,因为我们只有两个节点。因此,我想我会尝试修改 Crushmap 并为 SSD 存储节点设置规则集,以将数据放置在两个节点上,而第三组可以位于同一节点上的另一个 OSD 上。
choose firstn
作为一名新手,我不完全理解和语句的工作原理,chooseleaf firstn
我不确定它是否能按照我的意图完成。
以下是我目前所掌握的信息:
rule ssd-all {
ruleset 1
type replicated
min_size 1
max_size 5
step take ssd
step choose firstn 0 type host
step chooseleaf firstn 2 type osd
step emit
}
其中 ssd 是包含一些主机的根类型,这些主机包含多个(6)OSD。
这样做有用吗?不知何故,我觉得这样不对。我想更好地理解何时使用choose
以及在何处使用chooseleaf
。以及更好地理解后面的数字firstn
。文档缺乏清晰的示例。阅读CRUSH 白皮书有点道理,但伪代码对我来说不太清楚。有人能帮忙吗?
答案1
事实证明还好。
rule ssd-all {
ruleset 1
type replicated
# These lines mean ssd-all will be used when the replica
# count is between 1 & 5 inclusive
min_size 1
max_size 5
# Take the top level pool named 'ssd'
step take ssd
# Choose all host nodes. In my case, there are only 2.
step choose firstn 0 type host
# Choose up to to 2 leaves of type osd.
step chooseleaf firstn 2 type osd
step emit
}
跑步后
crushtool -t crushmap --test --show-statistics --show-mappings --rule 1 --min-x 1 --max-x 10 --num-rep 3
使用 --num-rep 的不同副本数,似乎条件得到正确满足。两台主机上至少有 3 个副本,一台主机上 2 个不同 osd 上最多有 2 个副本。