为了把这件事说清楚,我们需要了解 CRUSH map 一些具体规则,所以先来看一下默认的 CRUSH map。
$ ceph -s
...
data:
pools: 1 pools, 64 pgs
objects: 0 objects, 0 bytes
usage: 25001 MB used, 130 TB / 130 TB avail
pgs: 64 active+undersized
2. 修改 CRUSH map
了解到问题所在,接下来就动手修改吧,CRUSH map 支持两种修改方式,一种是命令行,优点是单条命令很简单,缺点是不够直观;第二种是手动修改配置文件,优点是所见即所得,缺点是麻烦一点,需要先导出,解码,修改,最后再编码,导入。这里因为修改的内容颇为具体,所以采用第二种方法。
然后解码,并输出到文件 crush-map-decompiled 中。
$ crushtool -d crush-map -o crush-map-decompiled
将改好的文件编码到文件 crush-map 中。
$ crushtool -c crush-map-decompiled -o crush-map
不过事情没有那么简单,还需要配合 ceph.conf 的修改才行,我们要修改 osd_crush_chooseleaf_type。
这个参数每个取值的意义在 Ceph 的官方文档中,有明确的说明,0 是给单节点的 ceph 集群使用的,而 1 是默认值,所以我们需要修改。
#Choose a reasonable crush leaf type.
#0 for a 1-node cluster.
#1 for a multi node cluster in a single rack
#2 for a multi node, multi chassis cluster with multiple hosts in a chassis
#3 for a multi node cluster with hosts across racks, etc.
osd crush chooseleaf type = {n}
4. 动态修改 ceph 配置
至此问题还是没有完全解决,原因是配置文件的变动需要,进程的重启才能生效,不重启有没有办法让改动生效呢?有的,需要使用的 ceph daemon 命令。
sudo ceph daemon mon.rbd-master1 config set osd_pool_default_size 0