Ceph系列第四期:Ceph块存储(RBD)精讲

Ceph系列第四期:Ceph块存储(RBD)精讲

本期目标

  • 理解 RBD 的工作原理和 IO 流程
  • 掌握 RBD 镜像的创建、映射、格式化、挂载
  • 熟练使用 rbd 命令管理镜像(大小调整、重命名、复制、回收站)
  • 掌握 RBD 快照的创建、回滚、克隆
  • 掌握 RBD 导出/导入及增量备份恢复
  • 理解并配置 RBD Mirror 实现跨集群异步复制

前置要求 :已有一个运行正常的 Ceph 集群(参考第二期)。建议先在集群中创建专用的 rbd 存储池。


1. RBD 简介

RADOS Block Device (RBD) 是 Ceph 提供的块存储接口。它将块设备镜像(如虚拟机磁盘)以对象的形式存储在 Ceph 集群的池中,支持精简配置、快照、克隆、镜像等高级功能。

1.1 RBD 数据流

text

复制代码
应用 / 虚拟机
    │ 写入块数据
    ▼
librbd / krbd
    │ 切块(默认 4M)
    ▼
RBD 镜像(image)
    │ 对象名:rbd_data.<image_id>.<object_number>
    ▼
Pool (PG) → CRUSH → OSDs

1.2 RBD IO 流程要点

  1. 客户端(如 QEMU)将数据写入 RBD 设备。
  2. RBD 将数据切分为 4MB 的对象(可调)。
  3. 每个对象通过 pool + object_id 计算 PG,再通过 CRUSH 找到主 OSD。
  4. 客户端与主 OSD 通信完成读写。
  5. 写入时主 OSD 负责同步至副本 OSD。

2. 准备 RBD 池和用户

2.1 创建池并初始化

bash

复制代码
# 创建名为 images_pool 的副本池
ceph osd pool create images_pool 32 32

# 初始化池为 RBD 类型(相当于执行 application enable)
rbd pool init images_pool

# 验证
ceph osd pool ls detail | grep images_pool

输出应包含 'application rbd'

2.2 创建专用 Cephx 用户(推荐)

为避免使用 client.admin 进行日常操作,创建一个受限用户,仅授权访问 images_pool

bash

复制代码
ceph auth get-or-create client.rbd \
    mon 'profile rbd' \
    osd 'profile rbd' \
    -o /etc/ceph/ceph.client.rbd.keyring

参数解释:

  • mon 'profile rbd':预定义配置,允许用户查询 MON 并访问 RBD 相关功能。
  • osd 'profile rbd':允许用户读写 OSD 上的 RBD 数据。

3. RBD 镜像基本管理

3.1 创建镜像

bash

复制代码
# 语法:rbd create <pool>/<image_name> --size <size>
rbd create images_pool/webapp1 --size 1G

# 查看池中镜像列表
rbd ls images_pool
# 输出:webapp1

# 查看镜像详细信息
rbd info images_pool/webapp1

输出示例:

text

复制代码
rbd image 'webapp1':
  size 1 GiB in 256 objects
  order 22 (4 MiB objects)
  snapshot_count: 0
  id: acb9415d427f
  block_name_prefix: rbd_data.acb9415d427f
  format: 2
  features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
  ...

关键属性解释

  • order:对象大小,2^22 = 4 MiB,可调范围 1225(4K32M)。
  • features:镜像启用的功能,下面详细说明。

3.2 RBD 镜像功能

Feature 说明
layering 1 支持分层(快照和克隆的基础)
striping 2 支持条带化 v2
exclusive-lock 4 独占锁,防止多客户端冲突
object-map 8 对象映射,加速快照差异计算
fast-diff 16 快速比较快照差异
deep-flatten 32 支持扁平化所有快照
journaling 64 支持 RBD Mirror 日志模式

默认启用的功能:layering, exclusive-lock, object-map, fast-diff, deep-flatten

禁用/启用功能示例

bash

复制代码
# 禁用 object-map
rbd feature disable images_pool/webapp1 object-map

# 启用 object-map
rbd feature enable images_pool/webapp1 object-map

注意:layering 等不可变功能无法禁用。

3.3 调整镜像大小

bash

复制代码
# 扩容(在线,不影响使用)
rbd resize images_pool/webapp1 --size 2G

