转载:原文链接
概要:
本节我们讨论openstack cinder volume rbd驱动的 backup/restore操作。
Backup 是将 volume 备份到别的地方(备份设备),将来可以通过 restore 操作恢复。
Backup VS Snapshot
Backup 与 snapshot 都可以保存 volume 的当前状态,以备以后恢复。但二者在用途和实现上还是有区别的,具体表现在:
- Snapshot 依赖于源 volume,不能独立存在;而 backup 不依赖源 volume,即便源 volume 不存在了,也可以 restore。
- Snapshot 与源 volume 通常存放在一起,都由同一个 volume provider 管理;而 backup
存放在独立的备份设备中,有自己的备份方案和实现,与 volume provider 没有关系。
上面两点决定了 backup 具有容灾功能;而 snapshot 则提供 volume provider 内便捷的回溯功能。
一 RBD增量备份以及恢复原理
1 创建云盘test_volume1, size=1G
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd create volumes/test_volume1 --size 1G
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd ls -l volumes
NAME SIZE PARENT FMT PROT LOCK
test_volume1 1GiB 2
2 创建test_volume1快照t1和t2
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd snap create volumes/test_volume1@test.snap.t1
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd ls -l volumes
NAME SIZE PARENT FMT PROT LOCK
test_volume1 1GiB 2
test_volume1@test.snap.t1 1GiB 2
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd snap create volumes/test_volume1@test.snap.t2
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd ls -l volumes
NAME SIZE PARENT FMT PROT LOCK
test_volume1 1GiB 2
test_volume1@test.snap.t1 1GiB 2
test_volume1@test.snap.t2 1GiB 2
()[root@busybox-openstack-5c687fdc9-mpwjd /]#
3 创建增量diff
# diff from initial to t1
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd export-diff volumes/test_volume1@test.snap.t1 diff_t1_between_initial
Exporting image: 100% complete...done.
# diff from initial to t2
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd export-diff volumes/test_volume1@test.snap.t2 diff_t2_between_initial
Exporting image: 100% complete...done.
# diff from t1 to t2
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd export-diff --from-snap test.snap.t1 volumes/test_volume1@test.snap.t2 diff_t1_between_t2
Exporting image: 100% complete...done.
()[root@busybox-openstack-5c687fdc9-mpwjd /]# ls -l |grep diff
-rw-r--r-- 1 root root 39 Sep 4 10:52 diff_t1_between_initial
-rw-r--r-- 1 root root 56 Sep 4 10:52 diff_t1_between_t2
-rw-r--r-- 1 root root 39 Sep 4 10:52 diff_t2_between_initial
4 通过增量diff创建备份
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd create backups/backup_image --size 1G
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd ls -l backups
NAME SIZE PARENT FMT PROT LOCK
backup_image 1GiB 2
# import diff from initial to t1
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd import-diff diff_t1_between_initial backups/backup_image
Importing image diff: 100% complete...done.
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd ls -l backups
NAME SIZE PARENT FMT PROT LOCK
backup_image 1GiB 2
backup_image@test.snap.t1 1GiB 2
# import diff from t1 to t2
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd import-diff diff_t1_between_t2 backups/backup_image
Importing image diff: 100% complete...done.
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd ls -l backups
NAME SIZE PARENT FMT PROT LOCK
backup_image 1GiB 2
backup_image@test.snap.t1 1GiB 2
backup_image@test.snap.t2 1GiB 2
二 ceph备份时实现:
1. 创建云盘volume-id,大小为1G
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd create volumes/volume-id --size 1G
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd ls -l volumes |grep volume-id
volume-id 1GiB 2
2. 先尝试进行diff store, 创建backups中的base盘
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd create backups/volume-volume-id.backup.base --size 1G
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd ls -l backups
NAME SIZE PARENT FMT PROT LOCK
volume-volume-id.backup.base 1GiB 2
3. 创建volume-id快照1,命名规则如下
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd snap create volumes/volume-id@backup.backup-id.snap.time1
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd ls -l volumes |grep volume-id
volume-id 1GiB 2
volume-id@backup.backup-id.snap.time1 1GiB 2
4. 导出云盘和快照1的差异1
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd export-diff volumes/volume-id@backup.backup-id.snap.time1 test_diff_snap_time1
Exporting image: 100% complete...done.
()[root@busybox-openstack-f7bcf88-hgdkz /]# ls
test_diff_snap_time1
5. 将差异1导入到backups的base盘中,此时base盘生成了一个快照
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd import-diff test_diff_snap_time1 backups/volume-volume-id.backup.base
Importing image diff: 100% complete...done.
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd ls -l backups
NAME SIZE PARENT FMT PROT LOCK
volume-volume-id.backup.base 1GiB 2
volume-volume-id.backup.base@backup.backup-id.snap.time1 1GiB 2
6. 第二次做增量备份时, 创建volume-id新的快照2
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd snap create volumes/volume-id@backup.backup-id2.snap.time2
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd ls -l backups
NAME SIZE PARENT FMT PROT LOCK
volume-volume-id.backup.base 1GiB 2
volume-volume-id.backup.base@backup.backup-id.snap.time1 1GiB 2
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd ls -l volumes |grep volume-id
volume-id 1GiB 2
volume-id@backup.backup-id.snap.time1 1GiB 2
volume-id@backup.backup-id2.snap.time2 1GiB 2
7. 导出快照1和快照2的差异2
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd export-diff --snap backup.backup-id.snap.time1 volumes/volume-id@backup.backup-id2.snap.time2 test_diff_snap_time1_time2
Exporting image: 100% complete...done.
8. 将差异2导入backups的base盘,此时base盘又生成了一个新的快照
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd import-diff test_diff_snap_time1_time2 backups/volume-volume-id.backup.base
Importing image diff: 100% complete...done.
()[root@busybox-openstack-f7bcf88-hgdkz /]# rbd ls -l backups
NAME SIZE PARENT FMT PROT LOCK
volume-volume-id.backup.base 1GiB 2
volume-volume-id.backup.base@backup.backup-id.snap.time1 1GiB 2
volume-volume-id.backup.base@backup.backup-id2.snap.time2 1GiB 2
9. 删除volume-id的快照1
10. 如果diff store出现异常, 会通过full store来备份, 通过将云盘按照chunk=128M分片拷贝数据到新的云盘。
11. 备份元数据
三 RBD恢复备份的实现:
1 先检查是否满足diff restore, 需要满足下面条件
check can diff restore:
1 base exist: backups/volume-volume-id.backup.base
2 restore point snapshot exist: backups/volume-volume-id.backup.base@backup.backup-id.snap.time1
3 volume file is rbd
4 backup[volume_id] != new volume_id
5 rbd volume has no extents (extend)
2. 如果满足diff restore条件, 先导出对应backup-id的差异
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd export-diff backups/volume-volume-id.backup.base@backup.backup-id1.snap.time1 test_diff_backup_id2
Exporting image: 100% complete...done.
3. 将对应backup-id的差异导入new-volume-id
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd import-diff test_diff_backup_id2 volumes/new-volume-id
Importing image diff: 100% complete...done.
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd ls -l volumes
NAME SIZE PARENT FMT PROT LOCK
new-volume-id 1GiB 2
new-volume-id@backup.backup-id1.snap.time1 1GiB 2
volume-id 1GiB 2
volume-id@backup.backup-id1.snap.time1 1GiB 2
4. 如果new volume的大小与备份的大小不一致,导入差异后需要resize。
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd create volumes/new-volume-id2 --size 2G
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd import-diff test_diff_backup_id2 volumes/new-volume-id2
Importing image diff: 100% complete...done.
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd ls -l volumes
NAME SIZE PARENT FMT PROT LOCK
new-volume-id 1GiB 2
new-volume-id@backup.backup-id1.snap.time1 1GiB 2
new-volume-id2 1GiB 2
new-volume-id2@backup.backup-id1.snap.time1 1GiB 2
volume-id 1GiB 2
volume-id@backup.backup-id1.snap.time1 1GiB 2
()[root@busybox-openstack-5c687fdc9-mpwjd /]#
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd resize volumes/new-volume-id2 --size 2G
Resizing image: 100% complete...done.
()[root@busybox-openstack-5c687fdc9-mpwjd /]# rbd ls -l volumes
NAME SIZE PARENT FMT PROT LOCK
new-volume-id 1GiB 2
new-volume-id@backup.backup-id1.snap.time1 1GiB 2
new-volume-id2 2GiB 2
new-volume-id2@backup.backup-id1.snap.time1 1GiB 2
volume-id 1GiB 2
volume-id@backup.backup-id1.snap.time1 1GiB 2
5. 如果不满足diff restore条件,或者在diff restore过程中出现异常,进行full restore, 通过将云盘按照chunk=128M分片拷贝数据到新的云盘。
6. 恢复元数据