#作者:闫乾苓
文章目录
- 前言
- 基于快照的模式(Snapshot-based Mode)
- 工作原理
- 单向同步配置步骤
- 单向同步复制测试
- 双向同步配置步骤
- 双向同步复制测试
前言
Ceph的RBD(RADOS Block Device)支持在两个Ceph集群之间进行异步镜像复制,提供了两种主要模式:基于日志(Journal-based)和基于快照(Snapshot-based)。这两种模式各有优缺点,适用于不同的场景和需求。
根据所需的复制需求,RBD 镜像可以配置为单向或双向复制:
- 单向复制:当数据仅从主群集镜像到辅助群集时,rbd-mirror守护进程仅在辅助群集上运行。
- 双向复制:当数据从一个集群上的主映像镜像到另一个集群上的非主映像(反之亦然)时, rbd-mirror守护进程在两个集群上运行。
基于快照的模式(Snapshot-based Mode)
工作原理
- 使用定期计划或手动创建的RBD镜像快照来进行集群间的复制。
- 远程集群会比较两个快照之间的数据或元数据更新,并将差异部分复制到其本地副本。
- 利用RBD的快速差异(fast-diff)功能,可以快速确定哪些数据块发生了变化,而无需扫描整个RBD镜像。
优点:
- 低延迟写入:不需要额外的日志记录,写操作不会显著增加延迟。
- 灵活性:可以根据需要手动创建快照或设置自动快照策略,灵活适应不同的业务需求。
缺点:
- 较粗粒度:与基于日志的模式相比,快照模式不够精细,需要同步完整的差异部分,而不是逐个写操作。
- 恢复时间较长:在故障切换时,如果部分差异未完全应用,则需要回滚到上一个完整快照状态,可能会导致更长的恢复时间。
适用场景:
对写性能要求较高且能接受一定延迟的应用,如文件存储、备份等。
单向同步配置步骤
- 在两个ceph集群上登录到cephadm shell
[root@ceph01 ~]# cephadm shell
[root@ceph-a ~]# cephadm shell
- 在site-b集群中ceph-b节点部署 rbd-mirror 守护进程
[ceph: root@ceph-a /]# ceph orch apply rbd-mirror ceph-b
Scheduled rbd-mirror update...
查看守护进程是否正常启动
[ceph: root@ceph-a /]# ceph orch ls |grep rbd-mirror
rbd-mirror 1/1 5m ago 4h ceph-b
- 在源集群site-a新建1个存储池名为data,并启用 RBD 应用程序,在池data中创建1个名为image1的image
[ceph: root@ceph01 /]# ceph osd pool create data
pool 'data' created
[ceph: root@ceph01 /]# ceph osd pool application enable data rbd
enabled application 'rbd' on pool 'data'
[ceph: root@ceph01 /]# rbd create --size 1024 data/image1
- 在目标集群site-b新建1个同名存储池data,并启用 RBD 应用程序,不用创建image
[ceph: root@ceph-a /]# ceph osd pool create data
pool 'data' created
[ceph: root@ceph-a /]# ceph osd pool application enable data rbd
enabled application 'rbd' on pool 'data'
- 在site-a,site-b两个存储集群中选择 mirroring 模式为image
[ceph: root@ceph01 /]# rbd mirror pool enable data image
[ceph: root@ceph-a /]# rbd mirror pool enable data image
- 验证两个集群都已成功启用了镜像模式为pool
[ceph: root@ceph01 /]# rbd mirror pool info data
Mode: image
Site Name: 0978cb18-dc68-11ef-b0d7-000c29460ffd
Peer Sites: none
[ceph: root@ceph-a /]# rbd mirror pool info data
Mode: image
Site Name: baedc6c0-e058-11ef-a23a-000c29cf8329
Peer Sites: none
- 在site-a集群创建 Ceph 用户帐户,并将存储集群对等注册到池,将 bootstrap 令牌文件复制到site-b存储集群。
[ceph: root@ceph01 /]# rbd mirror pool peer bootstrap create --site-name site-a data > /root/bootstrap_token_site-a
- 在site-b集群中导入bootstrap令牌
[ceph: root@ceph-a /]# rbd mirror pool peer bootstrap import --site-name site-b --direction rx-only data /root/bootstrap_token_site-a
注意:对于单向 RBD 镜像功能,必须使用–direction rx-only参数,因为在引导 对等时双向镜像是默认设置。
- 在site-a集群 data池中为需要同步的image启用镜像快照同步功能
[ceph: root@ceph01 /]# rbd mirror image enable data/image1 snapshot
Mirroring enabled
- site-a集群验证镜像同步复制状态
[ceph: root@ceph01 /]# rbd mirror image status data/image1
image1:
global_id: 6f6c3690-df01-49dd-9508-f7c944fbcd9a
snapshots:
3 .mirror.primary.6f6c3690-df01-49dd-9508-f7c944fbcd9a.3da61eb1-7512-44c2-b4e9-8d6a987e1a9c (peer_uuids:[f9128159-df9f-43eb-be57-4f798da002cc])
- site-b集群验证镜像同步复制状态
[ceph: root@ceph-a /]# rbd mirror image status data/image1
image1:
global_id: 6f6c3690-df01-49dd-9508-f7c944fbcd9a
state: up+replaying
description: replaying, {"bytes_per_second":0.0,"bytes_per_snapshot":0.0,"last_snapshot_bytes":0,"last_snapshot_sync_seconds":0,"local_snapshot_timestamp":1738897439,"remote_snapshot_timestamp":1738897439,"replay_state":"idle"}
service: ceph-b.tglrho on ceph-b
last_update: 2025-02-07 03:06:22
如果镜像处于up+replaying状态,表示可以正常工作。up表示rbd-mirror守护进程正在运行,replaying表示此镜像是从另一个存储集群复制的目标。
单向同步复制测试
在同一个client端服务器映射及挂载2个集群的rbd image, 在源集群site-a写入测试数据,手动触发快照,查看数据是否同步到目标集群site-b的同名池。
- 准备两个集群的conf,keyring文件
将cephadm shell 所在容器中/etc/ceph/下的conf,keyring文件复制到client服务器/etc/ceph目录并修改文件名字以示区别。
[ceph: root@ceph01 /]# ls -l /etc/ceph/
-rw------- 1 ceph ceph 323 Jan 27 05:48 ceph.conf
-rw------- 1 root root 151 Feb 7 02:35 ceph.keyring
[root@cilent ~]# ll /etc/ceph/
-rw-r--r--. 1 root root 92 10月 18 2023 rbdmap
-rw-r--r-- 1 root root 186 2月 5 19:14 site-a.client.admin.keyring
-rw-r--r-- 1 root root 304 2月 5 19:13 site-a.conf
-rw-r--r-- 1 root root 186 2月 5 19:20 site-a.keyring
-rw-r--r-- 1 root root 186 2月 5 19:15 site-b.client.admin.keyring
-rw-r--r-- 1 root root 337 2月 5 19:13 site-b.conf
- 使用rbd map 映射源集群site-a中data/image到client本地dev设备
[root@cilent ~]# rbd map image1 --pool data -c /etc/ceph/site-a.conf -k /etc/ceph/site-a.client.admin.keyring
/dev/rbd0
[root@cilent ~]# lsblk |grep rbd0
rbd0 252:0 0 1G 0 disk
- 将rbd0格式化并mount到目录
[root@cilent mnt]# mkfs.xfs /dev/rbd0
Discarding blocks...Done.
[root@cilent mnt]# mkdir site-a site-b
[root@cilent mnt]# ll
drwxr-xr-x 2 root root 4096 2月 7 11:41 site-a
drwxr-xr-x 2 root root 4096 2月 7 11:41 site-b
[root@cilent mnt]# mount /dev/rbd0 /mnt/site-a
[root@cilent mnt]# df -h |grep site-a
/dev/rbd0 1014M 40M 975M 4% /mnt/site-a
- 在挂载点/mnt/site-a 使用dd写入2个100M大小的测试文件
[root@cilent mnt]# dd if=/dev/zero of=/mnt/site-a/100M-$(date +%F_%H%M%S) bs=1M count=100
[root@cilent mnt]# tree
.
├── site-a
│ ├── 100M-2025-02-07_114953
│ └── 100M-2025-02-07_115007
└── site-b
在没同步前查看两个集群data pool的磁盘使用信息
- 在源集群site-a中手动为data/image1创建快照
[ceph: root@ceph01 /]# rbd mirror image snapshot data/image1
Snapshot ID: 4
- 在site-b集群查看同步信息已更新
- 在client服务器将site-a集群rbd image取消挂载,删除map映射,
[root@cilent mnt]# umount /mnt/site-a
[root@cilent mnt]# rbd unmap image1 --pool data -c /etc/ceph/site-a.conf
-k /etc/ceph/site-a.client.admin.keyring
[root@cilent mnt]# tree
.
├── site-a
└── site-b
- 在site-a集群将data/image1降级为非主image
[ceph: root@ceph01 /]# rbd mirror image demote data/image1
Image demoted to non-primary
在site-b集群将data/image1提升为主image
[ceph: root@ceph-a /]# rbd mirror image promote data/image1
Image promoted to primary
- site-b集群map映射及挂载rbd image并查看数据是否同步
[root@cilent mnt]# rbd map image1 --pool data -c /etc/ceph/site-b.conf -k /etc/ceph/site-b.client.admin.keyring/dev/rbd0
[root@cilent mnt]# lsblk |grep rbd
rbd0 252:0 0 1G 0 disk
数据已同步
[root@cilent mnt]# mount /dev/rbd0 /mnt/site-b/
[root@cilent mnt]# tree
.
├── site-a
└── site-b
├── 100M-2025-02-07_114953
└── 100M-2025-02-07_115007
- 此时rab map不能映射site-a集群的data/image,因为已降级为非主,因只有主镜像有写权限,以避免数据冲突。
11. 在client服务器上取消挂载及site-b集群的data/image的映射。
[root@cilent mnt]# umount /mnt/site-b/
[root@cilent mnt]# rbd unmap image1 --pool data -c /etc/ceph/site-b.conf -k /etc/ceph/site-b.client.admin.keyring
- 在site-b集群将data/image降级为非主image
[ceph: root@ceph-a /]# rbd mirror image demote data/image1
Image demoted to non-primary
13.在site-a集群将data/image提升为主image
[ceph: root@ceph01 /]# rbd mirror image promote data/image1
Image promoted to primary
14.在site-b集群查看镜像同步状态,此时为split-brain(脑裂)状态
- 在site-b集群请求到site-a源镜像的重新同步
[ceph: root@ceph-a /]# rbd mirror image resync data/image1
Flagged image for resync from primary
Site-b同步状态过程如下:
[ceph: root@ceph-a /]# rbd mirror image status data/image1
rbd: error opening image image1: (2) No such file or directory
[ceph: root@ceph-a /]# rbd mirror image status data/image1
image1:
global_id: 6f6c3690-df01-49dd-9508-f7c944fbcd9a
state: down+unknown
description: status not found
last_update:
此时恢复正常同步状态
[ceph: root@ceph-a /]# rbd mirror image status data/image1
image1:
global_id: 6f6c3690-df01-49dd-9508-f7c944fbcd9a
state: up+replaying
description: replaying, {"bytes_per_second":10615398.4,"bytes_per_snapshot":106153984.0,"last_snapshot_bytes":0,"last_snapshot_sync_seconds":0,"local_snapshot_timestamp":1738909767,"remote_snapshot_timestamp":1738909767,"replay_state":"idle"}
service: ceph-b.tglrho on ceph-b
last_update: 2025-02-07 06:38:22
- 设置镜像快照定时策略
使用基于快照的镜像时,每当需要镜像 RBD 映像的更改内容时,都需要创建镜像快照。
默认情况下,每个image映像最多可创建5个快照。如果达到限制,则会自动删除最新的镜像快照。如果需要,可以通过配置选项覆盖该限制rbd_mirroring_max_mirroring_snapshots 。此外,当删除映像或禁用镜像时,会自动删除镜像快照。
可自定义了镜像快照计划,用于定期自动创建镜像快照。
镜像快照可以全局、按池或按映像级别进行安排。可以在任何级别定义多个镜像快照计划,但只有与单个镜像匹配的最具体的快照计划才会运行。
可以分别使用d、h、m、start-time后缀以天、小时或分钟为单位指定。
rbd mirror snapshot schedule add [--pool {pool-name}] [--image {image-name}] {interval} [{start-time}]
比如:在site-a集群中对data池下的image1制定每分钟创建1个快照的策略。
[ceph: root@ceph01 /]# rbd mirror snapshot schedule add --pool data --image image1 1m
[ceph: root@ceph01 /]# rbd mirror snapshot schedule ls --pool data --recursive
POOL NAMESPACE IMAGE SCHEDULE
data image1 every 1m
双向同步配置步骤
双向同步并非双向实时同步,只是在单向同步的基础上通过在源集群也部署rbd-mirror守护进程,在出现故障时,通过手动切换集群镜像的主辅角色,实现快速可以反向同步。
- 在两个ceph集群上登录到cephadm shell
[root@ceph01 ~]# cephadm shell
[root@ceph-a ~]# cephadm shell
- 在site-a集群中ceph02节点部署 rbd-mirror 守护进程
[ceph: root@ceph01 /]# ceph orch apply rbd-mirror ceph02
Scheduled rbd-mirror update...
在site-b集群中ceph-b节点部署 rbd-mirror 守护进程
[ceph: root@ceph-a /]# ceph orch apply rbd-mirror ceph-b
Scheduled rbd-mirror update...
查看守护进程是否正常启动
[ceph: root@ceph01 /]# ceph orch ls|grep rbd
rbd-mirror 1/1 8s ago 20s ceph02
[ceph: root@ceph-a /]# ceph orch ls |grep rbd
rbd-mirror 1/1 14s ago 24s ceph-b
- 在源集群site-a新建1个存储池名为data,并启用 RBD 应用程序,在池data中创建1个名为image1的image
[ceph: root@ceph01 /]# ceph osd pool create data
pool 'data' created
[ceph: root@ceph01 /]# ceph osd pool application enable data rbd
enabled application 'rbd' on pool 'data'
[ceph: root@ceph01 /]# rbd create --size 1024 data/image1
查看创建的image的信息
- 在目标集群site-b新建1个同名存储池data,并启用 RBD 应用程序,不用创建image
[ceph: root@ceph-a /]# ceph osd pool create data
pool 'data' created
[ceph: root@ceph-a /]# ceph osd pool application enable data rbd
enabled application 'rbd' on pool 'data'
- 在site-a,site-b两个存储集群中选择 mirroring 模式为image
[ceph: root@ceph01 /]# rbd mirror pool enable data image
[ceph: root@ceph-a /]# rbd mirror pool enable data image
- 验证两个集群都已成功启用了镜像模式为pool
[ceph: root@ceph01 /]# rbd mirror pool info data
Mode: image
Site Name: 0978cb18-dc68-11ef-b0d7-000c29460ffd
Peer Sites: none
[ceph: root@ceph-a /]# rbd mirror pool info data
Mode: image
Site Name: baedc6c0-e058-11ef-a23a-000c29cf8329
Peer Sites: none
- 在site-a集群创建 Ceph 用户帐户,并将存储集群对等注册到池,将 bootstrap 令牌文件复制到site-b存储集群。
[ceph: root@ceph01 /]# rbd mirror pool peer bootstrap create --site-name site-a data > /root/bootstrap_token_site-a
- 在site-b集群中导入bootstrap令牌
[ceph: root@ceph-a /]# rbd mirror pool peer bootstrap import --site-name site-b data /root/bootstrap_token_site-a
- 在site-a集群 data池中为需要同步的image启用镜像快照同步功能
[ceph: root@ceph01 /]# rbd mirror image enable data/image1 snapshot
Mirroring enabled
- site-a集群验证镜像同步复制状态
[ceph: root@ceph01 /]# rbd mirror image status data/image1
up 表示 rbd-mirror 守护进程正在运行,stopped 意味着此镜像不是从另一个存储集群复制的目标。这是因为镜像是这个存储集群的主要部分
peer_sites 显示了对等节点(site-b)的状态为up+replaying
说明此时的同步方向为site-a site-b
- site-b集群验证镜像同步复制状态
[ceph: root@ceph-a /]# rbd mirror image status data/image1
如果镜像处于up+replaying状态,表示可以正常工作。up表示rbd-mirror守护进程正在运行,replaying表示此镜像是从另一个存储集群复制的目标。
peer_sites 显示了对等节点的状态为up+stopped
双向同步复制测试
- 在client服务器端映射site-a集群的data池的image1,格式化并mount到挂载点目录。
[root@cilent mnt]# rbd map image1 --pool data -c /etc/ceph/site-a.conf -k /etc/ceph/site-a.client.admin.keyring
/dev/rbd0
[root@cilent mnt]# mkfs.xfs /dev/rbd0
[root@cilent mnt]# mount /dev/rbd0 /mnt/site-a
- dd写入1个100M的文件进行测试
[root@cilent site-a]# dd if=/dev/zero of=100M-$(date +%F_%H%M%S) bs=1M count=100
[root@cilent site-a]# tree /mnt/
/mnt/
├── site-a
│ └── 100M-2025-02-07_174949
└── site-b
- site-a集群为data/image1手动创建快照,查看是否同步到site-b集群
[ceph: root@ceph01 /]# rbd mirror image snapshot data/image1
Snapshot ID: 4
[ceph: root@ceph01 /]# rbd mirror image status data/image1
(4)查看两个集群data/image1的信息
[ceph: root@ceph01 /]# rbd --image data/image1 info
- 模拟site-a集群故障,手动将site-a data/image1降级为非主image
[ceph: root@ceph01 /]# rbd mirror image demote data/image1
Image demoted to non-primary
此时site-a集群的date/image1高级特性自动被设置为non-primary
- 手动将site-b data/image1提升为主image,如果因为site-a集群已经宕机,降级无法传播到site-a存储集群,可以使用 --force 选项
[ceph: root@ceph-a /]# rbd mirror image promote data/image1
Image promoted to primary
此时site-b集群的date/image1高级特性non-primary被取消,允许客户端进行挂载写入数据。
- client服务器端取消site-a集群data/image1的挂载和映射,改为site-b集群data/image1的挂载和映射.
[root@cilent ~]# umount /mnt/site-a
[root@cilent ~]# rbd unmap image1 --pool data -c /etc/ceph/site-a.conf -k /etc/ceph/site-a.client.admin.keyring
[root@cilent ~]# rbd map image1 --pool data -c /etc/ceph/site-b.conf -k /etc/ceph/site-b.client.admin.keyring
/dev/rbd0
[root@cilent ~]# mount /dev/rbd0 /mnt/site-b
查看之前的数据同步
[root@cilent ~]# tree /mnt/
/mnt/
├── site-a
└── site-b
└── 100M-2025-02-07_174949
- 再查看2个集群的同步状态
site-a集群的因为也部署了rbd-mirror守护程序,data/image1在被降级为非主镜像后,自动与设置过对等关系的site-b集群进行同步(up+replaying)。
site-b集群的data/image1因为被提升为主镜像,所以其状态为up+stopped
- 在site-b集群的data/image1的挂载目录写入测试数据并手动创建快照,观察同步情况。
[root@cilent ~]# cd /mnt/site-b/
[root@cilent site-b]# dd if=/dev/zero of=100M-$(date +%F_%H%M%S) bs=1M count=100
[root@cilent site-b]# tree /mnt/
/mnt/
├── site-a
└── site-b
├── 100M-2025-02-07_174949
└── 100M-2025-02-07_183332
[ceph: root@ceph-a /]# rbd mirror image snapshot data/image1
Snapshot ID: 7
- 如果site-b恢复正常,可以再将主镜像切换回来。
先降级site-b集群的data/image1
[ceph: root@ceph-a /]# rbd mirror image demote data/image1
Image demoted to non-primary
再提升site-a集群的data/image1
[ceph: root@ceph01 /]# rbd mirror image promote data/image1
Image promoted to primary
等待片刻,查看两集群同步状态已恢复原始状态。
(11) client服务器上重新挂载site-a集群的data/image1,并查看数据是否正常。
[root@cilent ~]# umount /mnt/site-b/
[root@cilent ~]# rbd unmap image1 --pool data -c /etc/ceph/site-b.conf -k /etc/ceph/site-b.client.admin.keyring
[root@cilent ~]# rbd map image1 --pool data -c /etc/ceph/site-a.conf -k /etc/ceph/site-a.client.admin.keyring
/dev/rbd0
[root@cilent ~]# rbd showmapped -c /etc/ceph/site-b.conf -k /etc/ceph/site-b.client.admin.keyring
id pool namespace image snap device
0 data image1 - /dev/rbd0
[root@cilent ~]# mount /dev/rbd0 /mnt/site-b
[root@cilent ~]# tree /mnt/
/mnt/
├── site-a
└── site-b
├── 100M-2025-02-07_174949
└── 100M-2025-02-07_183332