# 缩容(需谨慎,可能导致数据损坏)
rbd resize images_pool/webapp1 --size 1G --allow-shrink

缩容时,建议先确保文件系统也相应缩小(如 xfs_growfs 不能缩,resize2fs 可以缩)。

3.4 重命名和复制镜像

bash

复制代码
# 重命名(不能跨池)
rbd rename images_pool/webapp1 images_pool/webapp2

# 跨池复制
rbd cp images_pool/webapp2 images_pool_2/webapp2

images_pool_2 需要提前创建并 rbd pool init

3.5 回收站(Trash)管理

删除镜像时可以将其移入回收站,便于恢复。

bash

复制代码
# 移入回收站
rbd trash mv images_pool/webapp2

# 查看回收站
rbd trash ls images_pool
# 输出:<image_id> webapp2

# 恢复镜像(需使用 image_id)
rbd trash restore -p images_pool <image_id>

# 永久删除回收站中的镜像
rbd trash rm -p images_pool <image_id>

4. 使用 KRBD 映射并挂载 RBD

4.1 客户端安装和配置

在客户端节点(如 client)上操作:

bash

复制代码
# 安装 ceph-common
dnf install -y ceph-common

# 从管理节点复制配置文件和密钥环
scp root@ceph1:/etc/ceph/ceph.conf /etc/ceph/
scp root@ceph1:/etc/ceph/ceph.client.rbd.keyring /etc/ceph/

# 设置环境变量简化命令(可选)
export CEPH_ARGS='--id=rbd'

4.2 映射 RBD 镜像

bash

复制代码
# 映射(需要 root 权限)
rbd device map images_pool/webapp1
# 输出:/dev/rbd0

# 查看映射关系
rbd showmapped
# 或
rbd device list

4.3 格式化和挂载

bash

复制代码
# 格式化(示例:xfs)
mkfs.xfs /dev/rbd0

# 挂载
mkdir -p /webapp/webapp1
mount /dev/rbd0 /webapp/webapp1

# 测试写入
echo "Hello RBD" > /webapp/webapp1/index.html
df -h /webapp/webapp1

4.4 卸载和取消映射

bash

复制代码
umount /webapp/webapp1
rbd device unmap /dev/rbd0
# 或
rbd unmap images_pool/webapp1

4.5 开机自动挂载

编辑 /etc/ceph/rbdmap

bash

复制代码
images_pool/webapp1 id=rbd,keyring=/etc/ceph/ceph.client.rbd.keyring

编辑 /etc/fstab

bash

复制代码
/dev/rbd/images_pool/webapp1 /webapp/webapp1 xfs _netdev 0 0

启用服务:

bash

复制代码
systemctl enable rbdmap.service

5. RBD 快照管理

5.1 创建和查看快照

bash

复制代码
# 确保镜像未挂载或先 sync 数据
umount /webapp/webapp1

# 创建快照
rbd snap create images_pool/webapp1@snap1

# 列出快照
rbd snap ls images_pool/webapp1

5.2 回滚快照

bash

复制代码
# 先卸载并取消映射
umount /webapp/webapp1
rbd device unmap /dev/rbd0

# 回滚
rbd snap rollback images_pool/webapp1@snap1

# 重新映射、挂载,数据恢复至快照时状态

回滚前必须确保没有客户端使用该镜像(包括 map 和挂载)。

5.3 删除快照

bash

复制代码
# 删除单个快照
rbd snap rm images_pool/webapp1@snap1

# 删除所有快照
rbd snap purge images_pool/webapp1

6. RBD 克隆(Clone)

克隆是基于一个受保护的快照创建可写镜像,采用 COW(写时复制) 技术。

6.1 克隆步骤

bash

复制代码
# 1. 创建快照并保护(保护后可防止意外删除)
rbd snap create images_pool/webapp@snap1
rbd snap protect images_pool/webapp@snap1

# 2. 基于快照创建克隆
rbd clone images_pool/webapp@snap1 images_pool/webapp-clone-1

# 3. 克隆镜像可以正常映射、挂载(与普通镜像无异)
rbd map images_pool/webapp-clone-1
mount /dev/rbdX /mnt/clone

6.2 查看克隆关系

bash

复制代码
# 查看快照有哪些克隆
rbd children images_pool/webapp@snap1

6.3 扁平化(Flatten)

