精读笔记(RHCA 英文教材)· CL260 Chapter 5 Creating and Customizing Storage Maps
大约 7 分钟
精读笔记(RHCA 英文教材)· CL260 Chapter 5 Creating and Customizing Storage Maps
教材原文:RHCA 官方英文教材(PDF 第 167~202 页)(OCR 整书版已从本站移除,本页为章节精读) 关联知识:Ch1(CRUSH/PG 原理)、Ch4(建池用 rule);
00-RHCA教材精读-导航与学习法.md
Chapter Goal / Objectives(原文+译)
- GOAL: Create and customize the CRUSH map and OSD map(构建并定制 CRUSH 图与 OSD 图).
- OBJECTIVES: ① 管理与定制 CRUSH map(层次/规则/权重/tunables);② 管理 OSD map(epoch、备份、用 osdmaptool 预演改动)。
- 结构:两个 Section + 各自 Guided Exercise + 章末 Lab(
lab grade map-review)。
5.1 Managing and Customizing the CRUSH Map
CRUSH 层次与 bucket
- CRUSH map=bucket 树(OSD 是叶子)+ 至少一条 rule。bucket=树上的容器/分支,用负数 ID(正数 ID 是 OSD)。
- 内置 bucket 类型:
root, region, datacenter, room, pod, pdu, row, rack, chassis, host,也可自定义类型;根必须是root类型。 - bucket 选择算法:
uniform / list / tree / straw2(性能与再组织效率的折衷),默认 straw2。 - 定制 CRUSH 的两大动机:failure domain(把副本放到不同 host/rack/机架/电源域 → 单点故障不停服,只进 degraded 状态)与 performance domain(HDD/SSD/NVMe 分树、VM 块存储与对象存储分层、“热/冷”数据分池)。
- 设备类(device class):OSD 自动识别 hdd/ssd/nvme 类;pool/rule 可按 class 选择(如 EC profile 的
crush-device-class=ssd)。
常用 CRUSH 命令
ceph osd crush dump # CRUSH map JSON(含 bucket 类型/规则)
ceph osd crush tree # 树形视图
ceph osd crush add-bucket rack3 rack # 加空 bucket(rack 型)
ceph osd crush move rack1 root=default-cl260 # 把 bucket 挂到某位置(建层次)
ceph osd crush move hostc rack=rack1
ceph osd crush set osd.1 1.0 root=default-cl260 rack=rack1 host=hostc # 把 OSD 作为叶子放进指定位置
ceph osd crush reweight osd.1 0.5 # 调 OSD 权重
ceph osd crush reweight-all # 手工改权重后重建桶权重=叶子之和
ceph osd crush show-tunables # 查看 tunables
ceph osd crush rule ls / dump # 列/查规则
ceph osd crush rule create-replicated NAME ROOT TYPE # 建副本规则
ceph osd crush rm NAME / ceph osd crush remove osd.N # 删除- 默认每 OSD 会被
ceph-crush-location自动放到root=default host=<hostname>;可用crush_location_hook/crush_location(ceph.conf 的 [osd] 段)换成自定义脚本输出位置(如读 /etc/rack)。
规则(CRUSH rule)解剖(以默认 replicated_rule 为例)
rule replicated_rule {
id 0
type replicated
min_size 1 # 池副本数小于此值不选本规则
max_size 10 # 池副本数大于此值不选本规则
step take default # 从 default 根开始向下迭代(可换 DC/机架桶)
step chooseleaf firstn 0 type host # 选若干 host 桶并从每个子树挑叶子 OSD(0=按池 size 数量)
step emit
}chooseleaf firstn N:N=0 取池副本数那么多个;0<N<副本数 取 N 个(配合后续 step 指定剩余副本位置);N<0 用“副本数−|N|”个。- 建池时用规则名(
ceph osd pool create myfirstpool 50 50 <rulename>);给既有池换规则用ceph osd pool set POOL crush_ruleset <rule-id>(注意是 ID)。 - EC 池会自动建同名 rule:按你给 EC profile 的
crush-root/crush-failure-domain/crush-device-class生成(如k=2 m=1 crush-root=DC2 crush-failure-domain=rack crush-device-class=ssd→myecpool)。
手工编辑 CRUSH(编译/反编译工作流,备份恢复利器)
ceph osd getcrushmap -o map.bin # 导出二进制(备份)
crushtool -d map.bin -o map.txt # 反编译成文本
# …vim 编辑文本…
crushtool -c map.txt -o new.bin # 重新编译
ceph osd setcrushmap -i new.bin # 导入生效
crushtool -i map.bin --test # 离线 dry-run 模拟 PG 放置CRUSH Tunables
- 调节 CRUSH 算法行为(如
choose_total_tries、chooseleaf_vary_r);改 tunables 几乎必然导致 PG 重映射、数据搬迁,期间性能下降。 - 推荐用预置 profile:
ceph osd crush tunables profile optimal(jewel 基线以上);生产要求所有 daemon/客户端同版本。
5.2 Managing the OSD Map
epoch 与传播
- OSD map epoch=地图修订号,任何 OSD 加入/离开/故障都会 +1。
- MON 用 Paxos 共识保证各 MON 的集群 map 一致:leader 更新 map→epoch+1→Paxos 广播→多数确认后发新 lease,避免 epoch 倒退;读直接走本地键值库。
- OSD 间无 leader 管理 osdmap:互相打 epoch 标签,落后方主动找 peer 增量同步;OSD 心跳发现对端故障会上报 MON。客户端连 OSD 时对不上 epoch,OSD 只回正确的增量,避免激进全量广播。
OSD map 命令
ceph osd dump # 打印 osdmap(pool 条目含 size/min_size/crush_rule/pg_num…、OSD 条目含地址/状态/weight)
ceph osd getmap -o map.bin # 导出二进制 osdmap
osdmaptool --print map.bin # 人类可读打印(epoch/fsid/flags/crush_version/full_ratio…)
osdmaptool --export-crush crush.bin map.bin # 从 osdmap 抽 CRUSH 二进制
osdmaptool --import-crush crushnew.bin mapnew.bin # 把新 CRUSH 嵌入 osdmap 副本
osdmaptool --test-map-pgs [--dump] map.bin # 预演 PG→OSD 映射(改地图前先验证)
osdmaptool --pg-num … map.bin # 模拟改 PG 数的影响(GE 里把池 pg_num 调 32 测试)- GE 标准演练:导出 map.bin → 抽 CRUSH → 反编译→原样编译→导回副本(epoch 变化但内容不变)→
--test-map-pgs观察分布 → 确认无误才应用到生产。
PG 数量与手工重映射
- 池中对象按 PG 聚合;PG 太少→分布不均,太多→CPU/内存开销大。经验公式(单池):
总 PG ≈ OSD 数 × 100 / 副本数;官方推荐用 Red Hat PG Calculator(access.redhat.com/labs/cephpgc)。pg_autoscaler默认 on。 - 手工把 PG 从某 OSD 移到另一些 OSD(处理热盘/不平衡):
ceph osd set-require-min-compat-client luminous # 开启 pg-upmap 前提
ceph pg map 3.25 # 看 PG 3.25 当前 up/acting
ceph osd pg-upmap-items 3.25 2 1 # 把 3.25 的 up set 里 OSD 2 换成 1- 成百 PG 别手敲:用
osdmaptool分析真实 map 自动生成一批pg-upmap-items命令。
实验要点 · Lab(lab: map-review)
建 rack1/2/3 与 hostc/d/e bucket → move 成 root default-cl260 → rack → host 层次 → ceph osd crush set osd.N 1.0 … 把 9 个 OSD 放成 3 机架×3 主机(每机架一个 class:rack1=ssd 等)→ 建规则 → ceph osd pool create reviewpool 64 64 replicated <rule> → 用 ceph osd crush reweight-all 校准权重 → ceph osd crush tree 验证 → 评分收尾。
命令速查表(本章)
| 命令 | 作用 |
|---|---|
ceph osd crush dump / tree / show-tunables | 查看 CRUSH 结构/树/可调项 |
ceph osd crush add-bucket B TYPE | 加空桶 |
ceph osd crush move B root=R [rack=.. host=..] | 挂桶建层次 |
ceph osd crush set osd.N W root=.. rack=.. host=.. | 放 OSD 叶子+权重+位置 |
ceph osd crush reweight osd.N W / reweight-all | 调权重/重建桶权重 |
ceph osd crush rule create-replicated NAME ROOT TYPE | 建副本放置规则 |
ceph osd crush rule ls / dump | 列/查规则 |
ceph osd pool set POOL crush_ruleset <id> | 换池规则(用 ID) |
ceph osd getcrushmap -o f / setcrushmap -i f | CRUSH 备份/恢复 |
crushtool -d/-c/-i … --test | 反编译/编译/离线模拟 |
ceph osd dump / ceph osd getmap -o f | 查/导出 osdmap |
osdmaptool --print / --export-crush / --import-crush / --test-map-pgs | osdmap 本地操作与预演 |
ceph osd set-require-min-compat-client luminous | 开启 pg-upmap 前提 |
ceph pg map PG / ceph osd pg-upmap-items PG OLD NEW | 手工重映射 PG |
词汇表(本章)
| 英文术语 | 中文 | 一句话速记 |
|---|---|---|
| CRUSH map | 放置地图 | bucket 树 + 规则 + tunables |
| bucket | 桶/分支 | CRUSH 树容器(负数 ID),root/rack/host 等 |
| leaf | 叶子 | OSD 设备(正数 ID) |
| failure domain | 故障域 | 副本/分块跨域放置的粒度(host/rack/DC) |
| performance domain | 性能域 | 按盘类/负载分层的独立 CRUSH 层次 |
| device class | 设备类 | hdd/ssd/nvme,OSD 自动归类 |
| straw2 | 选择算法 | 默认 bucket 选择算法(均匀+低搬迁) |
| rule / steps | 规则/步骤 | take→chooseleaf→emit 决定 PG→OSD |
| reweight | 权重调整 | 按盘容量/负载调参与比例 |
| tunables | 可调项 | 改 CRUSH 行为(profile optimal 推荐) |
| osdmap / epoch | OSD 图/版本号 | OSD 增删即 +1;OSD 间打 epoch 增量同步 |
| Paxos / lease | 共识/租约 | MON 同步地图、防 epoch 倒退 |
| pg-upmap | PG 手工映射 | 不均衡时把 PG 移到指定 OSD |
| PG Calculator | PG 计算器 | 官方公式:OSD×100/副本数(单池) |
自测
- bucket 与 leaf 如何区分(ID 符号)?默认树是几层、由什么类型组成?
- 把副本分散到“不同机架+不同电源”应把 failure domain 设成什么级别?怎么实现(加 rack 桶 + rule type rack)?
- 写出把 osd.7 放进 rack3/hoste 的命令;
reweight-all何时用? - 解释
step take default、chooseleaf firstn 0 type host、step emit的含义;firstn=0 与负数分别表示什么? - EC 池的 rule 是自动生成的——它从哪些 profile 参数继承(crush-root/failure-domain/device-class)?
- 修改 tunables 或 CRUSH 结构后集群会发生什么(数据搬迁)?该用什么命令离线预演?
- osdmap epoch 何时递增?OSD 之间如何发现“对方有更新的 map”?
- 用 osdmaptool 在不动生产的情况下验证 CRUSH 改动影响的完整命令链是什么?
- PG 太多/太少各有什么代价?单池经验公式?为什么 autoscaler 建议 on?
ceph osd pg-upmap-items 3.25 2 1干了什么?前提设置是什么?
