Ceph 离线 OSD 检修实战:ceph-objectstore-tool 对象级诊断与修复完全指南
存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载ceph-objectstore-tool 是 Ceph 发行版中面向底层对象存储objectstore的离线诊断与维修工具用于直接检查、修改 OSD 中对象的字节内容、属性attr、对象映射OMAP与 OMAP 头也可执行 OSD 级的修复、导出/导入、文件系统检查fsck等高级操作。本文以 ceph-objectstore-tool.rst 为主干结合仓库中 ceph_objectstore_tool.cc 的源码实现完整讲解两种操作模式、全部--op命令、位置参数对象操作、选项语义与错误码排错帮助你安全地在 OSD 宕机状态下完成对象级检修。工具定位与两种操作模式ceph-objectstore-tool是操作 OSD 底层对象存储状态的工具由ceph-osd软件包提供。它便于完成以下操作修改对象内容、删除对象、列出 OMAP、操作 OMAP 头、操作 OMAP 键、列出对象属性、操作对象属性键。从 main() 函数 可以看到工具提供两种主要模式--op命令模式以--op参数指定操作作用于整个 OSD 或某个 PG例如ceph-objectstore-tool --data-path $PATH_TO_OSD --op $SELECT_OPERATION [--pgid $PGID] [--dry-run]位置参数对象操作模式直接对单个对象执行操作对象可以通过IDJSON 描述或--op list的 JSON 输出指定ceph-objectstore-tool --data-path $PATH_TO_OSD [--pgid $PG_ID] [--op command] ceph-objectstore-tool --data-path $PATH_TO_OSD [--op list $OBJECT_ID]⚠️最重要的使用前提所有修改类操作都要求目标 OSD 必须处于停止状态。工具的 ObjectStore 挂载是独占式的若 OSD 正在运行会直接挂载失败详见 错误码与排错。对象寻址三种定位对象的方式无论是--op list的过滤还是位置参数对象操作都需要回答“操作哪个对象”。从 usage() 的说明 可以归纳为三种方式JSON 对象描述推荐使用--op list输出的 JSON 作为对象标识。例如{oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:}该 JSON 由ghobject_t::dump()生成见 dump_object()各字段含义字段含义oid对象名object namekey对象在 PG 内的 hash key通常为空字符串snapid快照 ID-2表示 head 对象-1表示 snapdir0为具体快照hash对象在 PG 内的 placement hash 值max对象所在 PG 的最大 hash 范围pool池 IDpool idnamespace对象所属命名空间namespace对象名称直接传对象名工具会在该 OSD 的所有 PG 中查找此时通常需配合--pool、--namespace、--head等选项缩小范围。空字符串配合--pgid使用表示pgmeta 对象PG 的元数据对象。环境准备确保 OSD 停止所有对象修改操作的第一步都是确认 OSD 已停止systemctl status ceph-osd$OSD_NUMBER示例[rootosd ~]# systemctl status ceph-osd1若使用 cephadm 部署停止 OSD 的方式为ceph orch daemon stop osd.$ID随后可用ceph orch daemon start osd.$ID恢复。只要 OSD 进程未退出工具就无法独占挂载 ObjectStore。--op 命令模式OSD/PG 级操作全解--op参数支持以下命令源码 main() 选项定义 中的完整列表比 man 页多出trim-pg-log-dups与statfs命令作用是否需要--pgidinfo输出指定 PG 的信息是log输出指定 PG 的 PGLog是remove移除整个 PG是mkfs在--data-path创建新的对象存储文件系统否fsck检查对象存储一致性否repair修复对象存储不一致问题否fuse以 FUSE 方式挂载对象存储用于检查否dup将对象存储复制到--target-data-path指定的目标否export导出 PG 到--file指定的文件是export-remove导出 PG 后从原 OSD 移除是import从--file导入 PG否list列出 OSD或指定 PG中的对象可选list-slow-omap列出读取速度超过阈值--slow-omap-threshold默认 16 秒的 OMAP可选fix-lost修复丢失lost的对象可选list-pgs列出 OSD 上的所有 PG否dump-super输出 superblock 信息否meta-list列出元数据集合中的对象否get-osdmap获取 osdmap--epoch指定版本到--file否set-osdmap从--file设置 osdmap否get-superblock获取 superblock 到--file否set-superblock从--file设置 superblock否get-inc-osdmap获取增量 osdmap 到--file否set-inc-osdmap从--file设置增量 osdmap否mark-complete将 PG 标记为 complete是reset-last-complete重置 PG 的 last_complete 指针否update-mon-db用 monstore--mon-store-path更新 mon DB否dump-export以可读格式 dump 导出文件--dump-data-dir指定数据目录否trim-pg-log裁剪 PGLog是trim-pg-log-dups裁剪 PGLog 中的重复条目是statfs输出对象存储的文件系统统计信息否列出对象与 PG列出 OSD 内全部对象ceph-objectstore-tool --data-path $PATH_TO_OSD --op list列出指定 PG 内全部对象ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID --op list查找某对象所属的 PGceph-objectstore-tool --data-path $PATH_TO_OSD --op list $OBJECT_ID--op list底层调用 do_list()内部使用lookup_ghobject遍历对象支持--pgid精确限定 PG、--namespace限定命名空间、--head只找 head/snapdir 对象输出格式由--format控制默认json-pretty。修复丢失对象fix-lost当 PG 出现 lost 对象例如 OSD 数据损坏或 peering 失败后标记丢失时可用fix-lost修复修复全部丢失对象ceph-objectstore-tool --data-path $PATH_TO_OSD --op fix-lost修复指定 PG 内的丢失对象ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID --op fix-lost按对象 ID 修复单个丢失对象ceph-objectstore-tool --data-path $PATH_TO_OSD --op fix-lost $OBJECT_ID修复 legacy遗留丢失对象同样使用--op fix-lost源码中的 fix-lost 分支 在未指定--pgid时遍历 OSD 全部对象、指定--pgid时仅遍历该 PG 内的对象action_on_all_objects_in_exact_pg。注意修复 lost 对象属于数据一致性层面的高危操作fix-lost的结果取决于 PG 剩余副本的状态执行前务必先备份 OSD 数据目录。其他常用运维命令查看 PG 信息与日志--op info、--op log均需--pgidfsck 与 repair--op fsck检查对象存储一致性发现问题后--op repair修复。这是排查 OSD 无法启动、journal 报错时的高频组合PG 导出/导入--op export --pgid $PG_ID --file /path/to/export导出 PG 数据可用于迁移或灾备--op import --file /path/to/export导入list-pgs快速列出 OSD 上所有 PG可用于核对 PG 分布位置参数模式对象级操作实战位置参数模式的语法为ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT command支持的完整命令列表来自 usage()比 man 页更完整命令语法说明get-bytes/set-bytes(get\|set)-bytes [file]获取/设置对象原始字节内容set-attrs/set-omapset-(attr\|omap) key [file]设置对象属性或 OMAP 键值get/rm-(attr\|omap)(get\|rm)-(attr\|omap) key获取/删除属性或 OMAP 键get-omaphdrget-omaphdr获取 OMAP 头set-omaphdrset-omaphdr [file]设置 OMAP 头list-attrslist-attrs列出对象全部属性list-omaplist-omap列出 OMAP 全部键remove/removeallremove\|removeall删除对象 / 连同克隆一并删除dumpdump输出对象完整信息数据、属性、OMAP 等set-sizeset-size设置对象大小clear-data-digestclear-data-digest清除对象数据摘要digestremove-clone-metadataremove-clone-metadata cloneid删除指定克隆的元数据clear-snapsetclear-snapset [(corrupt\|seq\|snaps\|clones\|clone_size\|clone_overlap\|size)]清除/破坏 SnapSet 的指定部分[file]参数缺省或为-时读写标准输入/输出见 usage()因此可以用重定向操作文件。操作对象内容get-bytes / set-bytes这是最典型的“备份—修改—写回”工作流1. 确认 OSD 已停止systemctl status ceph-osd$OSD_NUMBER2. 通过--op list找到目标对象的 JSON 描述。3. 备份并建立工作副本语法与示例ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT get-bytes $OBJECT_FILE_NAME[rootosd ~]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} get-bytes zone_info.default.backup [rootosd ~]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} get-bytes zone_info.default.working-copy第一条命令生成备份第二条命令生成工作副本。4. 编辑工作副本文件。5. 写回对象字节ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT set-bytes $OBJECT_FILE_NAME[rootosd ~]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} set-bytes zone_info.default.working-copy提示get-bytes输出的是原始字节流修改时应保持对象语义如 RGW 的 zone_info、RBD 的元数据对象等避免破坏上层格式。删除对象remove / removeall删除对象会将其内容与引用从 PG 中移除语法ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT remove示例[rootosd ~]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} remove源码中 remove_object() 与 do_remove_object() 揭示了两个关键行为remove与removeall的区别当对象存在克隆clone时仅删除 head/snapdir 会报错Clones are present, use removeall to delete everything必须用removeall连同全部克隆一起删除remove在删除对象的同时会通过SnapMapper::remove_oid清理对应的快照映射记录保证快照一致性若 SnapSet 损坏需配合--force才能强制删除 head/snapdir源码会提示 WARNING: only removing head with clones present。列出对象映射list-omapOMAP 是对象附带的键值存储底层为 RocksDB 等 KV 后端list-omap输出该对象的所有 OMAP 键1. 确认 OSD 停止systemctl status ceph-osd$OSD_NUMBER2. 列出 OMAPceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT list-omap[rootosd ~]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} list-omapdo_list_omap() 通过ObjectStore::omap_get_keys读取全部键输出为键列表。list-slow-omap命令则用于找出 OMAP 读取耗时超过阈值--slow-omap-threshold默认 16 秒的对象帮助定位 OMAP 膨胀导致的慢请求。操作 OMAP 头get-omaphdr / set-omaphdr工具输出对象 OMAP 头及其关联的键值。前置条件OSD 节点上的 root 权限停止 ceph-osd 守护进程验证 OSD 停止[rootosd ~]# systemctl status ceph-osd1获取 OMAP 头ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT get-omaphdr $OBJECT_MAP_FILE_NAME[rootosd ~]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} get-omaphdr zone_info.default.omaphdr.txt设置 OMAP 头ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT set-omaphdr $OBJECT_MAP_FILE_NAME[rootosd ~]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} set-omaphdr zone_info.default.omaphdr.txt操作 OMAP 键get-omap / set-omap / rm-omap需要提供数据路径、PG ID、对象以及 OMAP 中的键。以下命令需以root在 OSD 节点上执行。获取 OMAP 键ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT get-omap $KEY $OBJECT_MAP_FILE_NAMEceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} get-omap zone_info.default.omap.txt设置 OMAP 键ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT set-omap $KEY $OBJECT_MAP_FILE_NAMEceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} set-omap zone_info.default.omap.txt删除 OMAP 键ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT rm-omap $KEYceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} rm-omap get_omap() 显示set-omap底层通过t-omap_setkeys(coll, hoid, os.omap)写入键值对且 OMAP 数据以omap_section结构编码存储说明导入文件必须符合该编码格式即由get-omap原样导出的文件。列出对象属性list-attrs前置条件root 权限 停止 ceph-osd。验证 OSD 停止[rootosd ~]# systemctl status ceph-osd1列出对象属性ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT list-attrs[rootosd ~]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} list-attrs输出为对象的键值属性对。属性xattr中包含了 Ceph 内部元数据如_即OI_ATTR对象信息、snapset等list-attrs有助于排查对象信息损坏问题。操作对象属性键get-attrs / set-attrs / rm-attrs操作对象属性需要数据路径、PG ID、对象以及属性键。前置条件root 权限 停止 ceph-osd。验证 OSD 停止systemctl status ceph-osd$OSD_NUMBER获取对象属性ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT get-attrs $KEY $OBJECT_ATTRS_FILE_NAME[rootosd ~]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} get-attrs oid zone_info.default.attr.txt设置对象属性ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT set-attrs $KEY $OBJECT_ATTRS_FILE_NAME[rootosd ~]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} set-attrs oid zone_info.default.attr.txt删除对象属性ceph-objectstore-tool --data-path $PATH_TO_OSD --pgid $PG_ID $OBJECT rm-attrs $KEY[rootosd ~]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0 --pgid 0.1c {oid:zone_info.default,key:,snapid:-2,hash:235010478,max:0,pool:11,namespace:} rm-attrs oid高级对象操作dump / set-size / clear-data-digest / clear-snapset除 man 页列举的命令外源码 usage() 还暴露了若干供故障排查使用的高级对象命令dump输出对象的完整信息包括数据TYPE_DATA、属性TYPE_ATTRS、OMAP 头TYPE_OMAP_HDR、OMAPTYPE_OMAP各段见 dump_object()。适合在不导出文件的情况下快速检查对象结构。set-size直接设置对象的大小字段见 set_size()当对象大小元数据与实际数据不符时可手工修正。clear-data-digest清除对象信息中保存的数据摘要data digest。源码 clear_data_digest() 通过读取OI_ATTR属性、调用oi.clear_data_digest()后将对象信息编码写回用于解决“数据完整、但 digest 不匹配”导致的 scrub/读取报错。clear-snapset清除或破坏 SnapSet 的指定部分。子选项corrupt清除整个 SnapSetseq/snaps/clones/clone_size/clone_overlap/size分别对应SnapSet.seq、clone_snaps、clones、clone_size、clone_overlap与克隆大小见 clear_snapset()。这是有意的“破坏性”操作仅用于测试或极端数据抢救场景。选项Options完整参考选项说明--help输出帮助信息--type arg对象存储类型[bluestore (默认), memstore]仅当工具无法从--data-path判断类型时需要--data-path arg对象存储路径必填--journal-path argjournal 路径工具找不到 journal 时使用--pgid argPG IDinfo、log、remove、export、export-remove、mark-complete、trim-pg-log等操作必填--pool arg池名称按名称过滤对象时使用--op arg操作命令取值见上文--op命令表--epoch argget-osdmap/get-inc-osdmap使用的 epoch 号缺省为当前 epoch--file argexport、export-remove、import、get-osdmap、set-osdmap、get-superblock、set-superblock、get-inc-osdmap、set-inc-osdmap使用的文件路径--mon-store-path argupdate-mon-db使用的 monstore 路径--fsid argmkfs新建对象存储时使用的 fsid--target-data-path arg--op dup的目标对象存储路径--mountpoint argFUSE 挂载点--op fuse--format arg输出格式json、json-pretty默认、xml、xml-pretty--debug向 stderr 输出诊断信息--force忽略部分类型错误继续执行 ——务必谨慎使用现在或将来可能造成数据损坏--skip-journal-replay跳过 journal 重放--skip-mount-omap跳过 OMAP 挂载--head按名称搜索对象时查找 head/snapdir 对象--dry-run不实际修改对象存储演练模式--namespace arg搜索对象时指定命名空间--rmtype arg指定破坏性对象删除方式snapmap或nosnapmap——仅供测试使用另有源码中可见的补充选项--target-version日志扩展的目标版本、--no-mon-config不联系 mon 获取配置、--no-superblock不读取 superblock、--tty将 stdout 视为 tty禁止二进制输出、--slow-omap-thresholdlist-slow-omap的慢阈值秒、--dump-data-dirdump-export的数据输出目录见 main() 选项定义。使用建议任何修改类操作前先用--dry-run演练确认影响范围后再实际执行--force、--rmtype属于高危开关除非明确知道后果否则不要使用。错误码与排错Error CodesMount failed with (11) Resource temporarily unavailable通常意味着你试图在一个正在运行的 OSD上执行 ceph-objectstore-tool。工具无法与运行中的 OSD 共享对象存储锁请先停止 OSDsystemctl stop ceph-osd$OSD_NUMBER再操作。Mount failed with (1) Operation not permitted对于加密 OSD这通常表示 LUKS 映射已关闭。使用 cephadm 停止 OSD 时会执行ceph-volume lvm deactivate从而关闭该映射而 ceph-objectstore-tool不会自动解锁 LUKS。解决方法是在不启动ceph-osd的情况下重新打开映射例如使用ceph-volume lvm activate重新激活对应卷再运行工具。Clones are present, use removeall to delete everything删除 head/snapdir 时对象仍存在克隆需改用removeall或配合--force会警告仅删除 head 并保留克隆。安全边界与最佳实践先停止 OSD再操作所有修改命令都要求 OSD 离线这是工具安全性的第一道防线。备份优先任何set-*/remove/clear-*操作前先用get-bytes、get-omaphdr、get-omap、get-attrs或--op export建立完整备份确保可回滚。善用--dry-run对于fix-lost、repair、mark-complete等批量操作先 dry-run 观察输出。区分remove与removeall克隆存在的对象必须用removeall若不确定先dump或list-omap检查对象结构。加密 OSD 的特殊处理LUKS 未映射时工具无法挂载需要先用ceph-volume激活卷不启动 OSD再运行工具。避免在集群正常运行时使用ceph-objectstore-tool 绕过所有 Ceph 协议层直接读写磁盘仅应在 OSD 无法启动、数据抢救、底层一致性修复等离线场景使用。Installation 安装ceph-osd软件包提供ceph-objectstore-tool。构建产物安装于bin目录见 src/tools/CMakeLists.txt随 OSD 部署一并提供无需单独安装。该工具是 Ceph一个大规模可扩展的开源分布式存储系统的组成部分更多信息可参阅 Ceph 官方文档。赞分享存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载相关推荐Ceph ceph-monstore-tool 完整指南离线操控 Monitor 数据库monstore的命令详解与故障恢复实战Ceph ceph monstore tool 完整指南离线操控 Monitor 数据库monstore的命令详解与故障恢复实战 ceph monstor存储分布式文件系统对象存储后端高可用Ceph ceph-volume 完全指南基于 LVM 的 OSD 部署、激活与迁移实战Ceph ceph volume 完全指南基于 LVM 的 OSD 部署、激活与迁移实战 ceph volume 是 Ceph 集群中负责部署和管理 OSD存储分布式文件系统对象存储后端高可用Ceph kvstore 离线操作完全指南ceph-kvstore-tool 的 18 个命令深度解析Ceph kvstore 离线操作完全指南ceph kvstore tool 的 18 个命令深度解析 本文基于 Ceph 官方 man page doc/存储分布式文件系统对象存储后端高可用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考