Ceph 生产环境搭建 | 第 10 天:Ceph 块存储 RBD 配置与生产实践

第 10/20 天

在 Ceph 存储生态中,块存储(RADOS Block Device,简称 RBD)是最核心、应用最广泛的一种数据访问接口。无论是为虚拟化平台提供虚拟磁盘,还是为 Kubernetes 集群提供持久化卷,亦或是为数据库提供高性能共享存储,RBD 都扮演着至关重要的角色。本篇将深入解析 RBD 的架构原理,并在 Ubuntu 24.04 LTS + Ceph Squid v19 环境下完成从镜像创建到客户端挂载的完整生产实践。

RBD 架构与工作原理

RBD 在 Ceph 体系中的位置

Ceph 提供三种存储接口:块存储(RBD)、对象存储(RGW)和文件系统(CephFS)。RBD 基于底层 RADOS 对象存储集群,将一个块设备镜像(image)切分为多个等大小的对象(object),直接分布在存储池的多个 OSD 上。

层级 组件 职责
客户端层 librbd / krbd RBD 客户端库与内核模块
接口层 RBD Image 虚拟块设备镜像管理
条带化层 stripe 将镜像分条写入对象
存储池层 Pool / PG 数据放置与 CRUSH 映射
存储层 OSD / BlueStore 实际数据持久化

数据流向与条带化机制

RBD 镜像由三层结构组成:image → stripe unit → object。每个 object 默认大小为 4 MB,再按 stripe unit(默认 64 KB)进行条带化。这种设计带来三大优势:

  • 并行 I/O:一个镜像的数据分布在数百个 OSD 上,客户端可并行读写
  • 精简置备(Thin Provisioning):创建镜像时只分配元数据,实际数据按需写入
  • 快照与克隆:基于 COW(Copy-On-Write)机制,快照零成本、克隆秒级完成

内核客户端 vs 用户态客户端

💻 代码示例

# 内核客户端 krbd:性能高,适用于裸机/虚拟机块设备挂载

modprobe rbd

ls /sys/bus/rbd/

 

# 用户态客户端 librbd:兼容性好,适用于 QEMU/KVM 虚拟机磁盘

qemu-img info rbd:pool-name/image-name

生产环境中,KVM 虚拟机磁盘推荐使用 librbd(通过 QEMU 直接调用),而宿主机直接使用块设备则用 krbd 内核模块。两者性能差异在 5%–10% 左右,内核客户端在高并发顺序写场景更优。

RBD 与存储池的关系

RBD 镜像必须创建在副本池上(纠删码池需通过特殊配置且限制较多,生产环境不推荐直接用于 RBD)。每个镜像在存储池中对应一个 rbd_directory 对象和多个数据对象:

💻 代码示例

{

"pool": "rbd-pool",

"image": "vm-disk-01",

"objects": 2560,

"object_size": "4M",

"stripe_unit": "64K",

"stripe_count": 8

}

部署实战:RBD 配置全流程

环境准备

假设集群已部署完毕(前 9 天内容),包含 3 MON、3 OSD 节点。现在需要在专用客户端节点上挂载 RBD 块设备。

💻 代码示例

# 在客户端节点安装 Ceph 客户端工具(Ubuntu 24.04)

apt update

apt install -y ceph-common librbd1

 

# 验证版本(Squid v19)

ceph –version

# 期望输出: ceph version 19.2.x (squid)

 

# 从管理节点拷贝 ceph.conf 和 keyring 到客户端

scp /etc/ceph/ceph.conf client-node:/etc/ceph/

scp /etc/ceph/ceph.client.admin.keyring client-node:/etc/ceph/

chmod 600 /etc/ceph/ceph.client.admin.keyring

 

# 确认客户端可访问集群

ceph -s

创建专用存储池

💻 代码示例

# 创建 RBD 专用副本池(生产环境推荐 size=3, min_size=2)

ceph osd pool create rbd-pool 128 128 replicated

 

# 设置存储池为 RBD 应用类型

ceph osd pool application enable rbd-pool rbd

 

# 查看 PG 数量是否符合预期

ceph osd pool get rbd-pool pg_num

ceph osd pool get rbd-pool size

上述命令中 128 是初始 PG 数,对于 3 节点 × 多盘环境,128 个 PG 可保证良好的数据分布。PG 数量规划详见第 8 天内容。

创建 RBD 镜像

💻 代码示例

# 创建一个 100GB 的精简置备镜像

rbd create vm-disk-01 –size 100G –pool rbd-pool

 

# 指定镜像特性(Squid 默认启用 layering, exclusive-lock, object-map, fast-diff)

rbd create vm-disk-02 –size 200G –pool rbd-pool

–image-feature layering,exclusive-lock,object-map,fast-diff,deep-flatten

 

# 查看镜像列表与详情

rbd ls rbd-pool

rbd info rbd-pool/vm-disk-01

输出示例:

💻 代码示例

rbd image 'vm-disk-01':

size 100 GiB, 25600 objects, order 22 (4 MiB objects)

snapshot_count: 0

