1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

利用 RBD 导出与导入机制,你可以在同一集群中,也可以使用另一独立集群维护拥有完整功能和可访问性的 RBD 镜像操作副本。你可以将这些副本用于各种不同的用例,包括:

  • 利用实际的数据卷测试新版本

  • 利用实际的数据卷运行质量保障流程

  • 实施业务连续性方案

  • 将备份进程从生产块设备分离

RADOS 块设备功能支持导出和导入整个 RBD 镜像,也可以仅导出和导入两个时间点之间的 RBD 镜像变化。

导出RBD镜像

 rbd export 命令将 RBD 镜像导出到文件。此命令可以将 RBD 镜像或 RBD 镜像快照导出到指定的目标文件

1
2
3
4
[root@clienta ~]# rbd export rbdpool/test export.dat
Exporting image: 100% complete...done.
[root@clienta ~]# ll -h export.dat
-rw-r--r--. 1 root root 10G Aug 7 04:14 export.dat

导入RBD镜像

Ceph Storage提供了rbd import命令,用于从文件中导入rbd镜像。该命令创建一个test2新镜像

1
2
3
4
5
6
[root@clienta ~]# rbd import export.dat rbdpool/test2
Importing image: 100% complete...done.
[root@clienta ~]# rbd ls -p rbdpool
clone1
test
test2

导出和导入RBD镜像的变化部分

 rbd export-diff 和 rbd import-diff 命令来导出和导入在两个时间点之间对 RBD 镜像的变更

端点时间可以是:

  • RBD 镜像的当前内容,如 poolname/imagename

  • RBD 镜像的快照,如 poolname/imagename@snapname

起始时间可以是:

  • RBD 镜像的创建日期和时间。例如,不使用 --from-snap 选项。

  • RBD 镜像的快照,如通过 --from-snap snapname 选项获取。

如果你指定起始点快照,命令将导出你创建该快照后的更改。如果不指定快照,命令将导出自 RBD 镜像创建之后的所有更改,这与常规的 RBD 镜像导出操作相同。

导出两个快照的不同之处

我们已经有一个包含数据的snap1,我们再向test镜像中写入点内容,然后重做一个新快照

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@clienta ~]# rbd snap ls rbdpool/test
SNAPID NAME SIZE PROTECTED TIMESTAMP
10 snap1 10 GiB yes Wed Aug 7 04:06:46 2024
[root@clienta ~]# rbd map rbdpool/test
/dev/rbd0
[root@clienta ~]# mount /dev/rbd0 /mnt
mount: /mnt: /dev/rbd0 already mounted on /mnt.
[root@clienta ~]# dd if=/dev/zero of=/mnt/test2.data bs=10M count=1
1+0 records in
1+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0199916 s, 525 MB/s
[root@clienta ~]# ls /mnt
lxh test2.data
[root@clienta ~]# fsfreeze --freeze /mnt
[root@clienta ~]# rbd snap create rbdpool/test@snap2
Creating snap: 100% complete...done.
[root@clienta ~]# fsfreeze --unfreeze /mnt
[root@clienta ~]# rbd snap ls rbdpool/test
SNAPID NAME SIZE PROTECTED TIMESTAMP
10 snap1 10 GiB yes Wed Aug 7 04:06:46 2024
11 snap2 10 GiB Wed Aug 7 04:30:54 2024

导出其不同之处,这就相当于做了一个增量备份

导出的是snap1到snap2的增量

1
2
3
4
[root@clienta ~]# rbd export-diff --from-snap snap1 rbdpool/test@snap2 diff.dat
Exporting image: 100% complete...done.
[root@clienta ~]# ll -h diff.dat
-rw-r--r--. 1 root root 2.3M Aug 7 04:31 diff.dat

导入这个增量数据到镜像

不要随便导入这个增量数据,除非你发生了数据丢失,比如snap2不见了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@clienta ~]# rbd snap ls rbdpool/test
SNAPID NAME SIZE PROTECTED TIMESTAMP
10 snap1 10 GiB yes Wed Aug 7 04:06:46 2024
13 snap2 10 GiB Wed Aug 7 04:33:18 2024
[root@clienta ~]# rbd snap rm rbdpool/test@snap2
Removing snap: 100% complete...done.
[root@clienta ~]# rbd snap ls rbdpool/test
SNAPID NAME SIZE PROTECTED TIMESTAMP
10 snap1 10 GiB yes Wed Aug 7 04:06:46 2024
[root@clienta ~]# rbd import-diff ./diff.dat rbdpool/test
Importing image diff: 100% complete...done.
[root@clienta ~]# rbd snap ls rbdpool/test
SNAPID NAME SIZE PROTECTED TIMESTAMP
10 snap1 10 GiB yes Wed Aug 7 04:06:46 2024
15 snap2 10 GiB Wed Aug 7 04:33:38 2024

合并差异

写入点数据,然后再做一个增量备份

导出的是snap2到实时的增量

1
2
3
4
5
[root@clienta ~]# touch /mnt/diff2
[root@clienta ~]# ls /mnt/
diff2 lxh test2.data
[root@clienta ~]# rbd export-diff --from-snap snap2 rbdpool/test diff2.dat
Exporting image: 100% complete...done.

合并两次差异

1
2
[root@clienta ~]# rbd merge-diff diff.dat diff2.dat mergeresult.dat
Merging image diff: 100% complete...done.