ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ceph 存储集群 CRUSH 映射变更预演:crushdiff 工具使用指南

Ceph 存储集群 CRUSH 映射变更预演:crushdiff 工具使用指南 存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载crushdiff 是 Ceph 提供的一站式 CRUSH 映射变更评估工具在真正向集群下发新版 CRUSH 映射之前它可以在本地预演一遍映射变更量化输出会有多少个 PG、多少对象、多少字节发生迁移。本文围绕其 man pagedoc/man/8/crushdiff.rst展开结合 src/tools/crushdiff 的 Python 实现与 qa/workunits/rados/test_crushdiff.sh 测试脚本讲清它的原理、选项、命令与完整实战流程帮助你安全、可控地规划一次 CRUSH 映射调整。一、crushdiff 是什么定位与工作原理crushdiff是一个用于评估 CRUSH 映射crushmap变更影响的工具。在 Ceph 集群中PGPlacement Group放置组到 OSD 的映射关系由 CRUSH 算法根据 crushmap 计算得出因此修改 crushmap例如调整 OSD 权重、调整机架/主机层次结构会直接导致大量 PG 及其中的对象重新分布到新的 OSD 上触发大规模数据迁移。crushdiff 的价值在于在导入新映射之前先告诉你这次变更会让多少 PG、多少对象、多少字节发生移动从而让管理员可以预估迁移开销、评估风险再决定是否执行。从实现上看它并非从零实现一套 CRUSH 模拟器而是围绕osdmaptool的封装wrapper它依赖osdmaptool的--test-map-pgs-dump选项分别用旧 crushmap和新 crushmap对同一份 osdmap 做 PG 映射测试得到变更前后的 PG → OSD 映射表再结合pg statsceph pg dump的统计数据用每个 PG 的对象数、字节数推算objects affected和bytes to move。这一设计在 src/tools/crushdiff 的模块头注释中写得很明确即a wrapper around osdmaptool, hardly relying on its --test-map-pgs-dump option to get the list of changed pgs. Additionally it uses pg stats to calculate the numbers of objects and bytes moved。默认情况下crushdiff 会直接连接集群使用集群当前的 osdmap 和 pg stats通过ceph osd getmap与ceph pg dump --format json获取因此运行它需要能够访问 Ceph 集群。如果希望基于历史数据或离线评估可以借助--osdmap与--pg-dump参数显式指定数据源详见下文离线评估一节。二、命令语法与安装crushdiff 的完整语法为crushdiff [ --osdmap osdmap ] [ --pg-dump pg-dump ] [ --compiled ] [ --verbose ] command crushmap其中command为compare、export、import三者之一详见第四节crushmap是映射文件路径。在打包层面crushdiff 作为 Ceph 公共工具随ceph-common一起安装其安装清单见 debian/ceph-common.install内容包括可执行文件/usr/bin/crushdiff以及手册页/usr/share/man/man8/crushdiff.8。三、选项详解crushdiff 提供四个选项对应源码 src/tools/crushdiff 中argparse的定义均带短选项形式-c、-m、-p、-v选项短选项说明--compiled-c输入/输出的 crushmap 是已编译的二进制格式。不指定时crushdiff 期望的 crushmap 是 txt反编译后的明文格式--pg-dump pg-dump-pceph pg dump的 JSON 输出文件。若不指定crushdiff 会自行执行ceph pg dump --format json获取数据--osdmap osdmap-m集群 osdmap 文件可通过ceph osd getmap命令获得。若不指定crushdiff 会自行执行ceph osd getmap -o ...获取数据--verbose-v输出诊断信息包括逐条列出受影响的 PG 及其新旧 OSD acting set需要说明的是--compiled对三个子命令compare/export/import均生效export配合--compiled时导出的 crushmap 是编译后的二进制文件源码中直接使用osdmaptool --export-crush的结果否则导出的是经过crushtool -d反编译的明文 txtcompare/import配合--compiled时输入的 crushmap 文件直接作为编译后映射使用否则会先经crushtool -c编译成二进制再参与计算或导入。四、三个子命令export / compare / importcrushdiff 的核心工作流由三个子命令构成一个导出—修改—预演—导入闭环分别对应源码中的do_export、do_compare、do_import三个函数。4.1 export导出当前 CRUSH 映射crushdiff export crushmap 文件从集群 osdmap 中导出当前生效的 crushmap写入指定文件。底层调用链为ceph osd getmap -o osdmap→osdmaptool osdmap --export-crush crushmap提取内嵌 CRUSH 映射→未指定--compiled时crushtool -d crushmap -o 输出文件反编译为可读的明文文本。导出的明文格式即 CRUSH map 的文本表示包含设备列表device、bucket 层次host/rack/root等、rule 规则rule replicated_ruleset等以及每个 OSD 的weight行可以直接用编辑器修改。4.2 compare预演映射变更crushdiff compare crushmap 文件将crushmap 文件中的新映射与集群 osdmap 中当前生效的映射做对比输出预期的迁移规模。这是整个工具最核心的命令。其内部执行流程对应源码do_compare为若输入为明文映射先用crushtool -c编译成二进制获取 osdmap未指定--osdmap时执行ceph osd getmap -o ...获取 pg dump未指定--pg-dump时执行ceph pg dump --format json ...用旧映射跑osdmaptool osdmap --test-map-pgs-dump得到当前各 PG 的 OSD 集合将新 crushmap 导入 osdmaposdmaptool osdmap --import-crush crushmap后再跑一次--test-map-pgs-dump得到假设应用新映射后的 PG → OSD 集合解析两次输出的 PG 映射表逐一比对并结合 pg stats 统计迁移规模。4.3 import正式导入新映射crushdiff import crushmap 文件将crushmap 文件中的映射正式写入集群 osdmap。底层调用链为明文输入先经crushtool -c编译随后执行ceph osd setcrushmap -i crushmap未指定--osdmap时或osdmaptool osdmap --import-crush crushmap指定--osdmap时。import 是真正改变集群状态的操作应在 compare 结果令人满意后再执行。五、典型工作流与输出解读以 man page 中的完整示例为例展示一次标准的先评估、后变更流程。第一步导出当前 crushmapcrushdiff export cm.txt第二步编辑映射$EDITOR cm.txt第三步预演变更效果crushdiff compare cm.txt预期输出形如79/416 (18.99%) pgs affected 281/1392 (20.19%) objects affected 80/1248 (6.41%) pg shards to move 281/4176 (6.73%) pg object shards to move 730.52Mi/10.55Gi (6.76%) bytes to move第四步结果满意后正式导入crushdiff import cm.txt5.1 五行输出分别意味着什么compare 输出的五行统计对应源码do_compare后半部分的统计逻辑含义如下输出行含义统计口径pgs affected受影响的 PG 数量及占比新旧映射下 PG → OSD 集合发生变化的 PG 数 / 全部 PG 数objects affected受影响的对象数量及占比受影响 PG 中的对象总数 / 全部 PG 对象总数取每个 PG 的stat_sum.num_objectspg shards to move需要移动的 PG 副本数shard及占比逐 PG 对比新旧 OSD 集合旧集合中不再出现的 OSD 视为一个需要搬移的 shardpg object shards to move需要移动的对象副本数及占比每个待移动 shard 计入该 PG 的完整对象数bytes to move需要迁移的字节量及占比每个待移动 shard 计入该 PG 的字节数num_bytes num_omap_bytes字节与 shard 统计会对纠删码池做特殊折算源码中复制池按k1, msize-1处理即每个对象有size份副本纠删码池按 profile 中的k、m取值每个对象有km个 shard、每个 shard 承载1/k的对象数据这样bytes to move统计的是真实需要搬移的数据量而不是物理总量。字节数的展示使用人类可读格式Ki/Mi/Gi/Ti对应源码中的get_human_readable()函数。5.2 verbose 模式查看逐 PG 明细配合--verbose运行 compare除汇总统计外还会逐行打印受影响的 PG 及其新旧 OSD acting set4.3 [0, 2, 1] - [1, 4, 2] 4.b [0, 1, 3] - [2, 1, 3] 4.c [4, 0, 1] - [4, 1, 2]每行的格式为PG 编号池号.对象号如 4.3→ 旧的 OSD acting set → 新的 OSD acting set。例如4.3 [0, 2, 1] - [1, 4, 2]表示 PG 4.3 原来的主副本位于 OSD 0其余副本在 OSD 2、1应用新映射后变为以 OSD 1 为主副本位于 OSD 4、2。--verbose同时还会把中间产物--test-map-pgs-dump的输出、底层执行的命令打印到标准错误便于排障对应源码中run_cmd(..., True)与cat到 stderr 的行为。此外如果某 PG 在新映射下的 OSD 数量小于池的副本数size源码会向 stderr 输出WARNING: pgid will be undersized (...)警告——这是映射变更导致 PG 降级的重要风险信号务必留意。对复制池而言若新旧 acting set 的元素集合相同仅顺序或主副本变化不会计入 affected源码中的sorted()比较逻辑。六、离线评估基于历史 osdmap 与 pg dumpcrushdiff 默认直连集群获取 osdmap 和 pg stats但在两种场景下你更希望使用--osdmap与--pg-dump指定离线数据集群不可用只想基于之前保存的数据做分析变更前后对照例如先保存当前数据模拟修改后再评估全程不触碰线上集群。离线用法的数据准备ceph osd getmap -o osdmap # 保存 osdmap ceph pg dump --format json pg-dump # 保存 pg 统计JSON 格式然后crushdiff export cm.txt --osdmap osdmap --verbose crushdiff compare cm.txt --osdmap osdmap --pg-dump pg-dump --verbose crushdiff import cm.txt --osdmap osdmap --verbose注意--pg-dump只对compare有意义compare 需要 pg stats 推算对象与字节迁移量而--osdmap对三个子命令均有效——export从指定 osdmap 导出映射import会把新映射导入到指定 osdmap 文件中而不是推送到集群。七、测试验证从零 diff 到非零 diff仓库自带的工作单元测试 qa/workunits/rados/test_crushdiff.sh 完整验证了上述工作流也为我们展示了正确用法与预期结果值得逐段研读基础三命令对未修改的映射依次执行crushdiff export、crushdiff compare、crushdiff import含--verbose编译格式用--compiled走一遍同样的流程验证二进制 crushmap 的读写离线模式先用ceph osd getmap -o ...与ceph pg dump --format json准备数据再以--osdmap/--pg-dump执行 export、compare、import零 diff 断言映射未修改时compare 的输出必须满足0/N (0.00%) pgs affected、0/N (0.00%) objects affected、0/N (0.00%) pg shards to move、0/N (0.00%) pg object shards to move、0.00/... (0.00%) bytes to move——这是对compare 不虚报变更的回归保障非零 diff 断言当集群 OSD 数大于 3 时脚本用awk/sed把cm.txt中item osd.0 weight ...一行的权重放大 3 倍再执行 compare断言五行统计全部变为非零[1-9][0-9]*/... (...%)验证权重调整确实会触发迁移预演。该测试通过 teuthology 套件 qa/suites/rados/singleton-nomsgr/all/crushdiff.yaml 接入 CI单节点上同时运行 mon、mgr 与 4 个 OSD任务为执行rados/test_crushdiff.sh覆盖了复制池与纠删码池OSD 数大于 3 时创建 erasure 池两种场景。八、相关工具与下一步crushdiff 处于 Ceph 存储运维工具链中一个非常实用的位置与之配合使用的工具包括ceph(8)集群管理主命令crushdiff 依赖其中的ceph osd getmap、ceph pg dump、ceph osd setcrushmap等子命令osdmaptool(8)crushdiff 的底层引擎其--test-map-pgs-dump、--export-crush、--import-crush是三个子命令的基石此外 osdmaptool 还提供--upmap等 PG 均衡能力与 crushdiff 的迁移评估视角互补crushtool(8)CRUSH 映射的编译-c、反编译-d工具负责 crushdiff 在明文与二进制格式之间的转换。典型建议工作流是先crushdiff export拿到当前映射 → 编辑调整权重、层次或 rule→crushdiff compare评估迁移规模必要时加--verbose查看逐 PG 明细与 undersized 告警→ 满意后crushdiff import正式生效。整个过程把盲目变更导致的不可控数据搬迁变成了可量化、可预演、可回退依据的受控操作是规划集群扩缩容、故障域调整、权重再平衡时的高性价比前置工具。赞分享存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载相关推荐Ceph 动态集群管理CRUSH 映射、PG 放置与自愈机制深度解析Ceph 动态集群管理CRUSH 映射、PG 放置与自愈机制深度解析 导读 本文基于 Ceph 官方架构文档 doc/architecture/dynamic存储分布式文件系统对象存储后端高可用Ceph 存储集群架构详解RADOS、CRUSH 与四类守护进程的工作机制Ceph 存储集群架构详解RADOS、CRUSH 与四类守护进程的工作机制 本篇技术指南围绕 Ceph 官方架构文档《The Ceph Storage Clu存储分布式文件系统对象存储后端高可用Ceph 架构深度解析RADOS 存储集群、CRUSH 数据分布与客户端服务体系Ceph 架构深度解析RADOS 存储集群、CRUSH 数据分布与客户端服务体系 Ceph 是一款将 对象存储、块存储与文件存储统一于同一系统 的分布式存储平存储分布式文件系统对象存储后端高可用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表