欢迎光临
我们一直在努力

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 流程要点

  • 客户端(如 QEMU)将数据写入 RBD 设备。
  • RBD 将数据切分为 4MB 的对象(可调)。
  • 每个对象通过 pool + object_id 计算 PG,再通过 CRUSH 找到主 OSD。
  • 客户端与主 OSD 通信完成读写。
  • 写入时主 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、用户管理、多站点同步和配额控制。

    赞(0)
    未经允许不得转载:171主机测评 » Ceph系列第四期:Ceph块存储(RBD)精讲
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址