扁平化会将 COW 父级数据全部拷贝到克隆中,使克隆独立于父快照。

bash

复制代码
rbd flatten images_pool/webapp-clone-1

扁平化后无法再使用父快照回滚,但克隆可以完全独立删除父镜像。

6.4 克隆镜像的 UUID 冲突处理

克隆镜像与原始镜像有相同的文件系统 UUID,无法同时挂载到同一客户端。解决方法:

bash

复制代码
# 对于 xfs
xfs_admin -U generate /dev/rbdX

# 对于 ext4
tune2fs -U random /dev/rbdX

7. RBD 导出和导入

7.1 导出镜像到文件

bash

复制代码
# 导出整个镜像
rbd export images_pool/webapp webapp.img

# 导出快照
rbd export images_pool/webapp@snap1 webapp-snap1.img

7.2 从文件导入

bash

复制代码
# 导入(会创建新镜像)
rbd import webapp.img images_pool/webapp-restore

7.3 管道方式跨集群导出导入

bash

复制代码
# 同一集群内复制
rbd export images_pool/webapp - | rbd import - images_pool/webapp-copy

# 跨集群(通过 SSH)
rbd export images_pool/webapp - | ssh root@remote-cluster 'rbd import - images_pool/webapp-remote'

7.4 增量导出与导入

增量导出可以导出两个快照之间的变更,极大节省备份时间和空间。

bash

复制代码
# 创建两个快照
rbd snap create images_pool/data@snap1
# ... 写入数据 ...
rbd snap create images_pool/data@snap2

# 导出 snap1 → snap2 之间的增量
rbd export-diff --from-snap snap1 images_pool/data@snap2 inc_snap1_snap2.data

# 导入增量(目标镜像必须已有 snap1)
rbd import-diff inc_snap1_snap2.data images_pool/data

典型备份流程

  • 每周全量备份:rbd export
  • 每日增量备份:rbd export-diff --from-snap prev_snap ...

8. RBD 缓存调优

RBD 客户端(librbd)使用本地内存缓存提高性能,相关参数可通过 ceph config set 修改。

参数 默认值 说明
rbd_cache true 启用缓存
rbd_cache_policy writearound 模式:writearound / writeback / writethrough
rbd_cache_size 33554432 (32M) 每个镜像的缓存大小(字节)
rbd_cache_max_dirty 25165824 (24M) 最大脏数据字节数
rbd_cache_target_dirty 16777216 (16M) 开始刷新的脏数据阈值
rbd_cache_max_dirty_age 1 脏数据最大存活时间(秒)

示例:临时开启 writeback 模式

bash

复制代码
ceph config set client rbd_cache_policy writeback

注意:writeback 模式在客户端宕机时可能丢失数据,适合对性能要求高、可容忍部分数据丢失的场景。


9. RBD Mirror(跨集群异步复制)

RBD Mirror 可在两个 Ceph 集群之间异步复制 RBD 镜像,用于灾备。

9.1 概念

  • 单向(active-passive):一个主集群(可读写),一个或多个备集群(只读)。
  • 双向(active-active):两个集群同时可读写,互相复制(需应用层解决冲突)。
  • 模式
    • 基于日志(journal-based):每次写入先写日志,mirror 重放日志。性能开销大,但保证一致性。
    • 基于快照(snapshot-based):定期快照并传输差异。适合 RPO 较高的场景。

9.2 单向池模式配置(prod→backup)

前提
  • 两个集群(prod: ceph1~3,backup: ceph4~6)均已部署,且 HEALTH_OK
  • 两个集群中创建同名池 rbd 并初始化。

bash

复制代码
# 在两个集群都执行
ceph osd pool create rbd 32 32
rbd pool init rbd
步骤

1. 在主集群(prod)创建镜像并启用镜像功能

bash

复制代码
# 创建镜像时需开启 journaling 和 exclusive-lock
rbd create image1 --size 1024 --pool rbd --image-feature=layering,exclusive-lock,journaling

# 在池上启用 mirror(池模式)
rbd mirror pool enable rbd pool

2. 在主集群生成 bootstrap token

bash

复制代码
rbd mirror pool peer bootstrap create --site-name prod rbd > bootstrap_token_prod
# 将 token 复制到 backup 集群
rsync bootstrap_token_prod root@ceph4:

