服务类型 |
是否依赖存储池 |
存储池用途 |
创建方式 |
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
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
|