Ceph 分布式存储 块存储管理
摘要:本文全面介绍了 Ceph 分布式存储系统中的块存储管理(RBD)。内容涵盖 RBD 的 I/O 流程、常用命令、镜像创建与管理、访问方式(KRBD 和 librbd)、镜像格式与布局、镜像功能(快照、克隆)、导入导出操作,以及 RBD 镜像的配置与管理。文章通过详细的命令行示例和配置步骤,帮助读者深入理解 Ceph RBD 的核心概念和实际操作,适合存储管理员和运维人员参考学习。
Ceph RBD IO流程

(1)客户端创建一个pool,需要为这个pool指定pg的数量; (2)创建pool/image rbd设备进行挂 载; (3)用户写入的数据进行切块,每个块的大小默认为4M,并且每个块都有一个名字,名字就是 object+序号; (4)将每个object通过pg进行副本位置的分配; (5)pg根据cursh算法会寻找3个 osd,把这个object分别保存在这三个osd上; (6)osd上实际是把底层的disk进行了格式化操作,一 般部署工具会将它格式化为xfs文件系统; (7)object的存储就变成了存储一个文rbd0.object1.file;

客户端写数据osd过程:
-
采用的是librbd的形式,使用librbd创建一个块设备,向这个块设备中写入数据;
-
在客户端本地同过调用librados接口,然后经过pool,rbd,object、pg进行层层映射,在PG这一层 中,可以知道数据保存在哪3个OSD上,这3个OSD分为主从的关系;
-
客户端与primay OSD建立SOCKET 通信,将要写入的数据传给primary OSD,由primary OSD再将 数据发送给其他replica OSD数据节点;
RBD常用命令
| 命令 | 功能 |
|---|---|
| rbd create | 创建块设备映像 |
| rbd ls | 列出 rbd 存储池中的块设备 |
| rbd info | 查看块设备信息 |
| rbd diff | 可以统计 rbd 使用量 |
| rbd map | 映射块设备 |
| rbd showmapped | 查看已映射块设备 |
| rbd remove | 删除块设备 |
| rbd resize | 更改块设备的大小 |
管理 RADOS 块设备
RADOS 块设备
块设备是服务器、笔记本电脑和其他计算系统上最为常见的长期存储设备。它们以固定大小的块存储数 据。块设备包括基于旋转磁盘的硬盘驱动器,以及基于非易失性存储器的固态驱动器。若要使用存储, 用户要使用文件系统格式化块设备,并将它挂载到 Linux 文件系统层次结构中。
Ceph 存储集群的RADOS 块设备 (RBD) 功能 提供虚拟块设备,并以RBD 镜像形式存储在Ceph 存储集群 的池中。
创建 RBD 镜像
存储管理员使用 rbd 命令来创建、列出、检索信息、调整大小和删除块设备镜像。
- 创建 rbd 池。使用 ceph osd pool create 命令来创建用于存储 RBD 镜像池,并使用 rbd pool init 命令进行初始化池。
bash
# 1.创建自定义存储池 images_pool
[root@ceph1 ~]# ceph osd pool create images_pool
pool 'images_pool' created
# 2.初始化RBD池
# 作用等同于:ceph osd pool application enable images_pool rbd
[root@ceph1 ~]# rbd pool init images_pool
# 3.查看存储池详情,验证RBD应用挂载状态
[root@ceph1 ~]# ceph osd pool ls detail | grep images_pool
pool 2 'images_pool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 41 flags hashpspool,selfmanaged_snaps stripe_width '0 application rbd'
- 创建专用用户。虽然 Ceph 管理员可以访问这个池,但建议使用受限制的 Cephx 用户访问 rbd 池,仅向该受限用户授予所需 RBD 池的读写权限,而非整个集群的访问权限。
bash
[root@ceph1 ~]# ceph auth get-or-create client.rbd mon 'profile rbd' osd 'profile rbd' -o /etc/ceph/ceph.client.rbd.keyring
- 创建 RBD 镜像。
bash
[root@ceph1 ~]# rbd create images_pool/webapp1 --size 1G
# 查看池中镜像清单
[root@ceph1 ~]# rbd ls images_pool webapp1
# 查看池整体情况
[root@ceph1 ~]# rbd pool stats images_pool
Total Images: 1
Total Snapshots: 0
Provisioned Size: 1 GiB
如果用户不指定池名称,此命令会使用默认的池名称,默认的池名称由 rbd_default_pool 参数指 定。使用 ceph config set osd rbd_default_pool value 设置此参数。
访问 RADOS 块设备存储
访问 RADOS 块设备存储方法:
-
使用 KRBD, 客户端 krbd 模块将 RBD 镜像映射为 Linux 块设备。
-
使用 librbd 库,将 RBD 存储提供给 KVM 虚拟机和 OpenStack 云实例。这些客户端使得裸机恢复 服务器或虚拟机像普通的块存储一样使用 RBD镜像。在 OpenStack 环境中,OpenStack 将这些 RBD 镜像连接并映射到 Linux 服务器,在那里它们可以充当引导设备。
Ceph 存储将虚拟设块设备使用的实际存储分散在集群中,以利用 IP网络提供高性能访问。
使用内核RBD(KRBD)访问 Ceph 块存储
映射 RBD 镜像
Ceph 客户端可以使用原生 Linux 内核模块 (krbd) 挂载 RBD 镜像。这个模块使用 /dev/rbd0 之类的名 称将 RBD 镜像映射到 Linux 块设备。

示例:将 images_pool 池中的 webapp1 镜像映射为client上 /dev/rbd0 设备。
bash
#client上操作:
[root@client ~]# dnf install -y ceph-common
#ceph1上操作:
[root@ceph1 ~]# scp /etc/ceph/ceph.conf /etc/ceph/ceph.client.rbd.keyring root@client:/etc/ceph
# 在客户端 client 上操作
[root@client ceph]# rbd ls images_pool --id rbd
webapp1
# 为了简化命令参数,定义CEPH_ARGS环境变量,确保ceph相关命令使用该环境变量提供的默认值。
[root@client ~]# export CEPH_ARGS='--id=rbd'
[root@client ~]# rbd ls images_pool
webapp1
# 使用 krbd 内核模块来映射镜像
[root@client ~]# rbd device map images_pool/webapp1 #或者使用rbd map images_pool/webapp1映射镜像
/dev/rbd0
# 查看系统所有块设备,验证RBD设备是否映射成功
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part
├─cs-root 253:0 0 70G 0 lvm /
├─cs-swap 253:1 0 3.9G 0 lvm [SWAP]
└─cs-home 253:2 0 125.1G 0 lvm /home
sr0 11:0 1 12.8G 0 rom
rbd0 252:0 0 1G 0 disk # 新增映射的Ceph RBD块设备
Ceph 客户端系统可以像其他块设备一样使用映射的块设备,例如使用文件系统进行格式化、挂载和卸 载。
bash
# 列出计算机中映射的 RBD 镜像
[root@client ~]# rbd showmapped
id pool namespace image snap device
0 images_pool webapp1 - /dev/rbd0
# 等价命令
[root@client ~]# rbd device list
# rbd device list 等同于 rbd device ls
id pool namespace image snap device
0 images_pool webapp1 - /dev/rbd0
# 格式化和挂载RBD设备
[root@client ~]# lsblk /dev/rbd0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
rbd0 252:0 0 1G 0 disk
[root@client ~]# mkfs.xfs /dev/rbd0
[root@client ~]# mkdir -p /webapp/webapp1
[root@client ~]# mount /dev/rbd0 /webapp/webapp1/
[root@client ~]# lsblk /dev/rbd0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
rbd0 252:0 0 1G 0 disk /webapp/webapp1 #已经挂载
[root@client ~]# echo Hello World > /webapp/webapp1/index.html
[root@client ~]# cat /webapp/webapp1/index.html
Hello World
[root@client ~]# df /webapp/webapp1/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/rbd0 1038336 40504 997832 4% /webapp/webapp1
# 查看镜像正在被哪些客户端占用
[root@client ~]# rbd status images_pool/webapp1
Watchers:
watcher=192.168.108.10:0/1267779106 client.44650 cookie=18446462598732840961
取消映射 RBD 镜像,使用以下命令:
bash
# 1. 先卸载挂载目录
[root@client ~]# umount /webapp/webapp1
# 2. 取消rbd设备映射(三种等效写法任选其一)
# 写法1:指定设备路径
[root@client ~]# rbd unmap /dev/rbd0
# 写法2:指定【存储池/镜像名】
# rbd unmap images_pool/webapp1
# 写法3:使用完整device子命令
[root@client ~]# rbd device unmap /dev/rbd0
# 3. 查看当前主机已映射的rbd设备列表
[root@client ~]# rbd device ls
注意:rbd map 和 rbd unmap 命令需要 root 特权。
注意:两个客户端可以同时将同一个 RBD 镜像映射为块设备。但如果块设备含有普通的单挂载文件系 统,则建议每次将数据块设备连接到一个客户端。如果将含有普通文件系统的 RADOS 块设备同时挂载到 两个或多个客户端上,可能会造成文件系统损坏和数据丢失。
持久映射 RBD 镜像
rbdmap 服务可在系统启动自动映射 RBD 镜像到系统。此服务在 /etc/ceph/rbdmap 文件中查找已映 射的镜像及其凭据。当 系统识别到 RBD 镜像时,读取 /etc/fstab 文件中记录,并挂载镜像。
下列步骤对 rbdmap 进行配置,以持久映射已包含文件系统的 RBD 镜像:
- 在 /etc/ceph/rbdmap RBD 映射文件内创建一个单行条目。此条目必须指定 RBD 池和镜像的名 称。还必须引用 Cephx 用户,该用户具有镜像的读写权限并且具有相应的密钥环文件。确保客户端 系统上存在 Cephx 用户的密钥环文件。
bash
[root@client ~]# vim /etc/ceph/rbdmap
# RbdDevice Parameters
#poolname/imagename id=client,keyring=/etc/ceph/ceph.client.keyring
images_pool/webapp1 id=rbd,keyring=/etc/ceph/ceph.client.rbd.keyring
- 在客户端系统上的 /etc/fstab 文件中为 RBD 创建一个条目。
块设备的名称:/dev/rbd/pool_name/image_name,指定 _netdev 挂载选项,等待 rbdmap 服务 映射镜像后,再挂载文件系统。
bash
[root@client ~]# vim /etc/fstab
......
/dev/rbd/images_pool/webapp1 /webapp/webapp1 xfs _netdev 0 0
-
确认块设备映射正常工作。使用 rbdmap map 和 rbdmap unmap 命令来挂载和卸载镜像。
-
启用 rbdmap systemd 服务。
bash
[root@client ~]# systemctl enable rbdmap.service
- 重启系统验证。
bash
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part
├─cs-root 253:0 0 70G 0 lvm /
├─cs-swap 253:1 0 3.9G 0 lvm [SWAP]
└─cs-home 253:2 0 125.1G 0 lvm /home
sr0 11:0 1 12.8G 0 rom
rbd0 252:0 0 1G 0 disk /webapp/webapp1
如需更多信息,请参见 rbdmap(8)。
# 使用 librbd 库访问 Ceph 块存储-配合虚拟化,不过多讲解
使用 librbd 库访问 Ceph 块存储
librbd 库为用户空间应用提供对 RBD 镜像的直接访问。它继承 librados 的功能,将数据块映射到 Ceph 对象存储中的对象,并且实施相关的功能来访问 RBD 镜像和创建快照与克隆。
OpenStack 和 libvirt 等云和虚拟化解决方案使用 librbd 将 RBD 镜像作为块设备提供给它们管理的云 实例和虚拟机。例如,RBD 镜像可以存储 QEMU 虚拟机镜像。
-
使用 RBD 克隆功能时,虚拟化容器可以在不复制引导镜像的情况下引导虚拟机。
-
使用写时复制 (COW) 机制,在将数据写入到克隆中的未分配对象时,会将数据从父级复制到克隆。
-
使用读时复制 (COR) 机制,在从克隆中的未分配对象读取数据时,会将数据从父级复制到克隆。

