I am a grad. student in Tel-Aviv university, and my theses is focused on asynchronous mirroring.
I have already built asynchronous mirror software (which is composed of a driver and a daemon), which works by setting up a virtual block device over an existing one, and thus mirroring the existing one (asynchronously) to the network using a window.
What I would like to add to it is the ability to asynchronously mirror a (QEMU) VM as well, so that if the primary site crashes, the VM can be restored (to the last stable point) immediately.
Since I want it to be as general as possible, I will not rely on my mirror, but only on there being a virtual block device that is mirroring me (and that has consistent writes (that is, if write A succeeded, and afterwards write B succeeded, then if B is on the secondary site, then A must be there too)), and that there is some kind of marking mechanism (so that I can mark the last consistent state).
The reason I want to do this using QEMU is that it has live migration - which is almost what I need.
Right now my plan is to treat the memory as a file, and put it and all the vm images on the same mirroring block device.
Then, every minute or so, I will (stop the vm) sync the memory and disks, and put a mark (where during the minute I will continue to write what I can).
This sounds to me like doing a continuous "live migration", but never actually moving the machine, and after finishing the migration on the side that initiated it, not throwing away the dirty/clean pages (so that the memory does not have to be moved completely again).
I would appreciate any direction and/or suggestions in this matter.
Also, I wondered where can I find some documentation about the whole migration process - should I just read the code, or is there any document about it?