Ceph 的存储方式——RBD 块存储

1、简介

RADOS Block Device(RBD) 是 Ceph 集群提供的一种高性能、分布式、可扩展的虚拟块设备服务。它基于 Ceph 的底层对象存储系统 RADOS 实现,将对象存储池中的对象组合成一个连续的逻辑块设备,并通过 librbd 库或内核模块映射到客户端使用。

RBD 在使用方式上与普通硬盘无异,可以进行格式化、分区、挂载等操作,同时继承了 Ceph 的核心优势——高可用性、高可靠性、线性扩展

在云计算、容器、虚拟化、数据库等场景中,RBD 扮演着后端存储的角色,可以为虚拟机提供系统盘、为数据库提供数据盘,甚至作为 Kubernetes 持久化卷(PV)存储应用数据。

2、特点

  • 高可靠性与数据安全
    • 基于 Ceph 的副本机制(默认 3 副本)或纠删码策略,保证数据在多副本、跨节点存储,即使某个 OSD 或节点宕机也能无缝恢复。
    • 数据分布自动化,避免单点故障。
  • 弹性扩容与在线伸缩
    • 支持在线调整容量,扩容过程无需卸载设备,不影响正在运行的业务。
    • 从几十 GB 到数百 TB 都可灵活调整,满足业务动态增长的需求。
  • 快照与克隆
    • 提供零拷贝快照,创建速度快,几乎不占用额外空间。
    • 支持基于快照的克隆,能快速创建多个副本(如云平台批量生成虚拟机镜像)。
  • 性能可水平扩展
    • 读写请求由多个 OSD 节点并行处理,随着集群规模增加,性能线性提升。
    • 客户端可通过内核 RBD 驱动或用户态 librbd API 调用,高效访问数据。
  • 多客户端挂载与共享
    • 单个 RBD 可被多个客户端挂载(配合 CephFS 或集群文件系统),适用于共享数据场景。
    • 在虚拟化环境中可直接作为虚拟机磁盘使用,无需中间存储层。
  • 无缝集成生态
    • 与 OpenStack Cinder、Kubernetes CSI、Proxmox、QEMU/KVM 等兼容。
    • 可替代传统 SAN、NAS 作为后端块存储方案。

3、使用场景

  • 云平台块存储
    • 在 OpenStack、CloudStack 等云平台中,RBD 常作为虚拟机的系统盘和数据盘后端存储。
    • 提供快照功能支持云平台镜像管理,快速创建/恢复虚拟机。
  • 数据库存储后端
    • 可用于 MySQL、PostgreSQL、MongoDB、ElasticSearch 等对 IOPS 和可靠性要求高的数据库系统。
    • 动态扩容适合业务数据快速增长的场景。
  • 虚拟化环境磁盘
    • 在 KVM/QEMU/Proxmox 中,RBD 可直接作为虚拟机磁盘映射,无需中间挂载,提高性能。
    • 结合快照功能,可快速回滚虚拟机状态。
  • Kubernetes 持久化存储(PV)
    • 通过 Ceph CSI 插件,RBD 可直接为 Kubernetes 提供动态 PV,适配 StatefulSet、数据库、缓存等有状态应用。
  • 大数据与分析平台
    • 可为 Hadoop、Spark、Flink 等计算平台提供分布式块存储,满足高吞吐和弹性需求。
  • 高性能计算(HPC)与 AI 训练
    • 可作为训练数据集存储盘,为 GPU 集群提供高速数据访问。
    • 快照与克隆可快速创建多份相同训练数据环境。

4、创建rbd池

确认是否有 rbd 池

~ ❯ ceph osd pool ls                                                                                             .mgr
cephfs.cephfs.meta
cephfs.cephfs.data

如果列表里没有 rbd,就需要先创建。

创建 rbd 池

ceph osd pool create rbd 128

128 是 PG 数量,可以根据集群规模调整。小型测试集群可以用 8 或 32,生产环境需根据 OSD 数量和 pgcalc 计算。

初始化 rbd 池

rbd pool init rbd

这一步是为了给池里创建 RBD 元数据对象,不初始化的话创建镜像会失败。

再次创建 RBD 镜像

rbd create myrbd --size 102400 --pool rbd

如果想换个池:

rbd create myrbd --size 102400 --pool mypool

验证

~ ❯ rbd ls rbd                                                                                               
myrbd

~ ❯ ceph osd pool ls                                                                                         
.mgr
cephfs.cephfs.meta
cephfs.cephfs.data
rbd

5、客户端挂载