3. 在备集群部署 rbd-mirror 守护进程并导入 token

bash

复制代码
# 部署 rbd-mirror(假设 placement 为 ceph4)
ceph orch apply rbd-mirror --placement=ceph4.whisky.cloud

# 导入 token(单向复制,方向 rx-only)
rbd mirror pool peer bootstrap import --site-name backup --direction rx-only rbd bootstrap_token_prod

4. 验证状态

bash

复制代码
# 备集群查看
rbd mirror pool info rbd
rbd mirror pool status rbd
rbd info rbd/image1   # 应出现 mirroring state: enabled, mirroring primary: false

9.3 清理 Mirror 配置

bash

复制代码
# 删除对端
rbd mirror pool peer remove rbd <peer_uuid>
# 禁用池 mirror
rbd mirror pool disable rbd
# 删除 rbd-mirror 服务
ceph orch rm rbd-mirror

10. 常用命令速查表

操作 命令
创建镜像 rbd create <pool>/<img> --size <size>
列出镜像 rbd ls <pool>
查看镜像信息 rbd info <pool>/<img>
扩容 rbd resize <pool>/<img> --size <new>
缩容 rbd resize <pool>/<img> --size <new> --allow-shrink
重命名 rbd rename <pool>/<old> <pool>/<new>
复制 rbd cp <pool>/<src> <pool>/<dst>
移入回收站 rbd trash mv <pool>/<img>
恢复回收站 rbd trash restore -p <pool> <image_id>
映射 rbd map <pool>/<img>
取消映射 rbd unmap <pool>/<img>rbd device unmap /dev/rbdX
创建快照 rbd snap create <pool>/<img>@<snap>
回滚快照 rbd snap rollback <pool>/<img>@<snap>
保护快照 rbd snap protect <pool>/<img>@<snap>
克隆 rbd clone <pool>/<img>@<snap> <pool>/<clone>
扁平化 rbd flatten <pool>/<clone>
导出镜像 rbd export <pool>/<img> <file>
导入镜像 rbd import <file> <pool>/<img>
增量导出 rbd export-diff --from-snap <snap> <pool>/<img> <file>
增量导入 rbd import-diff <file> <pool>/<img>
启用池 mirror rbd mirror pool enable <pool> pool
生成 bootstrap token rbd mirror pool peer bootstrap create --site-name <name> <pool>
导入 token rbd mirror pool peer bootstrap import --site-name <name> --direction rx-only <pool> <token-file>

11. 本期小结

  • RBD 是 Ceph 的块存储接口,适用于虚拟机磁盘、云平台等场景。
  • 基本操作:创建、映射、挂载、扩容、快照、克隆。
  • 高级特性:回收站、增量备份恢复、跨集群 Mirror 灾备。
  • 性能调优:RBD 缓存模式(writeback/writethrough)可影响性能和数据安全。
  • Mirror 配置分基于日志和基于快照两种,需提前规划网络和故障转移策略。

下一期预告:Ceph 对象存储(RADOS Gateway),包括 S3/Swift 兼容 API、用户管理、多站点同步和配额控制。

相关推荐
青梅橘子皮1 小时前
Linux---命令行参数和环境变量
linux·运维·服务器
艾莉丝努力练剑1 小时前
【Linux网络】Linux 网络编程:传输层TCP(四)
linux·运维·服务器·网络·tcp/ip·http
载数而行5201 小时前
linux 6 定时任务指令
linux
深邃-1 小时前
【Web安全】-10-网站关键信息收集:目录扫描的概念,工具目录扫描(内含御剑,FindSomething安装链接),网站服务器收集,操作系统判断
运维·服务器·安全·web安全·http·网络安全
Shadow(⊙o⊙)1 小时前
库的制作与原理2.0---动静态链接,main全解析,CPU在执行文件时的作用,GOT表。
linux·运维·服务器
zincsweet1 小时前
System V 共享内存:原理剖析、代码架构分析与双端通信实战
linux·c++
EMTime10 小时前
Docker运行OpenWRT
运维·docker·容器
longxiangam10 小时前
esp-idf 中 mipi dsi 使用的笔记
笔记
lolo大魔王10 小时前
Linux 文件系统超全面详解(原理、结构、挂载、分区、inode、日志、管理命令)
linux·运维·服务器