RBD 缓存
Ceph 块设备是在用户空间实施(如 librbd),无法利用 Linux 页面缓存。Ceph 块设备会使用Linux系 统自己的内存中缓存,称为 RBD 缓存。RBD 缓存的行为与 Linux 页面缓存相似。操作系统实施阻碍机制 或清空请求时,Ceph 会将所有脏数据写入到 OSD。这意味着,在虚拟机正确发送清空时(例如,Linux 内核 >= 2.6.32),使用回写缓存与使用物理硬盘缓存一样安全。缓存采用"最早使用"(LRU) 算法,而且在 回写模式中,它可以联合毗邻的请求来获得更佳的吞吐量。
RBD 缓存对客户端而言是本地的,因为它使用发起 I/O 请求的计算机上的 RAM。例如,如果用户的 OpenStack 平台安装中有 Nova 计算节点,并且它们将 librbd 用于其虚拟机,则发起 I/O 请求的 OpenStack 客户端会将本地 RAM 用于其 RBD 缓存。
RBD 缓存模式
-
未启用缓存,读取和写入前往 Ceph 对象存储。数据在写入所有相关的 OSD 日志和写入 OSD 设备 完成后,Ceph 集群确认写入。
-
回写缓存(write-back),需要考量两个值:未清空缓存字节数 U 和最大脏缓存字节数 M。如果 U < M,则此时缓存写入完成即确认写入完成,否则在数据写回到磁盘后确认,直到 U < M 为止。
-
直写缓存(Write-through),将最大脏字节数设置为 0,以强制使用直写模式。数据首先写入缓 存,然后再写入所有相关的 OSD 日志和写入 OSD 设备完成后,Ceph 集群确认写入。使用直写模 式,以最大程度降低服务器故障时数据丢失或文件系统损坏的风险,提供很好的读IO 。
RBD 缓存参数
-
rbd_cache,定义是否启用 RBD 缓存,可用值 true 和 false,默认值true。
-
rbd_cache_policy,定义 RBD 缓存模式,可用值:
-
writearound,默认值,写入数据时不经过缓存直接写入后端硬盘。
-
writeback,回写。
-
writethrough,直写。
-
-
rbd_cache_size,定义每个 RBD 镜像的缓存大小,以字节为单位。默认值 32 MB。
-
rbd_cache_max_dirty,定义每个 RBD 镜像允许的最大脏字节数。默认值 24 MB。
-
rbd_cache_target_dirty,定义每个 RBD 镜像开始抢先清空的脏字节数。默认值 16 MB。
-
rbd_cache_max_dirty_age,定义清空前的最大页面期限,以秒为单位。默认值 1。
-
rbd_cache_writethrough_until_flush,定义启动直写模式,直至执行第一次清空,可用值 true 和 false,默认值TRUE。
示例:查看并设置以上参数。
bash
# 查询所有rbd_cache相关配置项
[root@ceph1 ~]# ceph config ls | grep rbd_cache
rbd_cache
rbd_cache_policy
rbd_cache_writethrough_until_flush
rbd_cache_size
rbd_cache_max_dirty
rbd_cache_target_dirty
rbd_cache_max_dirty_age
rbd_cache_max_dirty_object
rbd_cache_block_writes_upfront
# 循环查看client段所有缓存参数当前值
[root@ceph1 ~]# for arg in $(ceph config ls|grep rbd_cache)
do
echo -n "$arg: "
ceph config get client $arg
done
rbd_cache: true
rbd_cache_policy: writearound
rbd_cache_writethrough_until_flush: true
rbd_cache_size: 33554432
rbd_cache_max_dirty: 25165824
rbd_cache_target_dirty: 16777216
rbd_cache_max_dirty_age: 1.000000
rbd_cache_max_dirty_object: 0
rbd_cache_block_writes_upfront: false
# 仅对client客户端设置缓存策略
[root@ceph1 ~]# ceph config set client rbd_cache_policy writethrough
[root@ceph1 ~]# ceph config get client rbd_cache_policy
writethrough
# 设置全局缓存策略(所有角色生效)
[root@ceph1 ~]# ceph config set global rbd_cache_policy writethrough
RBD 镜像格式
RBD 镜像布局
RBD 镜像中的所有对象的名称以各个 RBD 块名称前缀字段中包含的值为开头,可使用rbd info 命令来显 示。此前缀后是句点 (.),后跟对象编号。对象编号字段的值是 12 个字符的十六进制数字。
bash
[root@client ~]# rbd info images_pool/webapp1 --id rbd
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
op_features:
flags:
create_timestamp: Thu Aug 21 21:06:45 2025
access_timestamp: Thu Aug 21 21:06:45 2025
modify_timestamp: Thu Aug 21 21:06:45 2025
Ceph 块设备允许将数据分条存储在Ceph 存储集群中的多个对象存储设备 (OSD) 上。