~ ❯ sudo apt install ceph-common                                                                             
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
ceph-common is already the newest version (17.2.7-0ubuntu0.22.04.2).
0 upgraded, 0 newly installed, 0 to remove and 71 not upgraded.

~ ❯ sudo rbd map myrbd --pool rbd --id admin --keyring /etc/ceph/ceph.client.admin.keyring                   

~ ❯ lsblk                                                                                                   
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0  63.9M  1 loop /snap/core20/2105
loop1                       7:1    0    87M  1 loop /snap/lxd/27037
loop2                       7:2    0  40.4M  1 loop /snap/snapd/20671
loop3                       7:3    0  49.3M  1 loop /snap/snapd/24792
loop4                       7:4    0  63.8M  1 loop /snap/core20/2599
loop5                       7:5    0  89.4M  1 loop /snap/lxd/31333
sda                         8:0    0   128G  0 disk 
├─sda1                      8:1    0     1G  0 part /boot/efi
├─sda2                      8:2    0     2G  0 part /boot
└─sda3                      8:3    0124.9G  0 part 
  └─ubuntu--vg-ubuntu--lv 253:0    0124.9G  0 lvm  /
sdb                         8:16   0   200G  0 disk 
sdc                         8:32   0   200G  0 disk 
sdd                         8:48   0   200G  0 disk 
sr0                        11:0    1  1024M  0 rom  
rbd0                      252:0    0   100G  0 disk 

~ ❯ sudo mkfs.ext4 /dev/rbd0                                                                                 
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done                            
Creating filesystem with 26214400 4k blocks and 6553600 inodes
Filesystem UUID: ab6df4c8-f8a2-4119-859c-07ef0cf38c8e
Superblock backups stored on blocks: 
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done   


~ ❯ sudomkdir-p /mnt/ceph-rbd                                                                             

~ ❯ sudo mount /dev/rbd0 /mnt/ceph-rbd                                                                       

~ ❯ df -Th                                                                                                   
Filesystem                        Type            Size  Used Avail Use% Mounted on
tmpfs                             tmpfs           794M  1.1M  793M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv ext4            123G  9.5G  107G   9% /
tmpfs                             tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs                             tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda2                         ext4            2.0G  253M  1.6G  14% /boot
/dev/sda1                         vfat            1.1G  6.1M  1.1G   1% /boot/efi
tmpfs                             tmpfs           794M  4.0K  794M   1% /run/user/1000
ceph-fuse                         fuse.ceph-fuse  100G  2.3G   98G   3% /mnt/myshare
/dev/rbd0                         ext4             98G   24K   93G   1% /mnt/ceph-rbd

6、扩容

你现在 /dev/rbd0 是 Ceph RBD 映射出来的块设备,扩容流程分 两步

  • 扩 RBD 镜像本身(Ceph 集群侧)
  • 扩文件系统(客户端侧,让它用上新空间)

扩容 RBD 镜像

在 Ceph 集群任意有 ceph/rbd 命令的节点执行(也可以在客户端执行,如果配置了 ceph.conf 和 key):

bash复制编辑# 查看当前 RBD 信息
rbd info myrbd --pool rbd

# 扩容到 200G(单位 MB)
rbd resize myrbd --size 204800 --pool rbd
# 或者在原有大小基础上扩 50G
rbd resize myrbd --size +51200 --pool rbd

扩容完成后再确认

rbd info myrbd --pool rbd

扩容客户端文件系统

RBD 扩容后,客户端看到的 /dev/rbd0 也会变大,但是文件系统还不知道要用这部分空间,需要做扩展。

#ext4 文件系统
sudo resize2fs /dev/rbd0

#xfs 文件系统
sudo xfs_growfs /mnt/ceph-rbd

xfs 必须在挂载状态下扩容。

验证

~ ❯ df -h /mnt/ceph-rbd                                                                                     
Filesystem      Size  Used Avail Use% Mounted on
/dev/rbd0       197G   24K  188G   1% /mnt/ceph-rbd

⚠️ 注意事项

  • 扩容是 在线可执行 的,数据不会丢失,但最好提前做快照备份。
  • 如果是多客户端挂载(集群文件系统),要保证所有节点同步刷新文件系统大小。

✨ 只写原创,不接广告,不接广告,不接广告。

在这里,你将看到全新的技术分享、运维经验、以及最新的行业动态。我们坚信,原创内容才是最有价值的资源,所以所有文章都是独立创作,与你们一起成长。

声明:来自IT运维大爆炸,仅代表创作者观点。链接:https://eyangzhen.com/2235.html

IT运维大爆炸的头像IT运维大爆炸

相关推荐

关注我们
关注我们
购买服务
购买服务
返回顶部