[libvirt-users] optimized backup using snapshot with iterative approach

Nicolas Sebrecht nsebrecht at piing.fr
Mon Mar 18 11:38:53 UTC 2013


The 15/03/13, Eric Blake wrote:
> On 03/15/2013 06:17 AM, Nicolas Sebrecht wrote:

<...>

> > Here is where we are in the workflow (step C) for what we are talking about:
> > 
> > Step 1: create external snapshot for all VM disks (includes VM state).
> > Step 2: do the backups manually while the VM is still running (original disks and memory state).
> 
> During this step, the qcow2 files created in step 1 are getting larger
> proportional to the amount of changes done in the guest; obviously, the
> faster you can complete it, the smaller the deltas will be, and the
> faster your later merge steps will be.  Since later merge steps have to
> be done while the guest is halted, it's good to keep small size in mind.
>  More on this thought below...
> 
> > Step 3: save and halt the vm state once backups are finished.

Step3: virsh save && virsh destroy.

> > Step 4: merge the snapshots (qcow2 disk wrappers) back to their backing file.
> 
> This step is done with raw qemu-img commands at the moment, and takes
> time proportional to the size of the qcow2 data.
> 
> > Step 5: start the VM.

Step 5: virsh restore.

> ...As mentioned above, the time taken in step 2 can affect how big the
> delta is, and therefore how long step 4 lasts (while the guest is
> offline).  If your original disk is huge, and copying it to your backup
> takes a long amount of time, it may pay to do an iterative approach:
> 
> start with raw image:
>   raw.img
> 
> create the external snapshot at the point you care about
>   raw.img <- snap1.qcow2
> 
> transfer raw.img and vmstate file to backup storage, taking as long as
> needed (gigabytes of data, so on the order of minutes, during which the
> qcow2 files can build up to megabytes in size)
>   raw.img <- snap1.qcow2
> 
> create another external snapshot, but this time with --disk-only
> --no-metadata (we don't plan on reverting to this point in time)
>   raw.img <- snap1.qcow2 <- snap2.qcow2
> 
> use 'virsh blockcommit dom vda --base /path/to/raw --top /path/to/snap1
> --wait --verbose'; this takes time for megabytes of storage, but not
> gigabytes, so it is faster than the time to copy raw.img, which means
> snap2.qcow2 will hold less delta data than snap1.qcow2
>   raw.img <- snap2.qcow2
> 
> now stop the guest, commit snap2.qcow2 into raw.img, and restart the guest
> 
> By doing an iteration, you've reduced the size of the file that has to
> be committed while the guest is offline; and may be able to achieve a
> noticeable reduction in guest downtime.

Looks like a very good optimization for recent enough libvirt. Thanks!

-- 
Nicolas Sebrecht




More information about the libvirt-users mailing list