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

我有一个SSD存储系统,包含两个节点和6个SSD的驱动器。 不理想,所以有一点我会介绍另一个节点。 现在我想要3路复制。

在默认规则下,这不会发生,因为我们只有两个节点。 所以我想我会尝试修改crushmap并为SSD存储节点设置规则集,以在两个节点之间放置数据,第三组可以放在同一节点的另一个OSD上。

作为一个新手,并不完全理解如何choose firstnchooseleaf 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的主机的根types。

这会工作吗? 不知何故,我不认为这是正确的。 我想更好地了解何时使用chooseleaf以及在哪里使用chooseleaf 。 并且在firstn之后更好地理解这个数字。 文档缺乏明确的例子。 读CRUSH白皮书是有道理的,但是伪代码对我来说不是很清楚。 有人可以帮忙吗?

事实certificate,这是OK的。

 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有不同数量的副本,似乎条件正确满足。 在两台主机上至less有3个副本,在2个不同的主机上有2个副本。