id: 1a2b3c4d5e6f

block_name_prefix: rbd_data.1a2b3c4d5e6f

format: 2

features: layering, exclusive-lock, object-map, fast-diff, deep-flatten

op_features:

flags:

create_timestamp: Sat Oct 3 11:30:00 2026

access_timestamp: Sat Oct 3 11:30:00 2026

modify_timestamp: Sat Oct 3 11:30:00 2026

内核模块挂载 RBD

💻 代码示例

# 映射 RBD 镜像到本地块设备

rbd map rbd-pool/vm-disk-01 –name client.admin

 

# 查看映射结果

rbd showmapped

# 输出示例:

# id pool namespace image snap device

# 0 rbd-pool vm-disk-01 – /dev/rbd0

 

# 格式化块设备

mkfs.ext4 /dev/rbd0

 

# 挂载使用

mkdir -p /mnt/rbd-data

mount /dev/rbd0 /mnt/rbd-data

df -h /mnt/rbd-data

客户端专用用户权限配置

生产环境中不应将 admin keyring 分发给所有客户端,需要创建专用 RBD 用户:

💻 代码示例

# 创建仅可访问 rbd-pool 的客户端用户

ceph auth get-or-create client.rbd-user

mon 'profile rbd'

osd 'profile rbd pool=rbd-pool'

-o /etc/ceph/ceph.client.rbd-user.keyring

 

# 查看用户权限

ceph auth get client.rbd-user

 

# 客户端使用专用用户挂载

rbd map rbd-pool/vm-disk-01 –name client.rbd-user

–keyring /etc/ceph/ceph.client.rbd-user.keyring

开机自动挂载配置

💻 代码示例

# 方式一:通过 rbdmap 服务自动映射

cat > /etc/ceph/rbdmap << 'EOF'

rbd-pool/vm-disk-01 id=rbd-user,keyring=/etc/ceph/ceph.client.rbd-user.keyring

EOF

 

# 启用 rbdmap 服务

systemctl enable rbdmap

systemctl start rbdmap

 

# 方式二:fstab 挂载(注意 nofail 防止集群不可用时卡死启动)

echo "/dev/rbd/rbd-pool/vm-disk-01 /mnt/rbd-data ext4 defaults,noatime,nofail 0 0" >> /etc/fstab

mount -a

关键配置参数详解

镜像特性(features)

💻 代码示例

# 查看默认特性

ceph config get mgr rbd_default_features

 

# 修改全局默认特性(生产推荐值)

ceph config set mgr rbd_default_features 61

 

# 单个镜像修改特性

rbd feature disable rbd-pool/vm-disk-01 object-map fast-diff

rbd feature enable rbd-pool/vm-disk-01 object-map fast-diff

特性 值 说明
layering 1 支持克隆分层
striping v2 2 条带化 v2
exclusive-lock 4 排他锁,防多客户端并发写
object-map 8 对象映射,加速 I/O
fast-diff 16 快速差异计算
deep-flatten 32 快照扁平化
journaling 64 日志记录(用于异步镜像)

默认特性值 61 = layering(1) + exclusive-lock(4) + object-map(8) + fast-diff(16) + deep-flatten(32)。

块大小与条带化参数

💻 代码示例

# 创建时指定 object-size 和 stripe 参数

rbd create high-perf-disk –size 500G –pool rbd-pool

–object-size 8M

–stripe-unit 256K

–stripe-count 16

 

# 参数影响分析

# object-size: 越大顺序写越好,但故障恢复时单对象重平衡压力大

# stripe-unit: 越小随机写越平滑,但元数据开销增大

# stripe-count: 越大并行度越高,但单次写跨 OSD 数量多

RBD 缓存配置

💻 代码示例

# 客户端 librbd 缓存(写入 ceph.conf [client] 段)

cat >> /etc/ceph/ceph.conf << 'EOF'

 

[client]

rbd cache = true

rbd cache size = 33554432

rbd cache max dirty = 25165824

rbd cache target dirty = 16777216

rbd cache max dirty age = 1.0

rbd cache writethrough until flush = true

EOF

RBD 快照与克隆实战

快照管理

💻 代码示例

# 创建快照(需要先禁用 exclusive-lock 或使用 flatten)

rbd snap create rbd-pool/vm-disk-01@snap-2026-10-03

 

# 查看快照列表

rbd snap ls rbd-pool/vm-disk-01

 

# 保护快照(被保护的快照不可删除,防止克隆损坏)

rbd snap protect rbd-pool/vm-disk-01@snap-2026-10-03

 

# 从快照回滚(生产慎用,会丢失快照后的数据)

rbd snap rollback rbd-pool/vm-disk-01@snap-2026-10-03

 

# 清理快照

rbd snap unprotect rbd-pool/vm-disk-01@snap-2026-10-03

rbd snap remove rbd-pool/vm-disk-01@snap-2026-10-03

从快照克隆(分层镜像)

💻 代码示例

# 基于受保护的快照创建克隆镜像(瞬间完成,零数据拷贝)

