在双节点集群上将 CRUSHMAP 设置为 3 路

在双节点集群上将 CRUSHMAP 设置为 3 路

我有一个 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 个副本。

相关内容