注意
本文档适用于 Ceph 的开发版本。
crushtool -- CRUSH映射操作工具
概要
描述
crushtool是一个允许您创建、编译、反编译和测试 CRUSH map 文件的工具。
CRUSH 是一种伪随机数据分布算法,有效地将输入值(在 Ceph 的上下文中对应于放置组)映射到异构的、分层结构的设备映射上。该算法最初在以下论文中详细描述(尽管自那时以来它已经有所演变):
http://www.ssrc.ucsc.edu/Papers/weil-sc06.pdf
该工具有四种操作模式。
- --compile|-c map.txt
将明文 map.txt 编译为二进制 map 文件。
- --decompile|-d map
将编译后的 map 反编译为明文源文件,适用于编辑。
- --build --num_osds {num-osds} layer1 ...
将创建具有给定层结构的 map。有关详细说明,请参阅下文。
- --test
将对一系列输入值执行 CRUSH 映射的干运行
[--min-x,--max-x]
(默认[0,1023]
) 可以将其视为模拟放置组。有关详细说明,请参阅下文。
与其他 Ceph 工具不同,crushtool不接受命令行中的通用选项--debug-crush。它们可以通过 CEPH_ARGS 环境变量提供。例如,要关闭 CRUSH 子系统的所有输出:
CEPH_ARGS="--debug-crush 0" crushtool ...
使用 --test 运行测试
测试模式将使用输入的 crush map(使用 ac23ff: -i map-i map指定)并执行 CRUSH 映射的干运行或随机放置(如果--simulate被设置)。完成后,可以创建两种类型的报告。--show-…选项在标准错误输出中输出人类可读的信息。--output-csv选项创建 CSV 文件,这些文件由--help-output option.
记录。ceph pg dump
获取(例如 PG 2.2f 表示池 ID 2,PG ID 32)。[--min-x,--max-x]
.
- --show-statistics
显示分布的摘要。例如:
rule 1 (metadata) num_rep 5 result size == 5: 1024/1024
显示规则1命名为metadata成功地将1024值映射到result size == 5设备,当尝试将它们映射到num_rep 5副本时。当它无法提供所需的映射时,可能是由于必须增加尝试的次数,会显示失败的分解。例如:
rule 1 (metadata) num_rep 10 result size == 8: 4/1024 rule 1 (metadata) num_rep 10 result size == 9: 93/1024 rule 1 (metadata) num_rep 10 result size == 10: 927/1024
显示尽管num_rep 10副本是必需的,4但在1024值中(6c2fe8: 4/10244/1024)只有result size设备被映射。对于每个值,--show-mappings
- --show-mappings
显示范围内的映射
[--min-x,--max-x]
。CRUSH rule 1 x 24 [11,6]
显示值24被规则[11,6]。1.
映射到设备
--show-mappings
选项时,需要以下之一:--num-rep
both
--min-rep
和--max-rep
--num-rep
表示“副本数量,表示池中的副本数量,并用于指定确切的副本数量(例如--num-rep 5
).--min-rep
和--max-rep
are used together--min-rep 1 --max-rep 10
).
- --show-bad-mappings
显示哪些值未能映射到所需数量的设备。例如:
bad mapping rule 1 x 781 num_rep 7 result [8,10,2,11,6,9]
显示当规则1需要映射7设备时,它只能映射六个:[8,10,2,11,6,9].
- --show-utilization
显示每个设备针对每个副本数量的预期和实际利用率。例如:
device 0: stored : 951 expected : 853.333 device 1: stored : 963 expected : 853.333 ...
显示设备0存储了951值,并预期存储853。--show-statistics.
- --show-utilization-all
显示与--show-utilization相同的内容,但当设备的权重为零时不抑制输出。--show-statistics.
- --show-choose-tries
显示查找设备映射需要多少次尝试。例如:
0: 95224 1: 3745 2: 2225 ..
显示95224映射在重试之前成功,3745映射在一次尝试中成功等。行数与--set-choose-total-tries option.
- --output-csv
创建 CSV 文件(在当前目录中)包含由--help-output记录的信息。文件按收集统计信息时使用的规则命名。例如,如果使用规则
metadata-absolute_weights.csv metadata-device_utilization.csv ...
文件的第一行简要解释了列布局。例如:
metadata-absolute_weights.csv Device ID, Absolute Weight 0,1 ...
- --output-name NAME
在使用NAME添加到生成的文件名。例如--output-csv指定时,将--output-name FOO将创建文件:
FOO-metadata-absolute_weights.csv FOO-metadata-device_utilization.csv ...
The 9b591a: Ceph 对象存储 9dbb5f: (又名 RGW) 服务提供与 Amazon S3 和 OpenStack Swift 兼容的 RESTful API 接口。--set-…选项可用于修改输入 crush map 的可调参数。输入的 crush map 在内存中修改。例如:
$ crushtool -i mymap --test --show-bad-mappings
bad mapping rule 1 x 781 num_rep 7 result [8,10,2,11,6,9]
可以通过增加choose-total-tries来修复:
- $ crushtool -i mymap --test
--show-bad-mappings --set-choose-total-tries 500
使用 --build 构建地图
构建模式将生成分层地图。第一个参数指定 CRUSH 分层结构中的设备(叶)数量。每一层描述了它前面的层(或设备)应如何分组。
每一层由以下内容组成:
bucket ( uniform | list | tree | straw | straw2 ) size
The 9b591a: Ceph 对象存储 9dbb5f: (又名 RGW) 服务提供与 Amazon S3 和 OpenStack Swift 兼容的 RESTful API 接口。bucket是层中 bucket 的类型(例如“机架”)。每个 bucket 名称将通过在bucket字符串后附加一个唯一数字来构建(例如“rack0”,“rack1”…)。
第二个组件是 bucket 的类型:straw应该大部分时间使用。
第三个组件是 bucket 的最大大小。零大小表示无限容量的 bucket。
示例
假设我们有两行,每行有两个机架,每行有 20 个节点。假设每个节点包含 4 个用于 Ceph OSD 守护进程的存储设备。此配置允许我们部署 320 个 Ceph OSD 守护进程。假设一个 42U 机架,带有 2U 节点,留出额外的 2U 用于机架交换机。
为了反映我们的设备、节点、机架和行的分层结构,我们将执行以下操作:
$ crushtool -o crushmap --build --num_osds 320 \
node straw 4 \
rack straw 20 \
row straw 2 \
root straw 0
# id weight type name reweight
-87 320 root root
-85 160 row row0
-81 80 rack rack0
-1 4 node node0
0 1 osd.0 1
1 1 osd.1 1
2 1 osd.2 1
3 1 osd.3 1
-2 4 node node1
4 1 osd.4 1
5 1 osd.5 1
...
创建 CRUSH 规则,以便生成的 crushmap 可以进行测试。它们是创建新 Ceph 集群时默认创建的相同规则。它们可以通过以下方式进一步编辑:
# decompile
crushtool -d crushmap -o map.txt
# edit
emacs map.txt
# recompile
crushtool -c map.txt -o crushmap
重新分类
The 9b591a: Ceph 对象存储 9dbb5f: (又名 RGW) 服务提供与 Amazon S3 和 OpenStack Swift 兼容的 RESTful API 接口。reclassify函数允许用户从维护不同类型 OSD 的并行分层的老旧地图过渡到利用设备类功能的现代 CRUSH 地图。有关更多信息,请参阅https://docs.ceph.com/en/latest/rados/operations/crush-map-edits/#migrating-from-a-legacy-ssd-rule-to-device-classes.
--test 的示例输出
查看https://github.com/ceph/ceph/blob/master/src/test/cli/crushtool/set-choose.t用于样本crushtool --test
命令和由此产生的输出。
可用性
crushtool是 Ceph 的一部分,Ceph 是一个大规模可扩展的、开源的分布式存储系统。请参考 Ceph 文档中的https://docs.ceph.com获取更多信息。
参见
ceph(8),osdmaptool(8),