RBD 镜像阶数
镜像阶数是用于定义 RBD 镜像的对象大小。镜像阶数基于 <<(按位左移)C 运算符来定义二进制偏移 值。此运算符按照右侧运算对象来偏移左侧运算对象。
例如,1 << 2 = 4。十进制 1 在二进制中是 1,因此 1 << 2 = 4 运算的结果是二进制的 100,也就是十进 制的 4。
镜像阶数的值必须在12 到 25 之间,其中 12 = 4 KiB,13 = 8 KiB,以此类推。例如,镜像阶数默认为 22,生成 4 MiB 对象。用户可使用 rbd create 命令的 --order 选项来覆盖默认值。
用户也可通过 --object-size 选项指定对象的大小。此参数必须指定介于 4096 字节 (4 KiB) 和33,554,432 字节 (32 MiB) 之间的对象大小,以字节、K 或 M 表示(例如,4096、8 K 或 4 M)。
bash
[root@client ~]# rbd help create
usage: rbd create [--pool <pool>] [--namespace <namespace>] [--image <image-name>]
[--image-format <image-format>] [--new-format] [--order <order>]
[--object-size <object-size>] [--image-feature <image-feature>]
[--image-shared] [--stripe-unit <stripe-unit>] [--stripe-count <stripe-count>]
[--data-pool <data-pool>] [--mirror-image-mode <mirror-image-mode>]
[--journal-splay-width <journal-splay-width>] [--journal-object-size <journal-object-size>]
[--journal-pool <journal-pool>] [--thick-provision] --size <size> [--no-progress]
<image-spec>
Create an empty image.
Positional arguments
<image-spec> image specification (example: [<pool-name>/[<namespace>/]]<image-name>)
......
RBD 镜像格式
与每个 RBD 镜像关联的参数有三个:
-
image_format,RBD 镜像格式版本。默认值为 2,即最新的版本。版本 1 已弃用,而且不支持克 隆和镜像等功能。
-
stripe_unit,一个对象中存储的连续字节数(默认为 object_size)。
-
stripe_count,一个条带跨越的 RBD 镜像对象数量(默认为 1)。
对于 RBD 格式 2 镜像,用户可以更改以上各个参数的值。设置必须与下列等式一致:
bash
stripe_unit * stripe_count = object_size
例如: stripe_unit = 1048576, stripe_count = 8 for default 8 MiB objects
bash
[root@client ~]# rbd create --stripe-unit=1M --stripe-count=8 --size 1G images_pool/webapp2 --id rbd
[root@client ~]# rbd info images_pool/webapp2 --id rbd
rbd image 'webapp2':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: ada41793809a
block_name_prefix: rbd_data.ada41793809a
format: 2
features: layering, striping, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Thu Aug 21 23:07:26 2025
access_timestamp: Thu Aug 21 23:07:26 2025
modify_timestamp: Thu Aug 21 23:07:26 2025
stripe unit: 1 MiB
stripe count: 8
使用 rbd 命令管理镜像
status
用于查看哪些客户端在使用该镜像。
bash
[root@client ~]# rbd status images_pool/webapp1 --id rbd
Watchers:
watcher=192.168.108.10:0/2614504094 client.44320 cookie=18446462598732840961
[root@client ~]# rbd status images_pool/webapp2 --id rbd
Watchers: none
du
用于查看镜像大小使用情况。
bash
[root@client ~]# rbd du images_pool/webapp1 --id rbd
NAME PROVISIONED USED
webapp1 1 GiB 36 MiB
resize
用于扩展和缩减镜像。
bash
# 扩展未在使用的镜像
[root@client ~]# rbd resize images_pool/webapp2 --size 2G --id rbd
Resizing image: 100% complete...done.
[root@client ~]# rbd du images_pool/webapp2
NAME PROVISIONED USED
webapp2 2 GiB 0 B
# 扩展正在使用的镜像
# 扩展时可以写文件进行测试,扩展不影响数据的读取与写入
[root@client ~]# rbd resize images_pool/webapp1 --size 2G --id rbd
Resizing image: 100% complete...done.
[root@client ~]# lsblk /dev/rbd0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
rbd0 252:0 0 2G 0 disk /webapp/webapp1
[root@client ~]# df -h /dev/rbd0
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 1014M 40M 975M 4% /webapp/webapp1
[root@client ~]# xfs_growfs /webapp/webapp1/
[root@client ~]# df -h /webapp/webapp1/
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 2.0G 48M 2.0G 3% /webapp/webapp1
# 缩减镜像
[root@client ~]# rbd resize images_pool/webapp2 --size 1G --id rbd
rbd: shrinking an image is only allowed with the --allow-shrink flag
[root@client ~]# rbd resize images_pool/webapp2 --size 1G --allow-shrink --id rbd
Resizing image: 100% complete...done.
[root@client ~]# rbd du images_pool/webapp2 --id rbd
NAME PROVISIONED USED
webapp2 1 GiB 0 B
# 缩减正在使用的镜像(xfs文件系统不支持缩减)
rename 和 mv
用于重命名镜像,该操作不支持跨池。
bash
# 创建新池
[root@ceph1 ~]# ceph osd pool create images_pool_2 32 32
pool 'images_pool_2' created
[root@ceph1 ~]# rbd pool init images_pool_2
# 同池重命名
[root@ceph1 ~]# rbd rename images_pool/webapp2 images_pool/webapp02
[root@ceph1 ~]# rbd ls images_pool
webapp02
webapp1
[root@ceph1 ~]# rbd mv images_pool/webapp02 images_pool/webapp2
[root@ceph1 ~]# rbd ls images_pool
webapp1
webapp2
# 测试跨池重命名(不支持)
[root@ceph1 ~]# rbd rename images_pool/webapp2 images_pool_2/webapp02
rbd: mv/rename across pools not supported # 不支持跨池重命名
source pool: images_pool
dest pool: images_pool_2
cp
用于复制镜像。
bash
# 实验前观察
[root@client ~]# ceph osd lspools
1 device_health_metrics
2 images_pool
3 images_pool_2
[root@client ~]# rbd ls images_pool
webapp1
webapp2
[root@client ~]# rbd ls images_pool_2
# 跨池复制镜像
# 执行命令前建议先执行 rbd ls -p images_pool_2 确认目标池状态
[root@ceph1 ~]# rbd cp images_pool/webapp2 images_pool_2/webapp2
Image copy: 100% complete...done.
[root@ceph1 ~]# rbd ls -p images_pool
webapp1
webapp2
[root@ceph1 ~]# rbd ls -p images_pool_2
webapp2 # images_pool_2原本无镜像,复制后生成
# 后续可将复制后的 images_pool_2/webapp2 挂载测试,挂载可添加参数 -o nouuid
trash
使用垃圾箱管理镜像。
bash
# 将镜像移入垃圾箱
[root@ceph1 ~]# rbd ls images_pool # 先查看池内镜像
webapp1
webapp2
[root@ceph1 ~]# rbd trash mv images_pool/webapp2
[root@ceph1 ~]# rbd ls images_pool # 再次验证
webapp1
[root@ceph1 ~]# rbd trash ls images_pool
ada41793809a webapp2
# 恢复垃圾箱中的镜像,恢复必须使用镜像ID
[root@ceph1 ~]# rbd trash restore -p images_pool ada41793809a
[root@ceph1 ~]# rbd ls images_pool
webapp1
webapp2
[root@client ~]# rbd trash ls images_pool
# 彻底删除垃圾箱内镜像
[root@ceph1 ~]# rbd trash mv images_pool/webapp2
[root@ceph1 ~]# rbd trash ls images_pool
ada41793809a webapp2
[root@ceph1 ~]# rbd trash rm -p images_pool ada41793809a # 删除回收站里的webapp2
Removing image: 100% complete...done.
[root@ceph1 ~]# rbd trash ls images_pool
[root@ceph1 ~]# rbd ls images_pool
webapp1
rm
用于删除镜像。
bash
[root@ceph1 ~]# rbd rm images_pool_2/webapp2
Removing image: 100% complete...done.
[root@ceph1 ~]# rbd ls images_pool_2
管理 RADOS 块设备快照
RBD 镜像功能
使用 格式 2 的RBD 镜像支持若干可选功能:
-
layering,镜像分层功能,该功能支持快照和克隆。
-
striping,提高性能的分条 v2 功能,由 librbd 提供支持。
-
exclusive-lock,独占锁定功能。
-
object-map,对象映射功能(依赖 exclusive-lock)。
-
fast-diff,快速 diff 命令功能(依赖 object-map 和 exclusive-lock)。
-
deep-flatten,扁平化 RBD 镜像的所有快照。
-
journaling,日志功能(依赖 exclusive-lock)。
-
data-pool,EC 数据池功能。
在RBD的features中,源代码定义如下
c
#define RBD_FEATURE_LAYERING (1ULL<<0)
#define RBD_FEATURE_STRIPINGV2 (1ULL<<1)
#define RBD_FEATURE_EXCLUSIVE_LOCK (1ULL<<2)
#define RBD_FEATURE_OBJECT_MAP (1ULL<<3)
#define RBD_FEATURE_FAST_DIFF (1ULL<<4)
#define RBD_FEATURE_DEEP_FLATTEN (1ULL<<5)
#define RBD_FEATURE_JOURNALING (1ULL<<6)
#define RBD_FEATURE_DATA_POOL (1ULL<<7)
(1ULL<<0) 2^0 = 1
(1ULL<<1) 2^1 = 2
(1ULL<<2) 2^2 = 4
(1ULL<<3) 2^3 = 8
(1ULL<<4) 2^4 = 16
(1ULL<<5) 2^5 = 32
(1ULL<<6) 2^6 = 64
(1ULL<<7) 2^7 = 128
集群中 RBD 镜像默认启用功能:
bash
layering, exclusive-lock, object-map, fast-diff, deep-flatten
bash
[root@ceph1 ~]# ceph config get client rbd_default_features
layering,exclusive-lock,object-map,fast-diff,deep-flatten
-
使用命令 ceph config set client rbd_default_features value 命令设置镜像默认功能。
-
/etc/ceph/ceph.conf 的 client 中 rbd_default_features 参数定义镜像支持的功能。
-
命令行创建image时候,可以通过 --image-feature feature-name 指定镜像功能。
禁用 object-map 功能
bash
[root@ceph1 ~]# rbd feature disable images_pool/webapp1 object-map
启用 object-map 功能
bash
[root@ceph1 ~]# rbd feature enable images_pool/webapp1 object-map
有些功能是永久性的,不能直接禁用和启用,例如 layering。
bash
[root@ceph1 ~]# rbd feature disable images_pool/webapp1 layering
rbd: failed to update image features: (22) Invalid argument
2025-08-22T17:31:15.602+0800 7ff4768033c0 -1 librbd::Operations: cannot update immutable features
RBD 快照
RBD 快照使用 COW 技术,实现最大程度减少维护快照所需的存储空间。在将写入 I/O 请求应用到 RBD 快照镜像前,集群会将原始数据复制到 I/O 操作所影响对象的 PG 中的另一区域。快照在创建时不会占用 存储空间,随着所包含对象的变化而增大。RBD 镜像支持增量快照。

快照 COW 技术在对象级别上运行,不受对 RBD 镜像发出的写入 I/O 请求大小的限制。如果用户在有快 照的 RBD 镜像中写入一个字节,则 Ceph 会将整个受影响的对象从 RBD 镜像复制到快照区域。

