QEMU/KVM磁盘在线备份(3)

▷ 对于节点是唯一的,但附加到不同节点的bitmap可以共享相同的名称。对于同一节点,持久bitmap和非持久bitmap的名称也不能冲突)
▷ 为qemu内部使用而创建的bitmap可能是匿名的,没有名称。但用户创建的bitmap肯定不是匿名的。每个节点可以有任意数量的bitmap
▷ 用户创建的bitmap名称不能是空(即"")

基于bitmap做增量备份的工作原理

▷ 首先,在虚拟机启动状态下,针对虚拟机某个磁盘(称为node),打上bitmap,此时bitmap存在qemu内存中,并且bitmap的count属性为0
▷ 其次,当磁盘数据有变化的时���,bitmap会将变化记录下来,可以看到count不断递增(不会超过磁盘virtual size)
▷ 最后,指定bitmap做备份时候,qemu会根据bitmap记录,导出对应的增量数据到本地或远程

8. 创建与查询bitmap # 创建非持久bitmap(qemu >= 2.4) virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "block-dirty-bitmap-add", "arguments": {"node": "drive-virtio-disk0","name": "bitmap0"}}' # 创建持久bitmap(qemu >= 2.10) virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "block-dirty-bitmap-add", "arguments": {"node": "drive-virtio-disk0","name": "bitmap1", "persistent": true}}' # 查询虚拟机的所有磁盘的bitmap virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block" }' # 查询虚拟机第一块磁盘的bitmap virsh qemu-monitor-command DOMAIN--pretty '{ "execute": "query-block" }' | jq .return[0] | sed -n '/dirty\-bitmaps/,/]/p' # 查询虚拟机第二块磁盘的bitmap virsh qemu-monitor-command DOMAIN--pretty '{ "execute": "query-block" }' | jq .return[1] | sed -n '/dirty\-bitmaps/,/]/p' 9. 基于bitmap做增量备份 # 备份 virsh qemu-monitor-command DOMAIN --pretty '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "/opt/backup/inc.0.qcow2" } }' # 在备份过程中,可以查看任务 virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block-jobs" }' 10. 删除bitmap virsh qemu-monitor-command DOMAIN --pretty '{ "execute" : "block-dirty-bitmap-remove", "arguments" : { "node" : "drive-virtio-disk0", "name" : "bitmap0" } }' 11. 重置bitmap

重置bitmap就是将bitmap的count值置为0,重新跟踪磁盘变化

virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "block-dirty-bitmap-clear", "arguments": {"node": "drive-virtio-disk0","name": "bitmap0"}}' 12. 备份逻辑

到这里,已经知道如何做完整备份和增量备份了,但如何把二者结合起来呢?

“等下,结合什么,先做完整备份,然后创建bitmap,过段时间后做增量备份,不行吗”

“真要这么简单就好了,但你漏了一个关键点,在开机状态下,磁盘的数据可能实时变化,当你还在做完整备份的过程中,磁盘数据可能已经变化了,然后你再创建bitmap,已经太迟了”

“那我就先创建bitmap,然后再做完整备份,这样就不会缺少数据了吧”

“看起来可以,但从理论上来说,也是不行的,你看,分别执行2条QMP命令,先执行bitmap的创建,再执行完整备份,虽然创建bitmap是毫秒级完成的,但若磁盘IO变化很快,毫厘之间,也有可能产生数据的变化”

“那怎么办”

“接着往下看就知道了”

虚拟机启动前就确定要备份

若虚拟机第一次启动之前,就确定要备份磁盘,那么可以paused状态启动虚拟机,这样可以保证磁盘IO不会变化,就没有上面的那么多担心了,具体操作如下:

1️⃣ 以paused状态启动虚拟机(virsh start DOMAIN --paused)
2️⃣ 对磁盘进行完整备份("sync":"top")
3️⃣ 对磁盘创建bitmap(block-dirty-bitmap-add)
4️⃣ 恢复虚拟机状态(virsh resume DOMAIN)
5️⃣ 接下来可以做incremental备份("sync":"incremental")

范例如下

virsh start DOMAIN --paused virsh qemu-monitor-command DOMAIN '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "top" , "target" : "/opt/backup/top.img" } }' virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "block-dirty-bitmap-add", "arguments": {"node": "drive-virtio-disk0","name": "bitmap0"}}' virsh resume DOMAIN # ...运行一段时间... virsh qemu-monitor-command DOMAIN --pretty '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "/opt/backup/inc.0.qcow2" } }' # ...又运行一段时间... virsh qemu-monitor-command DOMAIN --pretty '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "/opt/backup/inc.1.qcow2" } }'

虚拟机运行过程中确定要备份

如果是虚拟机已经运行一段时间了,才决定做备份,就需要用到QMP的“事务”

1️⃣ 以事务方式对磁盘创建bitmap(block-dirty-bitmap-add)及对磁盘做完整备份("sync":"top")
2️⃣ 接下来可以做incremental备份("sync":"incremental")

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/11667.html