ARTICLE DETAIL

资讯详情

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

Ceph rbd-replay-many 使用指南:在多个客户端上并行重放 RBD 工作负载

Ceph rbd-replay-many 使用指南:在多个客户端上并行重放 RBD 工作负载 Ceph rbd-replay-many 使用指南在多个客户端上并行重放 RBD 工作负载【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址: https://gitcode.com/gh_mirrors/ce/cephrbd-replay-many是 Ceph 分布式存储中用于RBDRADOS Block Device工作负载重放的辅助工具它接收一份已经录制好的 RBD 工作负载replay 文件在多个客户端主机上同时启动rbd-replay进程让每个客户端针对各自的独立镜像并行重放同一套 IO 轨迹。本文基于 rbd-replay-many 手册页 与该工具的 Bash 实现 src/rbd-replay-many完整讲解其命令语法、全部选项、典型用法、底层实现原理以及与rbd-replay、rbd-replay-prep配套使用的端到端工作流帮助读者快速搭建多客户端 RBD 负载测试环境。背景rbd-replay 工具链Ceph 提供了一套完整的三段式 RBD 工作负载录制/重放工具链录制阶段通过 librbd 的 LTTng 跟踪点tracepoint采集运行时的真实 IO 事件生成 CTFCommon Trace Format格式的追踪文件预处理阶段由 rbd-replay-prep 将 CTF 追踪文件转换为 rbd-replay 专用的二进制 replay 文件重放阶段由 rbd-replay 在单个客户端上按时间轴重放该 replay 文件而rbd-replay-many则在此基础上把同一份 replay 文件分发到多个客户端并行执行。在真实的生产场景中librbd 的每个原始客户端通常是一个拥有自己独立镜像的虚拟机。为了在测试环境中模拟这种多客户端、多镜像的并发负载形态rbd-replay-many 应运而生所有客户端使用同一份 workload但各自针对不同的镜像进行重放这正是其与单机版rbd-replay的核心区别。命令语法Synopsisrbd-replay-many 的命令行格式为rbd-replay-many [ options ] --original-image name host1 [ host2 [ ... ] ] -- rbd_replay_args其基本形态与rbd-replay类似但在两个关键点上不同在位置参数处列出一个或多个客户端主机名每个主机都会通过 SSH 启动一个rbd-replay进程使用--分隔符将 rbd-replay-many 自身的选项与透传给 rbd-replay 的参数区分开--之后的所有参数会被原样追加到每个客户端上执行的 rbd-replay 命令行末尾。选项详解rbd-replay-many 自身只接受四个选项均同时支持--opt value与--optvalue两种写法见 src/rbd-replay-many 的参数解析循环--original-image name指定最初被追踪的镜像名称可含快照。该选项为必填项是镜像名称映射正确性的关键rbd-replay-many 依赖它构造传给rbd-replay --map-image的映射规则详见下文名称映射原理。在 Bash 实现中若未提供该选项脚本会直接报错并退出if test -z $original_image; then echo Specify the original image name with --original-image. 2 exit 1 fi--image-prefix prefix指定重放目标镜像名的前缀。例如--image-prefixfoo会让第 0 个客户端重放foo-0、第 1 个客户端重放foo-1依此类推。默认值即为原始镜像名if test -z $image_prefix; then image_prefix$original_image fi这意味着若你不指定前缀客户端将依次对原始镜像名-0、原始镜像名-1…… 进行重放。--exec program指定客户端上rbd-replay可执行文件的路径。默认值为rbd-replay即依赖 PATH 环境变量查找。当你把 rbd-replay 安装到了非标准目录或需要指定某个特定版本/自定义构建的可执行文件时使用此选项。--delay seconds每个客户端启动之间的延迟秒数。默认值为 0即所有客户端同时启动。该参数用于模拟客户端逐步上线、错峰启动的场景。实现上脚本在启动每个客户端后执行sleep $delay仅当 delay 大于 0 时index0 for host in $hosts; do echo ssh $host $prog --map-image ${original_image}${image_prefix}-${index} $ ssh $host $prog --map-image ${original_image}${image_prefix}-${index} $ index$((index 1)) if [ $delay -gt 0 ]; then sleep $delay fi done wait典型用法示例手册页给出的典型用法为rbd-replay-many host-0 host-1 --original-imageimage -- -c ceph.conf replay.bin该命令会在两个客户端上分别执行ssh host-0 rbd-replay --map-image imageimage-0 -c ceph.conf replay.bin ssh host-1 rbd-replay --map-image imageimage-1 -c ceph.conf replay.bin注意两点细节映射方向--map-image imageimage-0表示把 replay 文件追踪记录中出现的镜像名image映射为客户端本地实际重放的镜像image-0参数透传--之后的-c ceph.conf replay.bin原样追加到了每个 SSH 命令尾部因此两个客户端都使用ceph.conf中的集群配置并读取同一个 replay 文件。再给出几个贴近实战的变体# 每个客户端针对 testvol-0、testvol-1 ... 重放并在启动时错开 5 秒 rbd-replay-many client-0 client-1 client-2 \ --original-imageprodvol --image-prefixtestvol --delay5 \ -- -c /etc/ceph/ceph.conf workload.bin # 使用自定义路径的 rbd-replay 可执行文件以最快速度重放latency-multiplier0 rbd-replay-many node-a node-b \ --original-imageimage --exec/opt/ceph/bin/rbd-replay \ -- --latency-multiplier0 -c ceph.conf replay.bin # 只重放非破坏性读请求保护测试镜像数据 rbd-replay-many host-0 --original-imageimage -- --read-only -c ceph.conf replay.bin使用前置条件与注意事项手册页明确强调了两条关键前提使用时必须满足配置文件和 replay 文件不会被自动复制到各客户端。rbd-replay-many 只负责在远端执行rbd-replay命令不会分发ceph.conf、replay 文件等依赖你需要自行通过scp、配置管理工具或共享文件系统如 NFS让所有客户端都能访问这些文件重放目标镜像必须已经存在。工具不会自动创建镜像且按--image-prefix生成的前缀-序号命名规则如image-0、image-1需要预先用rbd create建好对应数量的镜像。此外从 Bash 实现可以确认以下行为细节若--original-image缺失或未指定任何主机脚本会报错并以状态码 1 退出任何以-开头但未被识别的参数都会报错并提示若想透传给 rbd-replay请放在--之后见 src/rbd-replay-many 中-*分支的处理脚本会在执行前echo出即将运行的 ssh 命令便于审计随后以后台方式并行启动所有客户端的 ssh最后通过wait等待全部完成——因此各客户端的重放是并发进行的支持--help/-h查看内嵌的用法摘要。底层实现镜像名称映射原理rbd-replay-many 的核心工作是为主机上每一个客户端生成一条--map-image规则。要理解这条规则的语义需要看 rbd-replay 侧的实现。在 rbd-replay 入口 中--map-image rule参数被解析并交给ImageNameMap维护} else if (ceph_argparse_witharg(args, i, val, --map-image, (char*)NULL)) { ImageNameMap::Mapping mapping; if (image_name_map.parse_mapping(val, mapping)) { image_name_map.add_mapping(mapping); } else { cerr Unable to parse mapping string: val std::endl; return 1; } }ImageNameMapImageNameMap.cc将一条规则解析为(rbd_loc, rbd_loc)的映射对左值为追踪记录中的镜像位置右值为重放集群中的目标镜像位置。在重放过程中每个 IO 动作携带的镜像名都会先经过map()查询ImageNameMap.cc 的map方法若命中映射则替换为映射目标未命中则原样返回rbd_loc ImageNameMap::map(const rbd_loc name) const { std::maprbd_loc, rbd_loc::const_iterator p(m_map.find(name)); if (p m_map.end()) { return name; } else { return p-second; } }规则格式支持池与快照的完整位置规则字符串的完整格式为镜像1快照1镜像2快照2rbd-replay的 usage 输出亦如此说明甚至可以携带池名。位置解析逻辑位于 rbd_loc.cc/用于分隔池与镜像用于分隔镜像与快照\用于转义特殊字符。因此以下规则都是合法的--map-image imageimage-0 # 仅替换镜像名 --map-image prodvolsnap1testvol-3snap1 # 同时映射镜像与快照 --map-image poolA/imagesnappoolB/image-1 # 跨池映射在 rbd-replay-many 中脚本为第index个主机生成的规则固定为原始镜像名前缀-index的形式快照名保持不变。这也是为什么--original-image是必填项——没有它就无法构造这条映射规则的左值。端到端工作流从录制到多客户端重放结合整个工具链一套完整的录制-预处理-多客户端重放流程如下第 1 步录制 librbd 追踪在被追踪的客户端上开启 librbd 的 LTTng 跟踪点采集真实应用如虚拟机磁盘 IO访问 RBD 镜像期间产生的 CTF 追踪数据。第 2 步生成 replay 文件使用rbd-replay-prep将 CTF 追踪转换为 rbd-replay 专用的二进制文件该工具仅在编译期检测到 babeltrace 时构建见 src/rbd_replay/CMakeLists.txtrbd-replay-prep [ --window seconds ] [ --anonymize ] [ --verbose ] trace-input replay-output其实现rbd-replay-prep.cc会把追踪中的librbd:read_enter、librbd:write_enter、librbd:discard_enter、librbd:aio_read_enter、librbd:aio_write_enter、librbd:open_image_enter、librbd:close_image_enter等事件序列化为带有时间戳的 IO 动作序列。默认依赖窗口为 1 秒1e9纳秒--anonymize会把真实镜像名替换为image0、image1……快照名替换为snap0、snap1……便于在不泄露业务命名的前提下共享负载文件。第 3 步准备重放环境在每个客户端主机上安装/分发rbd-replay可执行文件默认 PATH 中或通过--exec指定将ceph.conf与 replay 文件分发到所有客户端用rbd create预先创建好与主机数量一致的镜像如image-0、image-1。第 4 步多客户端并行重放rbd-replay-many host-0 host-1 host-2 \ --original-imageimage --image-prefiximage --delay0 \ -- -c ceph.conf replay.bin构建与安装rbd-replayC 可执行程序由 src/rbd_replay/CMakeLists.txt 定义构建目标链接librbd、librados、rbd_replay静态库等安装到bin目录rbd-replay-prep在HAVE_BABELTRACE为真时才会构建与安装rbd-replay-many 本身是一个 Bash 脚本src/rbd-replay-many不依赖编译直接复制到 PATH 中的某个目录如/usr/local/bin即可使用运行时需要所有目标主机上已就绪的rbd-replay通过 ssh 调用。在 doc/man/8/CMakeLists.txt 中rbd-replay-many.rst与其他 RBD 相关手册页一起在WITH_RBD开启时纳入 man 文档生成与安装man8。相关命令rbd-replay(8)单客户端 RBD 工作负载重放工具支持--pool默认rbd、--latency-multiplier默认 1、--read-only、--map-image、--dump-perf-counters实验性等选项rbd-replay-prep(8)将 CTF 追踪转换为 replay 文件的预处理工具rbd(8)RBD 镜像管理命令用于预先创建重放所需的镜像。【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址: https://gitcode.com/gh_mirrors/ce/ceph创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表