注意: 在拍摄快照前,一定要完成以下任一操作:
-
卸载文件系统。
-
使用 fsfreeze命令冻结文件系统,只允许读操作。
使用 rbd snap create 命令,创建 Ceph 块设备的快照。
bash
# 重新创建一个镜像
[root@client ~]# export CEPH_ARGS='--id=rbd'
[root@client ~]# rbd create images_pool/webapp --size 2G
[root@client ~]# rbd map images_pool/webapp /dev/rbd1
[root@client ~]# mkfs.xfs /dev/rbd/images_pool/webapp
[root@client ~]# mkdir /webapp/webapp
[root@client ~]# mount /dev/rbd/images_pool/webapp /webapp/webapp
[root@client ~]# echo Hello World > /webapp/webapp/index.html
[root@client ~]# cat /webapp/webapp/index.html
Hello World
# 卸载文件系统
[root@client ~]# umount /webapp/webapp
# 拍摄快照
[root@client ~]# rbd snap create images_pool/webapp@snap1
Creating snap: 100% complete...done.
[root@client ~]# rbd snap ls images_pool/webapp
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 snap1 2 GiB Fri Aug 22 17:52:20 2025
# 挂载文件系统,并写入新数据
[root@client ~]# mount /dev/rbd/images_pool/webapp /webapp/webapp
[root@client ~]# echo Hello laogao > /webapp/webapp/index.html
[root@client ~]# cat /webapp/webapp/index.html
Hello laogao
使用 rbd snap ls 命令,列出块设备快照。
bash
[root@client ~]# rbd snap ls images_pool/webapp
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 snap1 2 GiB Fri Aug 22 17:52:20 2025
RBD 快照是创建于特定时间的 RBD 镜像的只读副本。
重要提示:镜像快照和镜像具有相同的文件系统,同一客户端不允许挂载具有相同UUID的文件系统。
bash
# 将/webapp/webapp里的index.html删除,通过挂载/webapp/webapp@snap1找回文件
[root@client ~]# rm /webapp/webapp/index.html
# 在挂载快照前,需要卸载原始镜像
[root@client ~]# umount /dev/rbd/images_pool/webapp
[root@client ~]# mkdir /webapp/webapp-snap1
[root@client ~]# rbd map images_pool/webapp@snap1 /dev/rbd2
[root@client ~]# mount /dev/rbd/images_pool/webapp@snap1 /webapp/webapp-snap1
mount: /webapp/webapp1-snap1: WARNING: device write-protected, mounted read-only.
# 读取快照内文件,复制文件即可实现数据找回
[root@client ~]# cat /webapp/webapp-snap1/index.html
Hello World
使用 rbd snap rollback 命令,回滚块设备快照,并用快照中的数据覆盖镜像的当前版本。
bash
# 还原上一个实验
[root@client ~]# umount /webapp/webapp-snap1/
[root@client ~]# mount /dev/rbd1 /webapp/webapp
# 回滚快照失败,排他锁导致
[root@client ~]# rbd snap rollback images_pool/webapp@snap1
Rolling back to snapshot: 0% complete...failed.
rbd: rollback failed: (30) Read-only file system
# 回滚快照要求:先卸载原有挂载,并且取消rbd映射
[root@client ~]# rbd device ls
id pool namespace image snap device
0 images_pool webapp1 - /dev/rbd0
1 images_pool webapp - /dev/rbd1
2 images_pool webapp snap1 /dev/rbd2
[root@client ~]# rbd unmap /dev/rbd1
[root@client ~]# rbd device ls
id pool namespace image snap device
0 images_pool webapp1 - /dev/rbd0
2 images_pool webapp snap1 /dev/rbd2
[root@client ~]# rbd snap rollback images_pool/webapp@snap1
Rolling back to snapshot: 100% complete...done.
# 快照回滚完成后,重新挂载webapp镜像
[root@client ~]# rbd device map images_pool/webapp /dev/rbd1
[root@client ~]# mount /dev/rbd1 /webapp/webapp
# 验证数据恢复结果
[root@client ~]# cat /webapp/webapp/index.html
Hello World
使用 rbd snap rm 命令,删除 Ceph 块设备的快照。
bash
[root@client ~]# umount /dev/rbd/images_pool/webapp@snap1
[root@client ~]# rbd unmap images_pool/webapp@snap1
[root@client ~]# rbd snap rm images_pool/webapp@snap1
Removing snap: 100% complete...done.
[root@client ~]# rbd snap ls images_pool/webapp
使用 rbd snap purge 命令,删除镜像所有快照。
bash
[root@client ~]# rbd snap create images_pool/webapp@snap1
[root@client ~]# rbd snap create images_pool/webapp@snap2
[root@client ~]# rbd snap ls images_pool/webapp
SNAPID NAME SIZE PROTECTED TIMESTAMP
6 snap1 2 GiB Fri Aug 22 18:07:20 2025
7 snap2 2 GiB Fri Aug 22 18:07:22 2025
# 一次性删除镜像所有快照
[root@client ~]# rbd snap purge images_pool/webapp
Removing all snapshots: 100% complete...done.
[root@client ~]# rbd snap ls images_pool/webapp
提示:镜像存在快照时,将无法删除 RBD 镜像。
RBD 克隆
RBD 克隆是 RBD 镜像的可读写副本,它使用受保护的 RBD 快照克隆。RBD 克隆也可以被扁平化,转换 为独立于来源的 RBD 镜像。
克隆过程有三个步骤:
- 创建快照
bash
[root@client ~]# rbd snap create images_pool/webapp@snap1
[root@client ~]# rbd snap ls images_pool/webapp
SNAPID NAME SIZE PROTECTED TIMESTAMP
10 snap1 2 GiB Fri Aug 22 18:10:18 2025
# 观察PROTECTED列,快照默认未保护
- 保护快照以免被删除
bash
[root@client ~]# rbd snap protect images_pool/webapp@snap1
[root@client ~]# rbd snap ls images_pool/webapp
SNAPID NAME SIZE PROTECTED TIMESTAMP
10 snap1 2 GiB yes Fri Aug 22 18:10:18 2025
- 使用受保护的快照创建克隆
bash
# 基于快照创建克隆镜像
[root@client ~]# rbd clone images_pool/webapp@snap1 images_pool/webapp-clone-1
# 将克隆镜像映射到本地
[root@client ~]# rbd map images_pool/webapp-clone-1 /dev/rbd3
[root@client ~]# mkdir /webapp/webapp-clone-1
# 挂载克隆镜像前,确保原镜像与快照不要处于挂载状态
[root@client ~]# umount /webapp/webapp
[root@client ~]# mount /dev/rbd/images_pool/webapp-clone-1 /webapp/webapp-clone-1
# 查看挂载信息
[root@client ~]# df /webapp/webapp-clone-1/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/rbd2 2086912 47864 2039048 3% /webapp/webapp-clone-1
新创建的克隆可以像常规 RBD 镜像一样运作,克隆支持 COW 和 COR技术,默认只支持 COW。 COW 会将父快照数据复制到克隆中,然后将写入 I/O 请求应用到克隆。
bash
[root@ceph1 ~]# ceph config get client rbd_clone_copy_on_read
false

RBD 克隆未启用 COR 功能时,父 RBD 快照和克隆相同的数据会直接从父快照读取。相对于客户端而 言,父快照的 OSD 具有较高的延迟,这种操作会提高读取的代价。
如果用户启用了 COR,并且克隆中尚未存在数据,则 Ceph 会在处理读取 I/O 请求前先从父快照复制数 据到克隆。通过为客户端或全局设置运行 ceph config set client rbd_clone_copy_on_read true 命令或 ceph ceph config set global rbd_clone_copy_on_read true 命令来激活 COR 功能。原 始数据不会被覆盖。
bash
# ceph config set client rbd_clone_copy_on_read true
# ceph config get client rbd_clone_copy_on_read
true
Important
如果不对 RBD 克隆启用 COR,则克隆无法满足的每个读取操作都会对克隆的父级发出 I/O 请求。