rbd clone rbd-pool/vm-disk-01@snap-2026-10-03 rbd-pool/vm-disk-01-clone

 

# 查看克隆镜像的父子关系

rbd children rbd-pool/vm-disk-01@snap-2026-10-03

rbd info rbd-pool/vm-disk-01-clone

 

# 扁平化克隆(将父镜像数据拷贝到子镜像,解除依赖)

rbd flatten rbd-pool/vm-disk-01-clone

克隆机制非常适合虚拟机模板场景:先制作一个基础镜像快照,然后基于该快照克隆出数十台虚拟机,磁盘占用接近零。

K8s Logo

生产环境注意事项与踩坑提示

1. 内核版本兼容性

Squid v19 的 RBD 镜像默认启用了 object-map 和 fast-diff 特性,旧内核(< 5.4)的 krbd 模块不支持这些特性,映射时会报错 feature not supported。Ubuntu 24.04 内核为 6.8,完全兼容。但若客户端是旧系统,需在创建镜像时禁用不兼容特性:

💻 代码示例

# 为旧内核客户端创建兼容镜像

rbd create legacy-disk –size 50G –pool rbd-pool

–image-feature layering

2. 排他锁与多客户端风险

exclusive-lock 特性会阻止多个客户端同时写入同一个镜像。对于 QEMU/KVM 虚拟机迁移场景(live migration),这是必要保护。但如果你尝试在两台主机上同时 map 同一镜像并写入,后挂载的客户端会报错 Retrying, after attempting to obtain exclusive lock。需要多主机共享读时,使用 --read-only 参数映射。

3. discard/TRIM 支持

精简置备镜像需要正确配置 discard 才能回收已删除数据的空间,否则存储池空间只增不减:

💻 代码示例

# 挂载时启用 discard

mount -o discard /dev/rbd0 /mnt/rbd-data

 

# 或在 fstab 中配置

# /dev/rbd/rbd-pool/vm-disk-01 /mnt/rbd-data ext4 discard,noatime,nofail 0 0

 

# 手动触发 TRIM

fstrim /mnt/rbd-data

 

# 验证镜像实际占用空间

rbd du rbd-pool/vm-disk-01

4. 网络与 I/O 性能调优

💻 代码示例

# 客户端 I/O 调优参数(ceph.conf [client] 段)

rbd io_timeout = 120 # I/O 超时(秒),默认 60

rbd readahead trigger requests = 10

rbd readahead max bytes = 1048576 # 预读上限 1MB

 

# 查看实时 I/O 性能

ceph tell osd.* bench

rbd perf image iotop rbd-pool/vm-disk-01

5. 安全考量

  • admin keyring 绝不分发给普通客户端,必须创建专用用户并限制到具体存储池
  • 定期轮换 client keyring(ceph auth caps 修改权限后旧 key 立即失效)
  • RBD 块设备上的数据未加密,敏感数据建议在文件系统层使用 LUKS 加密

6. 监控 RBD 镜像健康

💻 代码示例

# 查看 RBD 镜像的 I/O 统计

rbd stats rbd-pool/vm-disk-01

 

# 集群级别的 RBD 监控

ceph df

rbd pool stats rbd-pool

常见问题

Q1: rbd map 报错 “sysfs write failed” 如何处理?

这是因为内核 krbd 模块不支持镜像启用的某些特性。执行 dmesg | grep rbd 查看具体不支持的特性名称,然后用 rbd feature disable 禁用对应特性后重新映射。

Q2: RBD 镜像删除后存储池空间未释放怎么办?

检查是否有快照引用该镜像。使用 rbd children 查看是否有克隆依赖,先 flatten 子镜像、删除快照,再删除镜像。删除后空间会异步回收,可用 ceph df 观察空间回收进度。

Q3: 生产环境中 RBD 镜像最大支持多大?

Ceph RBD 单镜像理论支持 8 EB(64 位寻址),但实际受限于存储池总容量和 OSD 数量。生产实践中,单个 RBD 镜像建议不超过 16 TB,超过此规模建议拆分为多个镜像,以降低快照/恢复时间和单镜像故障影响面。

总结

本篇深入讲解了 Ceph RBD 块存储的架构原理与数据流向,完成了从存储池创建、镜像创建、内核挂载、用户权限管理到快照克隆的完整生产部署流程。关键要点:RBD 基于 RADOS 实现精简置备与并行 I/O;生产环境必须用专用用户而非 admin;正确配置 discard 和缓存才能保证性能与空间利用率;快照克隆是虚拟化模板场景的利器。

RBD 是 Ceph 在虚拟化和容器化场景的核心武器,掌握它就掌握了 Ceph 块存储生产部署的全部能力。

下期预告

明天(第 11 天)将发布 Ceph 对象存储 RGW 网关部署与 S3 兼容,从 RGW 架构原理到 S3/Swift API 对接、多站点同步,全面覆盖 Ceph 对象存储生产部署,敬请期待。

系列目录

微信公众号二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像 - 恒星
欢迎您留下宝贵的见解!
提交
头像 - 恒星

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容