6.3 编辑 CRUSH Map
要编辑现有的 CRUSH Map,总共分如下4步:
- 获取 CRUSH Map;
- 反编译 CRUSH 图;
- 重编译 CRUSH Map;
- 注入 CRUSH Map。
要激活 CRUSH Map 里某存储池的规则,找到通用规则集编号,然后把它指定到那个规则集。详情参见 1.8 操作 Pool 中调整存储池选项值部分。
1、获取 CRUSH Map
要获取集群的 CRUSH Map,执行命令:
ceph osd getcrushmap -o {compiled-crushmap-filename}
Ceph 将把 CRUSH 输出( -o )到你指定的文件,由于 CRUSH Map 是已编译的,所以编辑前必须先反编译。
2、反编译 CRUSH Map
要反编译 CRUSH Map,执行命令:
crushtool -d {compiled-crushmap-filename} -o {decompiled-crushmap-filename}
Ceph 将反编译( -d )二进制 CRUSH Map,且输出( -o )到你指定的文件。
3、编译 CRUSH Map
要编译 CRUSH Map,执行命令:
crushtool -c {decompiled-crush-map-filename} -o {compiled-crush-map-filename}
Ceph 将把已编译的 CRUSH Map 保存到你指定的文件。
4、注入 CRUSH Map
要把 CRUSH Map 应用到集群,执行命令:
ceph osd setcrushmap -i {compiled-crushmap-filename}
Ceph 将把你指定的已编译 CRUSH Map 注入到集群。
6.4 增加/移动 OSD
要增加或移动在线集群里 OSD 所对应的 CRUSH Map 条目,执行 ceph osd crush set 命令。
ceph osd crush set {id-or-name} {weight} {bucket-type}={bucket-name} [{bucket-type}={bucket-name} ...]
6.5 调整 OSD 的 CRUSH 权重
要调整在线集群中某个 OSD 的 CRUSH 权重,执行命令:
ceph osd crush reweight {name} {weight}
6.6 删除 OSD
要从在线集群里把某个 OSD 彻底踢出 CRUSH Map,或仅踢出某个指定位置的 OSD,执行命令:
ceph osd crush remove {name} {<ancestor>}
6.7 增加桶
要在运行集群的 CRUSH Map 中新建一个桶,用 ceph osd crush add-bucket 命令:
ceph osd crush add-bucket {bucket-name} {bucket-type}
6.8 移动桶
要把一个桶移动到 CRUSH Map 里的不同位置,执行命令:
ceph osd crush move {bucket-name} {bucket-type}={bucket-name} [{bucket-type}={bucket-name} ...]
6.9 删除桶
要把一个桶从 CRUSH Map 的分级结构中删除,可用此命令:
ceph osd crush remove {bucket-name}
注意:从 CRUSH 分级结构里删除时必须是空桶。
6.10 主亲和性
某个 Ceph 客户端读写数据时,总是连接 acting set 里的主 OSD (如 [2, 3, 4]
中, osd.2
是主的)。有时候某个 OSD 与其它的相比并不适合做主 OSD (比如其硬盘慢、或控制器慢)。最大化硬件利用率时为防止性能瓶颈(特别是读操作),你可以调整 OSD 的主亲和性,这样 CRUSH 就尽量不把它用作 acting set 里的主 OSD 了。
ceph osd primary-affinity <osd-id> <weight>
主亲和性默认为 1
(就是说此 OSD 可作为主 OSD )。此值合法范围为 0-1
,其中 0
意为此 OSD 不能用作主的, 1
意为 OSD 可用作主的。此权重 < 1
时, CRUSH 选择主 OSD 时选中它的可能性就较低。