克隆 COW 和 COR 步骤在对象级别上运行,不受 I/O 请求大小的限制。要读取或写入 RBD 克隆的单个 字节,Ceph 会将整个对象从父镜像或快照复制到克隆。
查看基于特定快照的克隆列表
bash
# 基于快照创建克隆镜像
[root@client ~]# rbd clone images_pool/webapp@snap1 images_pool/webapp-clone-2
# 查看快照下所有克隆子镜像
[root@client ~]# rbd children images_pool/webapp@snap1
images_pool/webapp-clone-1
images_pool/webapp-clone-2
扁平化克隆,Ceph 会将所有缺失的数据从父级复制到克隆,然后移除对父级的引用。克隆会变成独立的 RBD 镜像,不再是受保护快照的子级。
bash
# 扁平化克隆镜像
[root@client ~]# rbd flatten images_pool/webapp-clone-1
Image flatten: 100% complete...done.
# 再次查看快照关联的克隆镜像
[root@client ~]# rbd children images_pool/webapp@snap1
images_pool/webapp-clone-2
[root@client ~]# rbd ls images_pool
挂载克隆镜像
通过镜像快照克隆出来的镜像,具有原镜像相同的文件系统,而同一客户端不允许挂载具有相同UUID的 文件系统。怎么处理?
答案:修改文件系统UUID。
假设客户端将克隆出来的镜像映射为/dev/rbd3设备。操作如下:
bash
[root@client ~]# rbd map images_pool/webapp-clone-2 /dev/rbd4
# 查看rbd设备UUID
blkid | grep rbd
# 生成新的UUID
[root@client ~]# uuidgen
e0e005e5-c8a0-4102-a266-3964c7069e18
# 修改 ext4 文件系统 UUID
[root@client ~]# tune2fs -U e0e005e5-c8a0-4102-a266-3964c7069e18 /dev/rbd4
# 修改 xfs 文件系统 UUID
[root@client ~]# xfs_admin -U e0e005e5-c8a0-4102-a266-3964c7069e18 /dev/rbd4
Clearing log and setting UUID
writing all SBs
new UUID = e0e005e5-c8a0-4102-a266-3964c7069e18
# 挂载测试
[root@client ~]# mkdir /webapp/webapp-clone-2
[root@client ~]# mount /dev/rbd4 /webapp/webapp-clone-2/
# 查看挂载结果
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part
├─cs-root 253:0 0 70G 0 lvm /
├─cs-swap 253:1 0 3.9G 0 lvm [SWAP]
└─cs-home 253:2 0 125.1G 0 lvm /home
sr0 11:0 1 12.8G 0 rom
rbd0 252:0 0 2G 0 disk /webapp/webapp1
rbd1 252:16 0 2G 0 disk
rbd2 252:32 0 2G 1 disk
rbd3 252:48 0 2G 0 disk /webapp/webapp-clone-1
rbd4 252:64 0 2G 0 disk /webapp/webapp-clone-2 #挂载成功
#导入和导出 RBD 镜像
#导入和导出 RBD 镜像
利用 RBD 导出与导入机制,用户可以在同一集群中,也可以使用另一独立集群维护拥有完整功能和可访 问性的 RBD 镜像操作副本。
用户可以将这些副本用于各种不同的用例,包括:
-
利用实际的数据卷测试新版本
-
利用实际的数据卷运行质量保障流程
-
实施业务连续性方案
-
将备份进程从生产块设备分离
#导出 RBD 镜像
Ceph 存储提供 rbd export 命令来将 RBD 镜像导出到文件。此命令可以将 RBD 镜像或 RBD镜像快照导 出到指定的目标文件。
rbd export 命令的语法如下:
bash
rbd export [--export-format {1|2}] (image-spec | snap-spec) [dest-path]
--export-format 选项可指定导出数据的格式,允许用户将较早的 RBD 格式 1 镜像转换为较新的格式 2 镜像。
示例:
bash
[root@ceph1 ~]# rbd export images_pool/webapp webapp.img
Exporting image: 100% complete...done.
#导入 RBD 镜像
Ceph 存储提供 rbd import 命令来从文件导入 RBD 镜像。此命令会新建一个镜像,并从指定的源路径 导入数据。
rbd import 命令的语法如下:
bash
rbd import [--export-format {1|2}] [--image-format format-id] [--object-size size-in-B/K/M] [--stripe-unit size-in-B/K/M --stripe-count num] [--image-feature feature-name]... [--image-shared] src-path [image-spec]
-
--export-format 选项指定待导入数据的格式,必须确保 rbd export 和 rbd import 命令使用的-- export-format 参数值一致。
-
在导入格式 2 的导出数据时,使用 --stripeunit、--stripe-count、--object-size 和 --image-feature 选项可创建新的 RBD 格式 2镜像。
示例1:同一集群导入
bash
# 将本地镜像文件导入RBD
[root@ceph1 ~]# rbd import webapp.img images_pool/webapp-backup
Importing image: 100% complete...done.
[root@ceph1 ~]# rbd ls images_pool
webapp
webapp-backup
webapp-clone-1
webapp-clone-2
webapp1
# 查看导入后的镜像信息
[root@ceph1 ~]# rbd info images_pool/webapp-backup
rbd image 'webapp-backup':
size 2 GiB in 512 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: afec7a78062a
block_name_prefix: rbd_data.afec7a78062a
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Fri Aug 22 19:18:19 2025
access_timestamp: Fri Aug 22 19:18:19 2025
modify_timestamp: Fri Aug 22 19:18:19 2025
示例2:不同集群导入
bash
# 将本地镜像文件传输到ceph4节点
[root@ceph1 ~]# scp webapp.img root@ceph4:
# 在ceph4节点操作
[root@ceph4 ~]# ceph osd pool create images_pool 32
[root@ceph4 ~]# rbd pool init images_pool
# 导入前查看池内镜像
[root@ceph4 ~]# rbd ls images_pool
# 导入本地镜像文件至RBD
[root@ceph4 ~]# rbd import webapp.img images_pool/webapp-backup
Importing image: 100% complete...done.
# 导入完成后再次查看
[root@ceph4 ~]# rbd ls images_pool
webapp-backup
#管道导出和导入进程
将短划线 (-) 字符指定为导出操作的目标文件会导致输出转到标准输出 (stdout)。用户还可使用短划线字 符 (-) 将 stdout 或标准输入 (stdin) 指定为导出目标或导入来源。
用户可以将这两个命令传送到一个命令中。
bash
# 同一集群管道导出导入
[root@ceph1 ~]# rbd export images_pool/webapp - | rbd import - images_pool/webapp-backup2
Exporting image: 100% complete...done.
Importing image: 100% complete...done.
# 跨集群通过ssh管道导出导入
[root@ceph1 ~]# rbd export images_pool/webapp - | ssh root@ceph4 rbd import - images_pool/webapp-backup2
root@ceph4's password:
Exporting image: 100% complete...done.
Importing image: 100% complete...done.
#导出和导入 RBD 镜像更改
RADOS 块设备功能支持导出和导入整个 RBD 镜像,也可以仅导出和导入两个时间点之间的 RBD 镜像变 化。
#导出 RBD 镜像更改
Ceph 存储提供 rbd export-diff 命令来导出在两个时间点之间对 RBD 镜像的变更。
bash
[root@ceph1 ~]# rbd help export-diff
usage: rbd export-diff [--pool <pool>] [--namespace <namespace>] [--image <image>]
[--snap <snap>] [--path <path>] [--from-snap <from-snap>]
[--whole-object] [--no-progress] <source-image-or-snap-spec> <path-name>
......
起始时间可以是:
-
RBD 镜像的创建日期和时间,不使用 --from-snap 选项。
-
RBD 镜像的快照,通过 --from-snap snapname 选项获取。
也就是:
-
如果不指定快照,命令将导出自 RBD镜像创建之后的所有更改,这与常规的 RBD 镜像导出操作相 同。
-
如果用户指定起始点快照,命令将导出用户创建该快照后的更改。
终止时间可以是:
-
RBD 镜像的当前内容,如 poolname/imagename。
-
RBD 镜像的快照,如 poolname/imagename@snapname。
实验环境:

环境准备:
bash
[root@ceph1 ~]# ceph osd pool create rbd 32
[root@ceph1 ~]# rbd pool init rbd
[root@ceph1 ~]# rbd create data -s 1G
[root@ceph1 ~]# rbd map data
[root@ceph1 ~]# mkfs.xfs /dev/rbd0
[root@ceph1 ~]# mkdir -p /mnt/data
# 第一次快照内容
[root@ceph1 ~]# mount /dev/rbd0 /mnt/data
[root@ceph1 ~]# echo snap1 > /mnt/data/snap1
[root@ceph1 ~]# umount /mnt/data
[root@ceph1 ~]# rbd snap create data@snap1
# 第二次快照内容
[root@ceph1 ~]# mount /dev/rbd0 /mnt/data
[root@ceph1 ~]# echo snap2 > /mnt/data/snap2
[root@ceph1 ~]# umount /mnt/data
[root@ceph1 ~]# rbd snap create rbd/data@snap2
# 当前内容
[root@ceph1 ~]# mount /dev/rbd0 /mnt/data
[root@ceph1 ~]# echo laogao > /mnt/data/laogao
[root@ceph1 ~]# umount /dev/rbd0
[root@ceph1 ~]# rbd unmap /dev/rbd0
实践部分:
bash
# 导出镜像完整变化
[root@ceph1 ~]# rbd export-diff rbd/data begin-end.data
# 导出创建之初到snap1之间变化
[root@ceph1 ~]# rbd export-diff rbd/data@snap1 begin-snap1.data
# 导出snap1到snap2之间变化
[root@ceph1 ~]# rbd export-diff --from-snap snap1 rbd/data@snap2 snap1-snap2.data
# 导出snap1到当前镜像之间变化
[root@ceph1 ~]# rbd export-diff --from-snap snap1 rbd/data snap1-end.data
#比较 RBD 镜像更改
Ceph 存储提供 rbd diff 命令来比较两个时间点之间对 RBD 镜像的变更。
bash
[root@ceph1 ~]# rbd help diff
usage: rbd diff [--pool <pool>] [--namespace <namespace>] [--image <image>] [--snap <snap>]
[--from-snap <from-snap>] [--whole-object] [--format <format>] [--pretty-format]
<image-or-snap-spec>
Print extents that differ since a previous snap, or image creation.
Positional arguments
<image-or-snap-spec>
image or snapshot specification (example: [<pool-name>/[<namespace>/]]<image-name>[@<snap-name>])
......
示例:
bash
[root@ceph1 ~]# rbd diff rbd/data@snap1 >diff-s1
[root@ceph1 ~]# rbd diff rbd/data@snap2 >diff-s2
[root@ceph1 ~]# rbd diff rbd/data >diff-all

