- 存储
- 分布式文件系统
- 对象存储
- 后端
- 高可用
【免费下载链接】ceph
Ceph is a distributed object, block, and file storage platform
导读
ceph-osd是 Ceph 分布式存储系统的对象存储守护进程(Object Storage Daemon),负责在本机存储上以冗余方式管理数据,并经由网络向客户端提供数据访问能力。本文以 doc/man/8/ceph-osd.rst 为骨架,结合 src/ceph_osd.cc 入口源码与 src/os/ObjectStore.h 底层抽象接口,系统讲解ceph-osd的全部命令行选项、对象存储初始化(mkfs)、日志(journal)创建/检查/冲刷等运维操作的原理与实战用法。读完本文,你将能够独立完成一个 OSD 数据目录的创建、密钥生成、日志维护与故障恢复,并理解这些命令在源码层面的真实执行路径。
一、ceph-osd 在 Ceph 架构中的角色
Ceph 集群由三类守护进程构成:monitor(ceph-mon)、元数据服务器(ceph-mds)与对象存储守护进程(ceph-osd)。其中ceph-osd承担最核心的数据面职责:
- 在本地存储(对象存储后端,如 BlueStore、Filestore)上管理对象数据;
- 通过冗余副本或纠删码机制保证数据可靠性;
- 通过网络向客户端(RADOS 客户端、RBD、RGW、CephFS)提供数据访问;
- 参与 PG(Placement Group)的复制、恢复与再均衡。
从启动流程看,ceph-osd是一个可独立执行的系统级守护进程,其入口位于 src/ceph_osd.cc 的main()函数(src/ceph_osd.cc#L124)。它先解析 OSD 专属参数,再通过Preforker完成守护进程化(daemonize)控制,随后创建对象存储实例、建立 Messenger 网络层,最终构造并启动OSD对象(src/ceph_osd.cc#L716)。
二、命令语法(Synopsis)
ceph-osd的基础调用形式如下:
ceph-osd -i osdnum [ --osd-data datapath ] [ --osd-journal journal ] [ --mkfs ] [ --mkjournal ] [ --flush-journal ] [ --check-allows-journal ] [ --check-wants-journal ] [ --check-needs-journal ] [ --mkkey ] [ --osdspec-affinity ]其中:
-i osdnum:必选参数,指定本 OSD 的编号(ID)。源码中通过g_conf()->name.get_id()解析该编号并转为整数whoami(src/ceph_osd.cc#L272-L279),若编号非法或缺失,守护进程会直接报错退出:must specify '-i #' where # is the osd number。- 其余选项均为可选项,按用途可分为数据路径、日志、初始化、查询与控制模式几大类,下文逐一详解。
三、核心概念:数据路径与日志(Journal)
ceph-osd的数据布局包含两个关键路径:
--osd-data datapath:对象数据所在目录。对于 Filestore 后端,该目录应位于 XFS 文件系统上;对于 BlueStore 后端,该目录通常包含block、block.db等符号链接指向的块设备。启动时ceph-osd会从datapath/type文件读取对象存储类型(filestore/bluestore等),若该文件缺失,则根据目录结构推断类型(存在current/目录则推断为 Filestore,存在block符号链接则推断为 BlueStore),见 src/ceph_osd.cc#L286-L324。--osd-journal journal:日志文件或块设备路径。日志是可选的,并且只有在与datapath位于不同磁盘时才会带来性能提升。日志存储介质应选用低延迟设备(理想情况下是 SSD)。
需要说明:日志机制主要服务于 Filestore 后端。在当前的 Ceph 版本中,BlueStore 后端已经用自身的双写(写 WAL、写数据)设计取代了传统独立日志,这一点可以从 src/os/bluestore/BlueStore.h#L3147-L3149 看出——BlueStore 对
needs_journal()、wants_journal()、allows_journal()三个接口均返回false。因此日志相关选项在实践中最常出现在 Filestore 后端的存量集群运维场景。
四、命令行选项全解(Options)
以下逐一说明ceph-osd的选项,并标注其源码实现依据。
4.1 运行模式选项
| 选项 | 说明 |
|---|---|
-f, --foreground | 前台运行:启动后不守护进程化,也不生成 pid 文件。适合通过ceph-run之类的包装工具运行,便于调试与日志采集。 |
-d | 调试模式:等同于-f,并且额外将所有日志输出到 stderr。 |
源码中守护进程化由Preforker与全局配置daemonize共同控制:ceph-osd先完成global_init_prefork/forker.prefork(),在真正启动 OSD 后才调用forker.daemonize()转入后台(src/ceph_osd.cc#L209-L225、src/ceph_osd.cc#L756-L759)。
4.2 用户与权限选项
| 选项 | 说明 |
|---|---|
--setuser userorgid | 启动后切换 UID。若指定的是用户名,则查询用户记录获得 uid 与 gid,并同时设置 gid(除非同时指定了--setgroup)。 |
--setgroup grouporgid | 启动后切换 GID。若指定组名,则查询组记录获得 gid。 |
这两个选项用于以 root 启动、随后降权运行的安全实践,避免 OSD 常驻进程持有过高的系统权限。
4.3 数据路径与日志选项
| 选项 | 说明 |
|---|---|
--osd-data osddata | 使用osddata处的对象存储。启动时若该路径为空,进程会报错must specify '--osd-data=foo' data path并退出(src/ceph_osd.cc#L281-L284)。 |
--osd-journal journal | 将日志更新写到journal(文件或块设备)。 |
4.4 日志检查选项(check 系列)
| 选项 | 说明 |
|---|---|
--check-wants-journal | 检查是否期望(prefer)使用日志。 |
--check-allows-journal | 检查是否允许(allow)使用日志。 |
--check-needs-journal | 检查是否必须(require)使用日志。 |
这三个选项对应ObjectStore抽象基类的三个虚接口(src/os/ObjectStore.h#L303-L305):
virtual int mkjournal() = 0; // journal only virtual bool needs_journal() = 0; //< requires a journal virtual bool wants_journal() = 0; //< prefers a journal virtual bool allows_journal() = 0; //< allows a journal在 src/ceph_osd.cc#L420-L446 中,三个选项分别调用store->wants_journal()、store->allows_journal()、store->needs_journal(),输出wants journal: yes/no等结果,并以退出码 0(是)或 1(否)表达结果。不同后端实现不同:
- BlueStore:src/os/bluestore/BlueStore.h#L3147-L3149 三个接口全部返回
false,即不需要、不期望、也不允许独立日志; - MemStore(内存测试后端):src/os/memstore/MemStore.h#L272-L280 同样全部返回
false; - Filestore 则返回
true(依赖日志保证崩溃一致性)。
这些检查常用于部署脚本判断目标对象存储后端是否需要配置osd_journal。
4.5 初始化选项
| 选项 | 说明 |
|---|---|
--mkfs | 创建空的对象存储仓库,同时初始化日志(若定义了日志)。这是 OSD 上线前最关键的初始化命令。 |
--mkkey | 生成新的密钥(secret key)。通常与--mkfs组合使用,比手工调用ceph-authtool生成密钥更方便。 |
--mkjournal | 为已存在的对象存储仓库创建新的日志文件。当日志设备或文件因磁盘/文件系统故障被抹掉时非常有用。 |
--mkfs的完整执行链路如下(src/ceph_osd.cc#L366-L386):
- 校验集群
fsid已配置(配置项fsid,不可为零值),否则报错must specify cluster fsid; - 调用
OSD::mkfs()(实现在 src/osd/OSD.cc#L2151-L2232):- 写入 OSD uuid(
osd_uuid配置项); - 调用
store->mkfs()初始化底层对象存储; - 挂载存储,检查/创建 OSD 超级块(
OSDSuperblock),其中记录cluster_fsid、osd_fsid、whoami与兼容特性集(compat_features),写入OSD_SUPERBLOCK_GOBJECT; - 调用
OSD::write_meta()(src/osd/OSD.cc#L2282-L2345)写入magic、whoami、ceph_fsid、osd_key、osdspec_affinity、ceph_version_when_created、created_at、ready等元数据文件;
- 写入 OSD uuid(
- 输出
created object store <path> for osd.<id> fsid <fsid>后以 0 退出。
--mkkey的实现位于 src/ceph_osd.cc#L339-L364:它加载keyring配置指定的密钥环文件,若其中已有该实体(EntityName)的密钥则提示已存在,否则用 AES256 算法生成新密钥(CEPH_CRYPTO_AES256KRB5)并写入密钥环(权限 0600)。
--mkjournal的实现位于 src/ceph_osd.cc#L407-L419:直接调用store->mkjournal()为已有对象存储重建日志,成功输出created new journal <path> for object store <path>。
4.6 日志维护选项
| 选项 | 说明 |
|---|---|
--flush-journal | 将日志中的内容冲刷(flush)到永久存储。该操作在前台运行,完成后即可确认;适合在需要调整日志大小或销毁日志设备前执行,保证不丢失数据。 |
源码实现见 src/ceph_osd.cc#L447-L463:挂载对象存储(store->mount())、卸载(store->umount()),挂载/卸载动作本身即完成日志回放与冲刷。注意与ObjectStore::flush_journal()(src/os/ObjectStore.h#L786)区分——后者是存储层的可选接口,默认返回-EOPNOTSUPP。
4.7 查询选项(fsid 系列)
| 选项 | 说明 |
|---|---|
--get-cluster-fsid | 打印集群 fsid(uuid)后退出。 |
--get-osd-fsid | 打印本 OSD 的 fsid 后退出。OSD 的 uuid 在--mkfs时生成,因而对 OSD 的每次特定实例化都是唯一的。 |
--get-journal-fsid | 打印日志的 uuid。日志 fsid 在--mkfs时被设置为与 OSD fsid 一致。 |
源码实现上,这些选项在读取 OSD 超级块之后执行(src/ceph_osd.cc#L522-L529)。其中--get-journal-fsid实际复用了--get-device-fsid路径:它把osd_journal配置值作为设备路径,调用ObjectStore::probe_block_device_fsid()探测块设备上的 fsid(src/ceph_osd.cc#L229-L244)。这些查询常用于脚本化部署与故障排查,例如确认 OSD 与日志设备是否配对正确。
提示:
ceph-osd还支持--get-device-fsid PATH(探测块设备 fsid)、--dump-journal(导出日志内容)、--run-benchmark(对 OSD 执行吞吐基准测试并输出 JSON 结果)等扩展参数,详见 src/ceph_osd.cc#L92-L122 的 usage 输出。
4.8 配置与连接选项
| 选项 | 说明 |
|---|---|
-c ceph.conf, --conf=ceph.conf | 使用指定的ceph.conf配置文件,替代默认的/etc/ceph/ceph.conf,用于读取运行时配置项。 |
-m monaddress[:port] | 直接连接指定的 monitor 地址,而不去ceph.conf中查找 monitor 列表。 |
4.9 亲和性选项
| 选项 | 说明 |
|---|---|
--osdspec-affinity | 为 OSD 设置与某个 OSDSpec 的亲和性。该选项只能与--mkfs组合使用。 |
实现上,--osdspec-affinity接收一个字符串参数(src/ceph_osd.cc#L169-L170),在OSD::mkfs()末尾通过OSD::write_meta()将osdspec_affinity写入数据目录的元数据文件(src/osd/OSD.cc#L2323-L2327)。该机制用于 cephadm 等编排工具按 spec 管理 OSD 归属。
五、实战:完整初始化一个 OSD
将上述选项串联起来,一个典型的 OSD 数据目录初始化流程如下(可参考仓库中的部署脚本 src/script/add_osd.sh):
# 1. 向集群注册新 OSD,获得 OSD id(示例为 osd.0)与 secret # (脚本中使用: ceph osd new $uuid -i osd0/new.json) # 2. 用 --mkfs 初始化数据目录(同时可生成密钥、指定 osd-uuid 与 osdspec 亲和性) ceph-osd -i 0 \ --osd-data /var/lib/ceph/osd/ceph-0 \ --osd-journal /var/lib/ceph/osd/ceph-0/journal \ --mkfs \ --key <osd-secret> \ --osd-uuid <osd-uuid> \ --osdspec-affinity <osdspec-name> # 3. 启动 OSD 守护进程 ceph-osd -i 0 --osd-data /var/lib/ceph/osd/ceph-0 --osd-journal /var/lib/ceph/osd/ceph-0/journal其中:
--mkfs会完成对象存储后端初始化、OSD 超级块与全部元数据文件写入(见上文 4.5 节);--mkkey可以代替--key手工传参:ceph-osd -i 0 --mkfs --mkkey,由进程自动生成密钥并写入keyring配置指定的密钥环文件;- 初始化完成后,
--get-osd-fsid与--get-cluster-fsid可用于校验数据目录与集群的对应关系。
日志故障恢复流程
当 Filestore 后端的日志设备或日志文件因磁盘故障被抹掉时:
# 1. 确认后端确实需要日志(Filestore 返回 wants journal: yes) ceph-osd -i 0 --osd-data /var/lib/ceph/osd/ceph-0 --check-wants-journal # 2. 为已有对象存储重建日志 ceph-osd -i 0 --osd-data /var/lib/ceph/osd/ceph-0 \ --osd-journal /var/lib/ceph/osd/ceph-0/journal --mkjournal若需调整日志大小或更换日志设备,先执行--flush-journal将日志内容安全落盘,再做替换,避免数据丢失:
ceph-osd -i 0 --osd-data /var/lib/ceph/osd/ceph-0 \ --osd-journal /var/lib/ceph/osd/ceph-0/journal --flush-journal六、参数解析与启动流程的源码视角
从 src/ceph_osd.cc#L164-L203 可以看出,ceph-osd的参数解析采用逐项标志匹配(ceph_argparse_flag/ceph_argparse_witharg),并在解析完成后按优先级依次处理各个模式:
- 仅打印类:
--get-journal-fsid/--get-device-fsid→ 探测块设备 fsid; - 密钥类:
--mkkey→ 生成/写入密钥环; - 初始化类:
--mkfs→OSD::mkfs()建仓并写元数据; - 测试类:
--run-benchmark→ 挂载存储执行 OSD 基准测试; - 日志维护类:
--mkjournal→ 重建日志;--check-*→ 查询日志需求;--flush-journal→ 冲刷日志;--dump-journal→ 导出日志; - 升级类:
--convert-filestore→ 执行待处理的升级操作(store->upgrade()); - 常规启动:读取超级块(
OSD::peek_meta,src/osd/OSD.cc#L2347 起),校验 OSD 编号与 magic(CEPH_OSD_ONDISK_MAGIC)匹配,随后创建 Messenger 网络栈、MonClient,最终osdptr->init()进入服务状态。
理解这一顺序对排障很有帮助:例如--mkfs与--check-wants-journal同时给出时,前者优先;--get-osd-fsid只有在数据目录已初始化(存在可读的超级块)时才能正确输出,否则会报unable to open OSD superblock错误。
七、可用性与相关工具
ceph-osd是 Ceph 分布式存储系统(开源、可大规模扩展)的组成部分。它通常与其他守护进程协同工作,相关的手册页包括:
- ceph 命令行手册(
ceph(8)):集群管理命令入口; - ceph-mon 手册(
ceph-mon(8)):monitor 守护进程; - ceph-mds 手册(
ceph-mds(8)):元数据服务器守护进程; - ceph-authtool 手册(
ceph-authtool(8)):密钥环手工管理工具,可与--mkkey配合理解密钥机制; - ceph-run 手册(
ceph-run(8)):包装运行守护进程并输出日志,与-f/--foreground搭配使用。
结语
ceph-osd作为 Ceph 数据面的基石,其命令行工具虽看似简洁,却完整覆盖了对象存储初始化的全部生命周期:从--mkfs建仓、--mkkey签发密钥,到--mkjournal/--flush-journal的日志维护,再到--get-*-fsid的元数据校验。理解这些选项在 src/ceph_osd.cc 与 src/os/ObjectStore.h 中的实现路径,不仅能让你熟练完成 OSD 的部署与故障恢复,更能帮助你准确判断后端存储类型差异(如 BlueStore 无需独立日志)带来的行为差异,从而在运维与二次开发中做出正确决策。
- 存储
- 分布式文件系统
- 对象存储
- 后端
- 高可用
【免费下载链接】ceph
Ceph is a distributed object, block, and file storage platform
相关推荐
Ceph ceph-volume LVM activate 详解:OSD 激活的完整原理、命令与 systemd 流程
Ceph ceph volume LVM activate 详解:OSD 激活的完整原理、命令与 systemd 流程 Ceph 的 ceph volume 是
存储分布式文件系统对象存储后端高可用Ceph 单命令创建 OSD 全指南:ceph-volume lvm create 的 prepare + activate 一体化流程与实战配置
Ceph 单命令创建 OSD 全指南:ceph volume lvm create 的 prepare + activate 一体化流程与实战配置 ceph v
存储分布式文件系统对象存储后端高可用ceph-mon 完全指南:Ceph Monitor 守护进程的命令行选项、mkfs 初始引导与 Paxos 集群机制
ceph mon 完全指南:Ceph Monitor 守护进程的命令行选项、mkfs 初始引导与 Paxos 集群机制 本指南以 Ceph 官方手册页 ceph
存储分布式文件系统对象存储后端高可用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考