ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Ceph osdmaptool 完全指南:OSD Map 创建、CRUSH 操作、PG 映射分析与 upmap 平衡模拟

Ceph osdmaptool 完全指南:OSD Map 创建、CRUSH 操作、PG 映射分析与 upmap 平衡模拟 存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载osdmaptool是 Ceph 发行版内置的 OSD Cluster Map 离线操作工具用于创建、查看与修改 OSD Map提取或嵌入 CRUSH Map模拟 upmap 平衡器以评估 PG 分布并计算 PG 到 OSD 的映射关系。本文以 doc/man/8/osdmaptool.rst 为骨架结合 src/tools/osdmaptool.cc 的选项解析实现与 src/test/cli/osdmaptool 下的 CLI 测试用例完整讲解每个选项的用法、输出含义与底层机制。读完本文你将掌握如何离线构造并检验 OSD Map、如何在不解集群的情况下验证 CRUSH 映射是否均衡、如何生成可直接执行的 upmap 平衡命令以及如何模拟读平衡primary 平衡效果。一、工具定位与适用场景osdmaptool是 Ceph 分布式存储系统中的 OSD 集群映射OSD cluster map操作工具其核心能力包括创建离线生成一份全新的 OSD Map--createsimple、--create-from-conf查看以纯文本或 JSON 形式打印 OSD Map 内容--print、--dump、--tree、--healthCRUSH 操作从 OSD Map 中导出内嵌的 CRUSH Map或导入新的 CRUSH Map--export-crush、--import-crush映射分析模拟 PG 到 OSD 的映射--test-map-pgs系列、--test-map-pg、--test-map-object、--test-crush、--test-random平衡模拟模拟 upmap 平衡器模式预先评估为平衡 PG 所需的上调操作数量与内容--upmap、--upmap-active以及模拟读平衡primary 平衡--read。典型使用场景包括离线测试新建集群的 PG 分布是否均衡、在批量 OSD 上线前预演 upmap 平衡会产生多少条命令、调试 CRUSH 规则对映射的影响以及在测试环境中快速生成一份可用的 OSD Map。该工具不需要运行中的集群只需一个 OSD Map 文件即可工作非常适合脚本化与自动化验证。从源码看工具入口位于 src/tools/osdmaptool.cc 的main()函数先通过ceph_argparse_*系列函数解析全部命令行参数再执行对应的创建、标记、映射测试或 upmap 计算逻辑工具以CEPH_ENTITY_TYPE_CLIENT类型初始化并设置CINIT_FLAG_NO_DEFAULT_CONFIG_FILE意味着它不依赖默认配置文件即可运行。二、命令行语法总览原文档给出了完整的 Synopsis其语法为osdmaptool mapfilename [--print] [--createsimple numosd [--pgbits bitsperosd]] [--clobber] osdmaptool mapfilename [--import-crush crushmap] osdmaptool mapfilename [--export-crush crushmap] osdmaptool mapfilename [--upmap file] [--upmap-max max-optimizations] [--upmap-deviation max-deviation] [--upmap-pool poolname] [--save] [--upmap-active] osdmaptool mapfilename [--upmap-cleanup] [--upmap file]mapfilename是唯一的位置参数其余均为可选开关。需要注意若未指定--createsimple/--create-from-conf且文件已存在osdmaptool 会直接读取该文件若创建模式且目标文件已存在则必须显式携带--clobber才允许覆盖源码 src/tools/osdmaptool.cc 中通过::stat检查文件存在性并报错exists, --clobber to overwrite。选项的默认值在源码中有明确定义src/tools/osdmaptool.ccpg_bits 6、pgp_bits 6、upmap_max 10、upmap_deviation 5、upmap_file -即 stdout。此外工具还要求upmap-deviation 1否则报错退出--osd-size-aware仅在 read 模式下可用。三、选项详解与源码印证3.1 查看类选项选项说明--print在所有修改完成后以纯文本形式打印 Map 的完整内容--dump format以纯文本显示 Map当指定格式不受支持时回退为 JSON。是--print的替代方案--tree以层级树形式显示 Map 的 OSD 拓扑--health输出健康检查health checks信息源码中--dump与--tree都支持携带格式参数当参数为空或等于plain时使用默认文本输出否则通过Formatter::create(val, , json)创建指定格式的 formattersrc/tools/osdmaptool.cc这与文档所述格式不支持时回退 JSON一致。3.2 创建类选项选项说明--createsimple numosd [--pg_bits bitsperosd] [--pgp_bits bits]创建一份包含numosd个设备的通用 OSD Map--create-from-conf使用默认配置创建 OSD Map--with-default-pool创建 Map 时包含默认 poolrbd--clobber允许 osdmaptool 覆盖已存在的mapfilename--createsimple的 PG 数量计算规则是pg_num numosd pg_bits即numosd左移bitsperosd位pgp_num numosd pgp_bits。在 src/tools/osdmaptool.cc 中创建路径调用osdmap.build_simple()或build_simple_with_pool()完成初始化默认pg_bits与pgp_bits均为 6。--create-from-conf需要结合-c ceph.conf使用参见测试 src/test/cli/osdmaptool/upmap.t 中的osdmaptool --create-from-conf om -c $TESTDIR/ceph.conf.withracks --with-default-pool此时num_osd被置为-1Map 结构由配置文件中的osd_pool_default_*等参数决定。验证示例对应 src/test/cli/osdmaptool/create-print.t$ osdmaptool --createsimple 3 myosdmap --with-default-pool osdmaptool: osdmap file myosdmap osdmaptool: writing epoch 1 to myosdmap随后打印出的 Map 摘要显示pool 1 rbd replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 192 pgp_num 192——这里 3 个 OSD、默认 6 bit得到pg_num 3 6 192与文档规则完全吻合。3.3 CRUSH 导入导出与权重调整选项说明--import-crush mapfile从mapfile加载 CRUSH Map 并嵌入 OSD Map--export-crush mapfile从 OSD Map 提取 CRUSH Map 并写入mapfile--adjust-crush-weight osdid:weight[,osdid:weight,...]修改指定 OSD 的 CRUSH 权重默认不持久化导出使用osdmap.crush-encode()编码后写入文件src/tools/osdmaptool.cc导入则会先解码校验CrushWrapper::decode并检查crushmap max_devices是否超过osdmap max_osd随后通过OSDMap::Incremental增量应用到 OSD Mapsrc/tools/osdmaptool.cc。将导出的 CRUSH Map 交给crushtool --decompile即可查看文本形式的 CRUSH 结构见 src/test/cli/osdmaptool/create-print.t。--adjust-crush-weight使用osdid:weight的逗号分隔格式内部通过osdmap.crush-adjust_item_weightf()修改权重若同时指定--save则会构造 Incremental 并将修改持久化到文件src/tools/osdmaptool.cc。测试 src/test/cli/osdmaptool/crush.t 演示了不带--save仅打印 Adjusted osd.0 CRUSH weight to 5、不落盘与带--save写入 epoch 5的差异。3.4 PG 映射测试类选项选项说明--test-map-pgs [--pool poolid] [--range-first first --range-last last]打印所有 PG 到 OSD 的映射--test-map-pgs-dump [--pool poolid] [--range-first first --range-last last]打印所有 PG 的摘要及其到映射 OSD 的映射--test-map-pgs-dump-all [--pool poolid] [--range-first first --range-last last]打印所有 PG 的摘要及其到全部 OSD 的映射--test-map-pg pgid将特定 PG 映射到 OSD--test-map-object objectname [--pool poolid]将特定对象映射到 OSD--test-crush [--range-first first --range-last last]将 PG 映射到 acting OSD--test-random对 PG 做随机映射用于对照实验--range-first/--range-last的作用是当mapfilename指向一个目录时依次读取该目录下以0,1,2,...命名的多个 OSD Map 文件并逐个解码src/tools/osdmaptool.cc例如osdmaptool --test-map-pgs --range-first 0 --range-last 2 osdmap_dir会迭代读取osdmap_dir目录中名为 0、1、2 的文件。此外--test-map-pgs还额外支持--pg_num pg_num临时覆盖 pool 的 PG 数见 src/tools/osdmaptool.cc。--test-map-object的完整映射链路为object_locator_to_pg()计算对象归属的原始 PG →raw_pg_to_pg()规整 PG 号 →pg_to_acting_osds()得到 acting 集合src/tools/osdmaptool.cc未指定--pool时默认假设 pool 1。--test-map-pg则直接解析pgid形如1.2f同时输出 raw / up / acting 三套集合及其各自的 primarysrc/tools/osdmaptool.cc可以清晰看到原始 CRUSH 结果与经过 upmap/primary-affinity 调整后的实际生效结果之间的差异。3.5 状态标记类选项选项说明--mark-up-in将所有 OSD 标记为 up 且 in不持久化--mark-out osdid将 OSD 标记为 out不持久化--mark-up osdid将 OSD 标记为 up不持久化--mark-in osdid将 OSD 标记为 in不持久化--clear-temp清除pg_temp与primary_temp变量--clean-temps清理pg_temp这些选项不持久化的含义是仅在内存中的 OSDMap 对象上生效用于后续的映射测试或 upmap 模拟并不会写回文件。源码中--mark-up-in遍历get_max_osd()范围内的所有 OSD逐一置位CEPH_OSD_UP状态并设置 in 权重对 CRUSH 权重为 0 的 OSD 还会自动调用adjust_item_weightf(..., 1.0)补上默认权重src/tools/osdmaptool.cc保证新建的 OSD 能参与后续映射计算。测试 src/test/cli/osdmaptool/test-map-pgs.t 就是先用--mark-up-in把 500 个 OSD 全部标记为 up/in再做--test-map-pgs验证size 3下 8000 个 PG 全部映射到 3 个不同 OSD。--clear-temp调用osdmap.clear_temp()--clean-temps则构造 Incremental 并调用OSDMap::clean_temps()src/tools/osdmaptool.cc。3.6 upmap 平衡类选项选项说明--upmap-cleanup file清理pg_upmap[_items]条目将命令写入file默认-表示 stdout--upmap file计算用于平衡 PG 布局的 pg upmap 条目将命令写入file--upmap-max max-optimizations设置最多计算的 upmap 条目数默认 10--upmap-deviation max-deviation设置偏离目标的允许范围默认 5--upmap-pool poolname将 upmap 平衡限制在单个 pool可重复使用以限定多个 pool--upmap-active模拟活跃平衡器持续应用修改直到分布均衡--upmap-seed seed指定随机种子源码中通过--upmap-seed解析便于复现结果--save将 upmap 或 CRUSH 调整的修改写入修改后的 OSD Map 文件--vstart为 upmap 与 read 输出添加./bin/前缀面向 vstart 开发环境--upmap的计算流程在 src/tools/osdmaptool.cc先解析--upmap-pool指定的 pool 名并校验存在性未指定时默认对 Map 中全部 pool 计算。每轮迭代会随机打乱 pool 顺序逐 pool 调用osdmap.calc_pg_upmaps(cct, upmap_deviation, left, one_pool, pending_inc, seed)计算最多left条调整累计输出prepared X/Y changes。生成的命令通过print_inc_upmaps()输出包含四类 Ceph 命令src/tools/osdmaptool.ccceph osd pg-upmap pgid osd.../ceph osd rm-pg-upmap pgidceph osd pg-upmap-items pgid from to.../ceph osd rm-pg-upmap-items pgidceph osd pg-upmap-primary pgid osd/ceph osd rm-pg-upmap-primary pgid在--upmap-active模式下工具会反复应用增量并重新计算直到某轮prepared 0/N changes即输出 Unable to find further optimization, or distribution is already perfect随后打印每个 OSD 的最终 PG 数量与总耗时/轮数。当--save或--upmap-active生效时计算出的增量会被apply_incremental()应用到内存 Map 并标记modified最终写回文件epoch 递增。测试 src/test/cli/osdmaptool/upmap.t 展示了完整链路--create-from-conf建 Map →--mark-up-in --upmap-max 11 --upmap c --save生成 11 条ceph osd pg-upmap-items命令并持久化 →--print验证pg_upmap_items已写入 Map。这也是推荐的工作流先用 osdmaptool 离线验证与生成命令再在真实集群中执行。3.7 读平衡primary 平衡类选项选项说明--read file计算用于平衡 PG primary 的 upmap 条目写入file--read-pool poolname指定读平衡器要调整的 pool--osd-size-aware读模式下考虑不同容量设备需 pool 设置read_ratio读平衡的目标是让每个 OSD 上的primary 数量即承担读流量主副本的角色尽量均衡。源码流程src/tools/osdmaptool.cc校验 pool 存在且为副本replicated类型纠删码池会直接报错退出调用get_pgs_by_osd()收集调整前每个 OSD 的 PG 与 primary 分布并用calc_read_balance_score()计算read_balance_score分数越低越均衡调用osdmap.balance_primaries()计算调整方案--osd-size-aware时传入RB_OSDSIZEOPT此时要求 pool 已设置合法的read_ratio可通过ceph osd pool set pool read_ratio value配置再次统计并打印 BEFORE / AFTER 两段对比每个 OSD 的primary affinity、number of prims以及前后read_balance_score最后输出num changes与生成的命令。--osd-size-aware模式下若read_ratio未设置或超出(0,100]范围工具会给出明确的设置指引后退出。四、实战示例与输出解读4.1 创建 16 设备 OSD Map 并查看osdmaptool --createsimple 16 osdmap --clobber osdmaptool --print osdmap第一条命令创建包含 16 个 OSD 的通用 Map若文件已存在则覆盖第二条以纯文本打印全部内容包括 epoch、fsid、pool 定义、max_osd以及内嵌 CRUSH Map 的文本视图。4.2 查看 pool 1 的 PG 映射统计osdmaptool osdmap --test-map-pgs-dump --pool 1典型输出如下完整复刻自原文档pool 1 pg_num 8 1.0 [0,2,1] 0 1.1 [2,0,1] 2 1.2 [0,1,2] 0 1.3 [2,0,1] 2 1.4 [0,2,1] 0 1.5 [0,2,1] 0 1.6 [0,1,2] 0 1.7 [1,0,2] 1 #osd count first primary c wt wt osd.0 8 5 5 1 1 osd.1 8 1 1 1 1 osd.2 8 2 2 1 1 in 3 avg 8 stddev 0 (0x) (expected 2.3094 0.288675x)) min osd.0 8 max osd.0 8 size 0 0 size 1 0 size 2 0 size 3 8该输出包含四层信息PG 表pool 1 有 8 个 PG每行是一个 PG列为「PG id、acting 集合、primary OSD」。例如1.5 [0,2,1] 0表示 PG 1.5 的 acting 集合为[0,2,1]primary 是 OSD 0OSD 表每行是一个 OSD列为「映射到该 OSD 的 PG 数count、该 OSD 出现在 acting 集合首位first的 PG 数、作为 primary 的 PG 数、CRUSH 权重c wt、OSD 权重wt」分布统计对 3 个 OSD 上 PG 数量做统计给出均值avg、标准差stddev、stddev/avg、以及期望标准差基于二项分布模型的期望值与其比值——本例 stddev 为 0说明 8 个 PG 被完美均匀地分散到 3 个 OSDsize 分布统计映射到 n 个不同 OSD 的 PG 数量。本例size 3 8表示全部 8 个 PG 都映射到了 3 个不同的 OSD副本数恰好 3没有 PG 出现降级size 3。4.3 失衡集群的统计对比在一个分布不那么均衡的集群中输出可能如下来自原文档#osd count first primary c wt wt osd.0 33 9 9 0.0145874 1 osd.1 34 14 14 0.0145874 1 osd.2 31 7 7 0.0145874 1 osd.3 31 13 13 0.0145874 1 osd.4 30 14 14 0.0145874 1 osd.5 33 7 7 0.0145874 1 in 6 avg 32 stddev 1.41421 (0.0441942x) (expected 5.16398 0.161374x)) min osd.4 30 max osd.1 34 size 0 0 size 1 0 size 2 0 size 3 646 个 OSD 承载 64 个 PG平均 32 个/PG标准差 1.41421。注意此处c wtCRUSH 权重 0.0145874与wtOSD 权重 1不一致——CRUSH 权重低但 OSD 权重为 1 的情况往往意味着设备存在容量差异或 CRUSH 权重被调整过这正是需要 upmap 平衡器介入的场景。4.4 模拟 upmap 活跃平衡器osdmaptool --upmap upmaps.out --upmap-active --upmap-deviation 6 --upmap-max 11 osdmap输出来自原文档osdmaptool: osdmap file osdmap writing upmap command output to: upmaps.out checking for upmap cleanups upmap, max-count 11, max deviation 6 pools movies photos metadata data prepared 11/11 changes Time elapsed 0.00310404 secs pools movies photos metadata data prepared 11/11 changes Time elapsed 0.00283402 secs pools data metadata movies photos prepared 11/11 changes Time elapsed 0.003122 secs pools photos metadata data movies prepared 11/11 changes Time elapsed 0.00324372 secs pools movies metadata data photos prepared 1/11 changes Time elapsed 0.00222609 secs pools data movies photos metadata prepared 0/11 changes Time elapsed 0.00209916 secs Unable to find further optimization, or distribution is already perfect osd.0 pgs 41 osd.1 pgs 42 osd.2 pgs 42 osd.3 pgs 41 osd.4 pgs 46 osd.5 pgs 39 osd.6 pgs 39 osd.7 pgs 43 osd.8 pgs 41 osd.9 pgs 46 osd.10 pgs 46 osd.11 pgs 46 osd.12 pgs 46 osd.13 pgs 41 osd.14 pgs 40 osd.15 pgs 40 osd.16 pgs 39 osd.17 pgs 46 osd.18 pgs 46 osd.19 pgs 39 osd.20 pgs 42 Total time elapsed 0.0167765 secs, 5 rounds解读要点每轮以pools 名称列表开头pool 顺序每轮随机打乱源码中std::shuffle(pools.begin(), pools.end(), ...)prepared X/11 changes表示本轮计算出的调整条目数条目内容写入upmaps.out形如ceph osd pg-upmap-items 1.7 142 147参见 src/test/cli/osdmaptool/upmap.t5 轮后某轮prepared 0/11判定无法继续优化或分布已完美随即打印每个 OSD 的最终 PG 数20 个 OSD 均在 3946 之间最大差 7已落在--upmap-deviation 6允许的偏离范围内每个file输出可直接作为脚本在真实集群执行sh upmaps.out这就是先离线模拟、再线上执行的平衡落地方式。4.5 模拟读平衡primary 平衡先确保容量已通过 upmap 模式平衡再对副本池做读平衡osdmaptool osdmap --read read.out --read-pool pool name输出来自原文档./bin/osdmaptool: osdmap file om writing upmap command output to: read.out ---------- BEFORE ------------ osd.0 | primary affinity: 1 | number of prims: 3 osd.1 | primary affinity: 1 | number of prims: 10 osd.2 | primary affinity: 1 | number of prims: 3 read_balance_score of cephfs.a.meta: 1.88 ---------- AFTER ------------ osd.0 | primary affinity: 1 | number of prims: 5 osd.1 | primary affinity: 1 | number of prims: 5 osd.2 | primary affinity: 1 | number of prims: 6 read_balance_score of cephfs.a.meta: 1.13 num changes: 5BEFORE/AFTER 对比显示primary 数从 3/10/3 调整为 5/5/6read_balance_score从 1.88 降至 1.13共 5 处调整命令写入read.out。若输出 Unable to find further optimization, or distribution is already perfect则表示 primary 分布已无需优化。五、与其他工具的分工与配合ceph(8)在线管理集群的命令行入口ceph osd pg-upmap等命令用于在运行中的集群上应用 upmap 调整crushtool(8)独立的 CRUSH Map 操作工具可对osdmaptool --export-crush导出的文件做--decompile/--compile/--test等操作。两者常配合使用先用--export-crush导出再用 crushtool 离线验证 CRUSH 规则或用crushtool --build构造新 CRUSH Map 后通过--import-crush导入见 src/test/cli/osdmaptool/test-map-pgs.t 中crushtool --build --num_osds 500 node straw 10 rack straw 10 root straw 0构造 500 设备 CRUSH Map 再导入的用法。六、源码结构速览主程序src/tools/osdmaptool.cc985 行涵盖参数解析、Map 构建、CRUSH 导入导出、PG 映射测试、upmap/read 平衡计算与输出OSD Map 核心类src/osd/OSDMap.h 与 src/osd/OSDMap.cc提供calc_pg_upmaps()、balance_primaries()、clean_pg_upmaps()、calc_read_balance_score()等平衡算法实现CLI 回归测试src/test/cli/osdmaptool 目录下的*.t文件覆盖创建打印create-print.t、CRUSH 导入导出与权重调整crush.t、upmap 生成与持久化upmap.t、upmap-out.t、映射统计test-map-pgs.t、树形视图tree.t、pool 处理pool.t、覆盖保护clobber.t、参数缺失missing-argument.t等场景。七、使用注意事项--createsimple/--create-from-conf在目标文件已存在且未加--clobber时会拒绝覆盖--mark-up、--mark-out、--mark-in、--adjust-crush-weight等修改默认不写回文件只有显式--saveupmap/read 模式为--upmap-active或--save才会持久化并使 epoch 递增--upmap-deviation必须 ≥ 1--read仅支持副本池--osd-size-aware仅对 read 模式生效且要求 pool 已配置read_ratio生成的 upmap/read 命令文件需要在真实集群中用ceph命令逐一执行osdmaptool 本身不会连接集群该工具用于离线分析、预演与脚本化测试实际集群中的动态平衡由 mgr balancer 模块在线完成两者共享同一套calc_pg_upmaps底层算法因此离线模拟结果对线上有直接参考价值。赞分享存储分布式文件系统对象存储后端高可用【免费下载链接】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存储分布式文件系统对象存储后端高可用葱香酱肉包出品全解供应商溯源、蒸柜 15 分钟标准流程与营养数据CookLikeHOC 早餐篇葱香酱肉包出品全解供应商溯源、蒸柜 15 分钟标准流程与营养数据CookLikeHOC 早餐篇 本文围绕 CookLikeHOC 仓库中 早餐/葱香酱肉包存储分布式文件系统对象存储后端高可用Ceph 集群平衡设计解析容量平衡Upmap与读平衡Read Balancer的机制与实战Ceph 集群平衡设计解析容量平衡Upmap与读平衡Read Balancer的机制与实战 在分布式存储系统 Ceph 中请求的均衡分布直接决定了集存储分布式文件系统对象存储后端高可用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表