#导入 RBD 镜像更改
Ceph 存储提供 rbd import-diff 命令来导入在两个时间点之间对 RBD 镜像的变更。
bash
[root@ceph1 ~]# rbd help import-diff
usage: rbd import-diff [--path <path>] [--pool <pool>] [--namespace <namespace>] [--image <image>]
[--sparse-size <sparse-size>] [--no-progress] <path-name> <image-spec>
......
import-diff 操作执行下列有效性检查:
-
如果export-diff指定了起始快照,在目标镜像必须存在相同快照。
-
如果export-diff指定了结束快照,导出成功后,会创建同样的快照。
示例:
- 导入准备:删除所有快照
bash
[root@ceph1 ~]# rbd snap purge data
- 导入第一个快照
bash
# 导入第一个快照
[root@ceph1 ~]# rbd import-diff begin-snap1.data rbd/data
Importing image diff: 100% complete...done.
[root@ceph1 ~]# rbd snap ls rbd/data
SNAPID NAME SIZE PROTECTED TIMESTAMP
8 snap1 1 GiB Fri Aug 22 20:42:23 2025
# 验证第一个快照中的内容
[root@ceph1 ~]# rbd map data@snap1 /dev/rbd0
[root@ceph1 ~]# mount /dev/rbd0 /mnt/data
mount: /mnt/data: WARNING: device write-protected, mounted read-only.
[root@ceph1 ~]# ls /mnt/data/
snap1
[root@ceph1 ~]# cat /mnt/data/snap1
snap1
[root@ceph1 ~]# umount /mnt/data
- 导入第二个快照
bash
# 导入第二个快照增量文件
[root@ceph1 ~]# rbd import-diff snap1-snap2.data rbd/data
Importing image diff: 100% complete...done.
[root@ceph1 ~]# rbd snap ls data
SNAPID NAME SIZE PROTECTED TIMESTAMP
8 snap1 1 GiB Fri Aug 22 20:42:23 2025
9 snap2 1 GiB Fri Aug 22 20:43:30 2025
# 验证第二个快照中的内容
[root@ceph1 ~]# rbd map data@snap2 /dev/rbd1
[root@ceph1 ~]# mount /dev/rbd1 /mnt/data
mount: /mnt/data: WARNING: device write-protected, mounted read-only.
[root@ceph1 ~]# ls /mnt/data/
snap1 snap2
[root@ceph1 ~]# grep . /mnt/data/*
/mnt/data/snap1:snap1
/mnt/data/snap2:snap2
[root@ceph1 ~]# umount /mnt/data
- 导入第一个快照到最后内容
bash
# 导入snap1到最终状态增量文件
[root@ceph1 ~]# rbd import-diff snap1-end.data rbd/data
Importing image diff: 100% complete...done.
[root@ceph1 ~]# rbd snap ls data
SNAPID NAME SIZE PROTECTED TIMESTAMP
8 snap1 1 GiB Fri Aug 22 20:42:23 2025
9 snap2 1 GiB Fri Aug 22 20:43:30 2025
# 验证镜像当前内容
[root@ceph1 ~]# rbd map data /dev/rbd2
[root@ceph1 ~]# mount /dev/rbd2 /mnt/data/
[root@ceph1 ~]# ls /mnt/data/
laogao snap1 snap2
[root@ceph1 ~]# grep . /mnt/data/*
/mnt/data/laogao:laogao
/mnt/data/snap1:snap1
/mnt/data/snap2:snap2
[root@ceph1 ~]# umount /mnt/data
#配置 RBD Mirrors
#RBD Mirrors 介绍
Ceph 存储支持在两个存储集群之间进行 RBD 镜像同步,将 RBD 镜像从一个Ceph 存储集群自动复制到 另一个远程集群。如果包含主要 RBD 镜像的集群变得不可用,则可以从远程集群故障转移到次要 RBD 镜像,并重启使用它的应用。
#受支持的镜像配置
RBD 镜像功能支持两种配置:
-
单向镜像(主动-被动),在单向模式中,一个集群的 RBD 镜像可以读写模式访问,远程集群中包 含镜像。镜像代理在远程集群上运行。这种模式可以支持配置多个次要集群。

-
双向镜像(主动-主动),在双向模式中,Ceph 使来源与目标对(主要与次要)保持同步。此模式 允许在两个集群之间进行复制,用户也必须在每个集群上配置镜像代理。

