Akemi

RADOS提供块存储RBD

2025/07/08
服务类型 是否依赖存储池 存储池用途 创建方式
RBD ✅ 必须绑定存储池 直接存储块设备镜像 rbd create -p <pool> ...
RGW ✅ 自动创建关联存储池 存储对象数据/元数据/索引 由 RGW 自动管理
CephFS ⚠️ 需要专用存储池 存储文件系统数据/元数据 ceph fs new <fs> <metadata> <data>
自定义应用 ✅ 可直接使用任意存储池 通过 librados 直接读写对象 rados -p <pool> put ...

使用RBD

rbd可以和云存储底层结合,还可以作为k8s的ceph供应商的块存储

一般只推荐一个RBD镜像附加到一个客户机,因为多客户机上挂载,可以导致文件系统损坏和数据丢失,可以多读单写作备份

创建rbd镜像流程

1
2
3
4
5
1.使用ceph osd pool create创建自定义RBD镜像存储池
2.创建专门的rbd用户,以访问rbd池(红帽推荐)
3.使用rbd create --size <size> <pool-name>/<image-name>创建RBD镜像
默认默认名称为rbd_default_pool参数,使用
ceph config set osd rbd_default_pool value可以指定

访问RBD的方式

  • linux内核有个客户端krbd,将RBD映射到linux块设备
  • librbd库为KVM虚机与OpenStack、libvirt等提供块存储
  • k8s使用CSI 驱动可以将ceph作为存储类动态提供pv

linux访问——rbd映射与rbdmap持久化映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
将RBD池中的ws RBD映像映射到客户机的/dev/rbd0设备:
rbd map <pool-name>/<image-name>

列出rbd镜像
rbd device list

解除映射
rbd device unmap

**rbdmap持久化映射**
rbdmap服务可以在系统启动和关闭时自动将RBD映像映射到设备
该服务在/etc/ceph/rbdmap文件中查找带有凭据的映射映像
服务使用RBD映像在/etc/fstab文件中显示的挂载点来挂载和卸载RBD映像

cat /etc/ceph/rbdmap
# RbdDevice Parameters
#poolname/imagename id=client,keyring=/etc/ceph/ceph.client.keyring

1.创建一个文件系统挂载点
2./etc/ceph/rbdmap文件中添加单行条目,需要添加用户与keyring
3.在/etc/fstab中为rbd添加条目
4.设置rbdmap systemd下次开机启动

RBD的缓存配置介绍

ceph块设备的用户空间实现无法使用Linux页缓存,所以ceph的块设备使用自己的内存缓存,即RBD缓存,它的行为和linux页缓存差不多开

RBD缓存配置

1.缓存关闭(性能完全依赖网络和 OSD 磁盘速度)

1
2
3
4
5
6
sequenceDiagram
Client->>RBD: 写请求
RBD->>OSD Journal: 同步写入日志
OSD Journal->>Client: 确认写入
OSD Journal->>OSD Data: 异步刷盘

2.缓存开启(回写),有一个最大脏缓存字节数M,如果大于M则不允许继续写入

1
2
3
4
5
6
7
8
9
sequenceDiagram
Client->>RBD Cache: 读请求
alt 缓存命中
RBD Cache->>Client: 直接返回
else 缓存未命中
RBD Cache->>OSD: 读取数据
OSD->>RBD Cache: 返回数据
RBD Cache->>Client: 返回+缓存
end

3.直写式高速缓存,最大脏缓存字节数设置为0,强制透写

1
2
3
4
5
6
7
sequenceDiagram
Client->>RBD Cache: 写请求
RBD Cache->>Client: 立即确认
RBD Cache->>OSD Journal: 异步批量写入
OSD Journal->>RBD Cache: 批量确认
OSD Journal->>OSD Data: 异步刷盘

RBD镜像介绍

RBD镜像名称

每一个RBD镜像都有一个特定的名称,以rbd开头,中间有个点,后面是12位16进制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
rbd info wspool/wsimage
rbd image 'wsimage':
size 100 GiB in 25600 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 88cd9395ea3
block_name_prefix: rbd_data.88cd9395ea3
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Jul 7 06:18:55 2025
access_timestamp: Mon Jul 7 06:18:55 2025
modify_timestamp: Mon Jul 7 06:18:55 2025

这里这个就是名称
rbd_data.88cd9395ea3

rados -p wspool ls
rbd_object_map.88cd9395ea3
rbd_directory
rbd_id.wsimage
rbd_info
rbd_header.88cd9395ea3

rbd镜像顺序

镜像顺序image order,定义了对象的大小

1
2
3
4
5
6
7
8
9
10
11
12
12 = 4KiB
13 = 8KiB
缺省为22 = 4MiB

可以通过rbd create --order 选项来哦覆盖默认值
可选范围在4KiB到32MiB之间

小对象 (低order) → 高IOPS,高元数据开销
大对象 (高order) → 高吞吐量,低碎片化
Order=22: 最大镜像 = 2^32 * 4MB = 16TB
Order=24: 最大镜像 = 2^32 * 16MB = 64TB
Order=30: 最大镜像 = 2^32 * 1GB = 4PB

其他参数

1
2
3
image_format:RBD镜像格式版本。默认值为2,即最新版本。版本1已弃用
stripe_unit:一个对象中存储的连续字节数,默认为object_size。
stripe_count:条带所跨越的RBD镜像对象个数,默认为1。

完整创建RBD的过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1. 创建存储池后初始化
ceph osd pool create rbd_pool 128 128
rbd pool init rbd_pool

2.创建多租户clientb
useradd clientb
ceph auth get-or-create client.rbd_pool.clientb mon 'profile rbd' \
osd 'profile rbd' -o /etc/ceph/ceph.client.rbd_pool.clientb.keyring

3.创建RBD
su - clientb
export CEPH_ARGS='--id=rbd_pool,clientb'
rbd create rbd_pool/test --size=128M

4.RBD临时映射
rbd map rbd_pool/test

rbd showmapped
id pool namespace image snap device
0 rbd_pool test - /dev/rbd0

5.格式化
mkfs.xfs /dev/rbd0

6.做永久挂载
mkdir /mnt/rbd
mount /dev/rbd0 /mnt/rbd

cat /etc/ceph/rbdmap
rbd_pool/test id=rbd_pool.clientb,keyring=/etc/ceph/ceph.client.rbd_pool.clientb.keyring

cat /etc/fstab
/dev/rbd/rbd_pool/test /mnt/rbd xfs noauto 0 0

systemctl enable rbdmap --now
systemctl restart rbdmap
CATALOG
  1. 1. 使用RBD
    1. 1.1. linux访问——rbd映射与rbdmap持久化映射
    2. 1.2. RBD的缓存配置介绍
  2. 2. RBD镜像介绍
  3. 3. 完整创建RBD的过程