Ceph建立纠删码池时PG出现creating+incomplete

想测试下纠删码,所以照着官网上的步骤执行了下.

ceph osd pool create ecpool 12 12 erasure
pool ‘ecpool’ created
echo ABCDEFGHI | rados –pool ecpool put NYAN -
$ rados –pool ecpool get NYAN -
ABCDEFGH

但是到第二步就写不进去了。自己设定一个erasure-code-profile也不行。用ceph -s 之后发现,新建的12个pg一直处于creating+incomplete的状态。

因为默认的纠删码参数是k=2,m=1。设定的ruleset-failure-domain=osd。而我们实验的集群正好是3个osd。猜测可能是osd不够,又加了一个osd还是不行。如图。
Ceph建立纠删码池时PG出现creating+incomplete_第1张图片

后来在网上搜了一大圈也没找到解决办法,就在官网找。找到了一篇PG出问题的文章,里面有提到建纠删码池时可能会出现的几个问题。

ERASURE CODED PGS ARE NOT ACTIVE+CLEAN

找到了问题出在crush map中,我们这个集群都是在一台服务器中,所以crushmap中纠删码的ruleset就不能设成host,而应该改成osd。

这就需要对crushmap进行修改。首先可以使用下面命令查看下crush map:

$ ceph osd crush dump

修改crushmap 会用到crush-tool。

  • 得到集群的crush map

$ ceph osd getcrushmap -o {compiled-crushmap-filename}

例如:

$ ceph osd getcrushmap -o crush.map

  • 用crush-tool反编译crush map

$ crushtool -d {compiled-crushmap-filename} -o {decompiled-crushmap-filename}

例如:

$ crushtool -d crush.map -o crush.txt

  • 用vim修改crushmap的相应项

官网的介绍中可以用命令改,例如:

step set_choose_tries 100

是将这条语句加到ruleset中。
- 编译修改后的crushmap

crushtool -c {decompiled-crush-map-filename} -o {compiled-crush-map-filename}

例如:

$ crushtool –compile crush.txt -o better-crush.map

  • 设定crushmap

将curshmap应用到集群中:

$ ceph osd setcrushmap -i {compiled-crushmap-filename}

例如:

$ ceph osd setcrushmap -i better-crush.map

至此crushmap就修改完毕了。再查看集群状态,发现PG已经建好了。
Ceph建立纠删码池时PG出现creating+incomplete_第2张图片

再用纠删码池读写文件就没有问题了。

你可能感兴趣的:(ceph)