#受支持的镜像模式
RBD 镜像功能支持两种模式:
-
池模式,Ceph 自动为被镜像池中的每一个 RBD 镜像启用镜像功能。当用户在来源集群上的池中创 建镜像时,Ceph 会在远程集群中创建次要镜像。
-
镜像模式,Ceph 选择性地为被镜像池中的个别 RBD 镜像启用镜像功能。在这种模式中,用户必须 显式选择要在两个集群之间复制的 RBD 镜像。
#RBD 镜像的镜像状态
在两个Ceph 存储集群之间异步镜像,通过以下模式实现:
-
基于日志的镜像,此模式通过 RBD 日志镜像功能来确保两个Ceph 存储集群之间的时间点和崩溃一 致性复制。对 RBD 镜像的每一次写入首先要记录到相关日志中,然后再修改实际镜像。远程集群从 此日志中读取,并将更新内容重播到其镜像的本地副本。
-
基于快照的镜像,基于快照的镜像使用定期调度或手动创建的 RBD 镜像快照,在两个Ceph 存储集 群之间复制崩溃一致性 RBD 镜像。远程集群确定两个镜像快照之间的数据或元数据更新,并将增量 复制到镜像的本地副本。RBD fast-diff 镜像功能可快速确定更新的数据块,而无需扫描完整的 RBD 镜像。在故障转移场景中,必须先同步两个快照之间的完整增量,然后才能使用。任何部分应 用的增量集都会在故障转移时回滚。
#RBD Mirrors 配置
存储管理员可通过在ceph存储集群之间镜像数据镜像来提高冗余度,防止数据丢失,如防范站点故障。
要实现 RBD 镜像功能,必须启用 rbd-mirror 守护进程来发现其对等集群,以及使用专用用户帐户注册 对等集群。使用 rbd mirror pool peer bootstrap create 命令来自动执行此过程。
rbd-mirror 守护进程的每个实例都必须同时连接到本地和远程 Ceph 集群。此外,两个数据中心之间的 网络必须有足够的带宽来处理镜像工作负载。
#RBD Mirrors 过程
rbd-mirror 守护进程不要求源集群和目标集群具有唯一的内部名称;两者都可以而且应当自称为 ceph。 rbd mirror pool peer bootstrap 命令会利用 --site-name 选项来描述 rbdmirror 守护进程使用的 集群。
下表概述了在 prod 和 backup 两个集群之间配置镜像功能所需的步骤:
-
在 prod 和 backup 两个集群中创建一个同名池。
-
在启用 exclusive-lock 和 journaling 功能的情况下,创建或修改 RBD 镜像。
-
在池上启用池模式镜像功能。
-
在 prod 集群中,引导存储集群对等体并保存引导令牌。
-
部署 rbd-mirror 守护进程。
-
对于单向复制,rbd-mirror 守护进程仅在 backup 集群上运行。
-
对于双向复制,rbd-mirror 守护进程会在两个集群上运行。
#单向-池模式-配置
在本例中,用户将看到使用 prod 和 backup 集群配置单向镜像所需的分步说明。
-
ceph1 所在集群为 prod 集群
-
ceph4 所在集群为 backup 集群
#简要配置过程如下:
-
确保双集群状态是 HEALTH_OK 。
-
双集群同时创建并初始化池。
-
prod 集群创建镜像。
-
prod 集群启用池模式镜像功能。
-
prod 集群创建引导 token并同步到 backup 集群。
-
backup 集群部署 rbd-mirror进程,并使用单向( rx-only )导入 prod 集群token。
-
验证池和镜像状态。
具体配置过程如下:
- 确保双集群状态是 HEALTH_OK 。
bash
[root@ceph1 ~]# ceph health
HEALTH_OK
[root@ceph4 ~]# ceph health
HEALTH_OK
- 双集群同时创建并初始化池。
bash
# 主集群 [root@ceph1 ~]# ceph osd pool create rbd 32 32
[root@ceph1 ~]# rbd pool init rbd
# 备集群 [root@ceph4 ~]# ceph osd pool create rbd 32 32
[root@ceph4 ~]# rbd pool init rbd
- prod 集群创建镜像。
bash
# 创建image1并开启 layering, exclusive-lock, journaling 特性
[root@ceph1 ~]# rbd create image1 --size 1024 --pool rbd --image-feature=layering,exclusive-lock,journaling
[root@ceph1 ~]# rbd ls rbd
image1
# 查看镜像特性信息
[root@ceph1 ~]# rbd info image1
rbd image 'image1':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: acaadb9409a3
block_name_prefix: rbd_data.acaadb9409a3
format: 2
features: layering, exclusive-lock, journaling # layering, exclusive-lock, journaling功能已经开启
op_features:
flags:
create_timestamp: Fri Aug 22 20:55:23 2025
access_timestamp: Fri Aug 22 20:55:23 2025
modify_timestamp: Fri Aug 22 20:55:23 2025
journal: acaadb9409a3
mirroring state: disabled # mirror镜像功能未开启
- prod 集群启用池模式镜像功能。
bash
# rbd池开启mirror功能,池级别
[root@ceph1 ~]# rbd mirror pool enable rbd pool
[root@ceph1 ~]# rbd info image1
rbd image 'image1':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: acaadb9409a3
block_name_prefix: rbd_data.acaadb9409a3
format: 2
features: layering, exclusive-lock, journaling
op_features:
flags:
create_timestamp: Fri Aug 22 20:55:23 2025
access_timestamp: Fri Aug 22 20:55:23 2025
modify_timestamp: Fri Aug 22 20:55:23 2025
journal: acaadb9409a3
mirroring state: enabled # mirror开启
mirroring mode: journal # 镜像模式:日志
mirroring global id: df19e4c3-cdd8-4b9f-89c5-f980d5b46c31
mirroring primary: true # 当前为主端
- prod 集群创建引导token,并同步到 backup 集群。
bash
[root@ceph1 ~]# rbd mirror pool peer bootstrap create --site-name prod rbd > bootstrap_token_prod
[root@ceph1 ~]# rsync -a bootstrap_token_prod root@ceph4:
- backup 集群部署rbd-mirror进程,并导入prod 集群token。
bash
# 在ceph4节点部署rbd-mirror服务
[root@ceph4 ~]# ceph orch apply rbd-mirror --placement=ceph4.laogao.cloud
Scheduled rbd-mirror update...
# 查看rbd-mirror运行状态
[root@ceph4 ~]# ceph orch ls rbd-mirror
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
rbd-mirror 1/1 54s ago 56s ceph4.laogao.cloud
# 导入集群对等节点引导令牌,站点名称backup,仅接收同步
[root@ceph4 ~]# rbd mirror pool peer bootstrap import --site-name backup --direction rx-only rbd bootstrap_token_prod
- 验证 backup 集群池和镜像的同步状态。
bash
# 查看rbd池镜像对等信息
[root@ceph4 ~]# rbd mirror pool info rbd
Mode: pool
Site Name: backup
Peer Sites:
UUID: be8faee1-d28c-45dd-95d9-9b37099f4c58
Name: prod
Direction: rx-only
Client: client.rbd-mirror-peer
# 查看镜像池运行状态
[root@ceph4 ~]# rbd mirror pool status
health: OK
daemon health: OK
image health: OK
images: 1 total, 1 replaying
[root@ceph4 ~]# rbd ls rbd
image1
# 查看镜像信息
[root@ceph4 ~]# rbd info image1
rbd image 'image1':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: acc0c87c8d2f
block_name_prefix: rbd_data.acc0c87c8d2f
format: 2
features: layering, exclusive-lock, journaling
op_features:
flags:
create_timestamp: Fri Aug 22 20:58:56 2025
access_timestamp: Fri Aug 22 20:58:56 2025
modify_timestamp: Fri Aug 22 20:58:56 2025
journal: acc0c87c8d2f
mirroring state: enabled
mirroring mode: journal
mirroring global id: df19e4c3-cdd8-4b9f-89c5-f980d5b46c31
mirroring primary: false # 当前为mirror从端
# 验证镜像同步状态
[root@ceph4 ~]# rbd mirror image status image1
image1:
global_id: df19e4c3-cdd8-4b9f-89c5-f980d5b46c31
state: up+replaying
description: replaying, {"bytes_per_second":17.5,"entries_behind_primary":0,"entries_per_second":0.2,
"non_primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1},"primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1}}
service: ceph4.ddmzxf on ceph4.laogao.cloud
last_update: 2025-08-22 20:59:22
- 验证 prod 集群池和镜像的同步状态。
bash
# 查看主集群rbd镜像池对等信息
[root@ceph1 ~]# rbd mirror pool info rbd
Mode: pool
Site Name: prod
Peer Sites:
UUID: 2e835b66-1a98-4f2a-a10c-8b6b8af39f54
Name: backup
Mirror UUID: 9f354662-3968-4bc3-b809-4d7659f8bc9a
Direction: tx-only
# 主集群单向发送模式,无法获取备集群进程与集群健康状态
[root@ceph1 ~]# rbd mirror pool status
health: UNKNOWN
daemon health: UNKNOWN
image health: OK
images: 1 total, 1 replaying
# 查看镜像同步状态
[root@ceph1 ~]# rbd mirror image status image1
image1:
global_id: df19e4c3-cdd8-4b9f-89c5-f980d5b46c31
注意:在单向模式中,主集群无法看到备用集群的集群状态和rbd-mirror进程状态。备集群中的 RBD 镜像代理会更新状态信息。
清理配置过程如下:
- 删除镜像:优先从创建节点删除。如果同步服务已经终止,则需要强制禁用镜像同步,然后再删 除。
bash
[root@ceph1 ~]# rbd rm image1
- 删除同步对端
bash
# 先在 backup 集群执行,UUID 通过 rbd mirror pool info rbd 查询获取
[root@ceph4 ~]# rbd mirror pool peer remove rbd be8faee1-d28c-45dd-95d9-9b37099f4c58
# 然后在 prod 集群执行
[root@ceph1 ~]# rbd mirror pool peer remove rbd 2e835b66-1a98-4f2a-a10c-8b6b8af39f54
- 禁用池同步
bash
[root@ceph1 ~]# rbd mirror pool disable rbd
# 如果池中存在同步的镜像,则需要先禁用镜像同步,在禁用池同步
[root@ceph4 ~]# rbd mirror image disable image1 --force
[root@ceph4 ~]# rbd mirror pool disable rbd
- 删除池
bash
[root@ceph1 ~]# ceph config set mon mon_allow_pool_delete true
[root@ceph1 ~]# ceph osd pool rm rbd rbd --yes-i-really-really-mean-it
[root@ceph4 ~]# ceph config set mon mon_allow_pool_delete true
[root@ceph4 ~]# ceph osd pool rm rbd rbd --yes-i-really-really-mean-it
- 删除同步进程 rbd-mirror
bash
# 禁止自动管理
[root@ceph4 ~]# ceph orch apply rbd-mirror --unmanaged
Scheduled rbd-mirror update...
# 获取rbd-mirror进程的id
[root@ceph4 ~]# systemctl list-units|grep -o ' \brbd-mirror[^ ]* '
rbd-mirror.ceph4.ddmzxf
# 删除rbd-mirror进程
[root@ceph4 ~]# ceph orch daemon rm rbd-mirror.ceph4.ddmzxf
或者直接删除rbd-mirror服务
bash
[root@ceph4 ~]# ceph orch rm rbd-mirror
#双向-池模式-配置
全新的双向池模式同步,简要配置过程如下:
-
确保双集群状态是 HEALTH_OK 。
-
双集群同时创建并初始化池。
-
prod 集群创建镜像。
-
prod 集群启用池模式镜像功能。
-
prod 集群创建引导 token并同步到 backup 集群。
-
backup 集群部署 rbd-mirror进程,并使用双向( rx-tx )导入 prod 集群token。
-
prod 集群部署 rbd-mirror进程。
-
验证池和镜像状态。
基于现有的单向池模式同步更改为双向池模式同步,简要配置过程如下:
-
backup 集群创建镜像。
-
prod 集群删除原先自动创建的 tx-only 对端。
-
backup 集群删除原先单方向同步,并使用双向( rx-tx )导入 prod 集群token。
-
prod 集群部署rbd-mirror进程。
-
验证池和镜像状态。
本次演示基于全新的双向同步操作。
具体配置过程如下:
- 确保双集群状态是 HEALTH_OK 。
bash
[root@ceph1 ~]# ceph health
HEALTH_OK
[root@ceph4 ~]# ceph health
HEALTH_OK
- 双集群同时创建并初始化池。
bash
# 主集群
[root@ceph1 ~]# ceph osd pool create rbd 32 32
[root@ceph1 ~]# rbd pool init rbd
# 备集群
[root@ceph4 ~]# ceph osd pool create rbd 32 32
[root@ceph4 ~]# rbd pool init rbd
- prod 集群创建镜像image1、prod 集群创建镜像image2。
bash
# ceph1(prod集群)创建image1,开启 layering,exclusive-lock,journaling 特性
[root@ceph1 ~]# rbd create image1 --size 1024 --pool rbd --image-feature=layering,exclusive-lock,journaling
# ceph4(backup集群)创建image2,开启 layering,exclusive-lock,journaling 特性
[root@ceph4 ~]# rbd create image2 --size 1024 --pool rbd --image-feature=layering,exclusive-lock,journaling
- 双集群启用池模式镜像功能。
bash
[root@ceph1 ~]# rbd mirror pool enable rbd pool
[root@ceph4 ~]# rbd mirror pool enable rbd pool
- prod 集群创建引导 token并同步到 backup 集群。
bash
[root@ceph1 ~]# rbd mirror pool peer bootstrap create --site-name prod rbd > bootstrap_token_prod
[root@ceph1 ~]# rsync -a bootstrap_token_prod root@ceph4:
- backup 集群部署 rbd-mirror 进程,并使用双向( rx-tx )导入 prod 集群token。
bash
[root@ceph4 ~]# ceph orch apply rbd-mirror --placement=ceph4.laogao.cloud
Scheduled rbd-mirror update...
# 查看rbd-mirror服务运行状态
[root@ceph4 ~]# ceph orch ls rbd-mirror
NAME RUNNING REFRESHED AGE PLACEMENT
rbd-mirror 1/1 4s ago 16s ceph4.laogao.cloud
# 导入集群对等引导令牌,站点名称backup,双向同步模式
[root@ceph4 ~]# rbd mirror pool peer bootstrap import --site-name backup --direction rx-tx rbd bootstrap_token_prod
- 验证两个集群中池同步状态。
bash
# 在ceph4(backup集群)查看池镜像同步状态
[root@ceph4 ~]# rbd mirror pool status
health: WARNING
daemon health: OK
image health: WARNING
images: 2 total, 2 unknown
# 在ceph1(prod集群)查看池镜像同步状态
[root@ceph1 ~]# rbd mirror pool status
health: UNKNOWN
daemon health: UNKNOWN
image health: OK
images: 1 total, 1 replaying
# backup集群查看对等站点信息(双向同步 rx-tx)
[root@ceph4 ~]# rbd mirror pool info rbd
Mode: pool
Site Name: backup
Peer Sites:
UUID: 8f595ed3-49b7-4806-9060-40c8b4849762
Name: prod
Mirror UUID:
Direction: rx-tx
Client: client.rbd-mirror-peer
# prod集群查看对等站点信息(双向同步 rx-tx)
[root@ceph1 ~]# rbd mirror pool info rbd
Mode: pool
Site Name: prod
Peer Sites:
UUID: faa7b6b6-b748-4efa-b31e-91c2eb38d689
Name: backup
Mirror UUID: 8cdf8c6c-3bd3-47bd-bb45-1bb8239a5e82
Direction: rx-tx
Client: client.rbd-mirror-peer
- 验证两个集群镜像同步状态。
双集群image1状态
bash
# prod集群(ceph1)查看image1镜像同步状态
[root@ceph1 ~]# rbd mirror image status image1
image1:
global_id: bfde0b15-681e-45fc-9ad0-9ceb74f8b585
state: down+unknown
description: status not found
last_update:
peer_sites:
name: backup
state: up+replaying
description: replaying, {"bytes_per_second":0.0,"entries_behind_primary":0,"entries_per_second":0.0,
"non_primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1},"primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1}}
last_update: 2025-08-23 17:18:22
# backup集群(ceph4)查看image1镜像同步状态
[root@ceph4 ~]# rbd mirror image status image1
image1:
global_id: bfde0b15-681e-45fc-9ad0-9ceb74f8b585
state: up+replaying
description: replaying, {"bytes_per_second":0.0,"entries_behind_primary":0,"entries_per_second":0.0,
"non_primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1},"primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1}}
service: ceph4.jitnqq on ceph4.laogao.cloud
last_update: 2025-08-23 17:17:22
双集群image2状态
bash
# backup集群ceph4查看image2镜像同步状态
[root@ceph4 ~]# rbd mirror image status image2
image2:
global_id: b517e528-89f6-4246-a87d-777942b13649
state: up+stopped
description: local image is primary
service: ceph4.jitnqq on ceph4.laogao.cloud
last_update: 2025-08-23 17:19:52
# prod集群ceph1不存在image2镜像
[root@ceph1 ~]# rbd mirror image status image2
rbd: error opening image image2: (2) No such file or directory
- prod 集群部署rbd-mirror进程。
bash
# 在ceph1节点部署rbd-mirror服务
[root@ceph1 ~]# ceph orch apply rbd-mirror --placement=ceph1.laogao.cloud
Scheduled rbd-mirror update...
# 查看rbd-mirror运行状态
[root@ceph1 ~]# ceph orch ls rbd-mirror
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
rbd-mirror 1/1 9s ago 12s ceph1.laogao.cloud
- 验证两个集群池同步状态。
bash
# prod集群ceph1查看镜像池状态
[root@ceph1 ~]# rbd mirror pool status
health: OK
daemon health: OK
image health: OK
images: 2 total, 2 replaying
# backup集群ceph4查看镜像池状态
[root@ceph4 ~]# rbd mirror pool status
health: OK
daemon health: OK
image health: OK
images: 2 total, 2 replaying
- 验证集群中镜像同步状态。
bash
# ceph1(prod)查看image1状态
[root@ceph1 ~]# rbd mirror image status image1
image1:
global_id: bfde0b15-681e-45fc-9ad0-9ceb74f8b585
state: up+stopped
description: local image is primary
service: ceph1.umpyob on ceph1.laogao.cloud
last_update: 2025-08-23 17:29:28
peer_sites:
name: backup
state: up+replaying
description: replaying, {"bytes_per_second":0.0,"entries_behind_primary":0,"entries_per_second":0.0,
"non_primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1},"primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1}}
last_update: 2025-08-23 17:29:22
# ceph1(prod)查看image2状态
[root@ceph1 ~]# rbd mirror image status image2
image2:
global_id: b517e528-89f6-4246-a87d-777942b13649
state: up+replaying
description: replaying, {"bytes_per_second":0.0,"entries_behind_primary":0,"entries_per_second":0.0,
"non_primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1},"primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1}}
service: ceph1.umpyob on ceph1.laogao.cloud
last_update: 2025-08-23 17:29:58
peer_sites:
name: backup
state: up+stopped
description: local image is primary
last_update: 2025-08-23 17:29:52
# ceph4(backup)查看image1状态
[root@ceph4 ~]# rbd mirror image status image1
image1:
global_id: bfde0b15-681e-45fc-9ad0-9ceb74f8b585
state: up+replaying
description: replaying, {"bytes_per_second":0.0,"entries_behind_primary":0,"entries_per_second":0.0,
"non_primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1},"primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1}}
service: ceph4.jitnqq on ceph4.laogao.cloud
last_update: 2025-08-23 17:30:22
peer_sites:
name: prod
state: up+stopped
description: local image is primary
last_update: 2025-08-23 17:30:28
# ceph4(backup)查看image2状态
[root@ceph4 ~]# rbd mirror image status image2
image2:
global_id: b517e528-89f6-4246-a87d-777942b13649
state: up+stopped
description: local image is primary
service: ceph4.jitnqq on ceph4.laogao.cloud
last_update: 2025-08-23 17:30:22
peer_sites:
name: prod
state: up+replaying
description: replaying, {"bytes_per_second":0.0,"entries_behind_primary":0,"entries_per_second":0.0,
"non_primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1},"primary_position": {"entry_tid":3,"object_number":3,"tag_tid":1}}
last_update: 2025-08-23 17:30:28
在双向模式中:
-
prod集群看到自己创建的镜像同步状态:本地是 up+stopped ,对端是 up+replaying 。
-
prod集群看到同步过来的镜像同步状态:本地是 up+replaying ,对端是 up+stopped 。
清理配置过程如下:
- 删除镜像:优先从创建节点删除。如果同步服务已经终止,则需要强制禁用镜像同步,然后再删 除。
bash
[root@ceph1 ~]# rbd rm image1
[root@ceph4 ~]# rbd rm image2
- 删除同步对端
bash
# 先在 prod 集群执行
[root@ceph1 ~]# rbd mirror pool peer remove rbd faa7b6b6-b748-4efa-b31e- 91c2eb38d689
# 然后在 backup 集群执行
[root@ceph4 ~]# rbd mirror pool peer remove rbd 8f595ed3-49b7-4806-9060- 40c8b4849762
如果删除同步后,系统还会自动创建单方向同步,需要再次删除。
bash
# backup集群查看镜像对等信息
[root@ceph4 ~]# rbd mirror pool info rbd
Mode: pool
Site Name: backup
Peer Sites:
UUID: 7a9afa38-6c8a-4b0d-ac1a-ec33e670439c
Name: prod
Mirror UUID: 19c8d1c0-e541-4064-a328-2cab9291bdaf
Direction: tx-only
# 删除该对等集群关联
[root@ceph4 ~]# rbd mirror pool peer remove rbd 7a9afa38-6c8a-4b0d-ac1a-ec33e670439c
# prod集群执行相同操作(删除backup对等端) # R1相同
[root@ceph1 ~]# rbd mirror pool peer remove rbd <对应peer-UUID>
- 禁用池同步
bash
[root@ceph1 ~]# rbd mirror pool disable rbd
[root@ceph4 ~]# rbd mirror pool disable rbd
# 如果池中存在同步的镜像,则需要先强制禁用镜像同步
[root@ceph4 ~]# rbd mirror image disable image1 --force
- 删除池
bash
[root@ceph1 ~]# ceph config set mon mon_allow_pool_delete true
[root@ceph1 ~]# ceph osd pool rm rbd rbd --yes-i-really-really-mean-it
[root@ceph4 ~]# ceph config set mon mon_allow_pool_delete true
[root@ceph4 ~]# ceph osd pool rm rbd rbd --yes-i-really-really-mean-it
- 删除同步进程 rbd-mirror
bash
# backup集群(ceph4)清理rbd-mirror服务
[root@ceph4 ~]# ceph orch apply rbd-mirror --unmanaged
[root@ceph4 ~]# systemctl list-units|grep -o ' \brbd-mirror[^ ]* '
rbd-mirror.ceph4.jitnqq
[root@ceph4 ~]# ceph orch daemon rm rbd-mirror.ceph4.jitnqq
Removed rbd-mirror.ceph4.jitnqq from host 'ceph4.laogao.cloud'
# prod集群(ceph1)清理rbd-mirror服务
[root@ceph1 ~]# ceph orch apply rbd-mirror --unmanaged
[root@ceph1 ~]# systemctl list-units|grep -o ' \brbd-mirror[^ ]* '
rbd-mirror.ceph1.umpyob
[root@ceph1 ~]# ceph orch daemon rm rbd-mirror.ceph1.umpyob
Removed rbd-mirror.ceph1.umpyob from host 'ceph1.laogao.cloud'