COLO - Coarse Grain Lock Stepping: Difference between revisions
(43 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
COLO or Coarse Grain Lock Stepping is an High Availability solution that builds on top of [[Remus]]. Remus was prepared for use with COLO in [[:Category:Xen 4.5|Xen 4.5]]. The COLO Manager component is part of [[:Category:Xen 4.7|Xen 4.7]], while other components will eventually be part of QEMU. |
|||
{{TODOLeft|This page needs to be updated for Xen 4.7. Relevant man pages which have changed since 4.6 |
|||
* Are there any restrictions / portions which have not yet been upstreamed? |
|||
* Should this page just link to man pages and just introduce the high level concepts? |
|||
* Relevant man pages |
|||
** [http://xenbits.xen.org/docs/unstable/man/xl.1.html#DOMAIN-SUBCOMMANDS xl(1) search for Remus] |
|||
** [http://xenbits.xen.org/docs/unstable/man/xl.conf.5.html xl.conf(5) search for colo.default.proxyscript] |
|||
}} |
|||
COLO or Coarse Grain Lock Stepping is an High Availability solution that builds on top of [[Remus]]. It is one of the features that has been updated in [[:Category:Xen 4.5|4.5]], but has not been integrated into the Xen Hypervisor code base (in other words, the code is out-of-tree). However, COLO works with [[Remus]] for [[XL]] as developed in [[:Category:Xen 4.5|Xen 4.5]] or newer. |
|||
= Background = |
= Background = |
||
Line 18: | Line 10: | ||
: Modifications of save/restore flow to realize continuous migration, to make sure the state of VM in Secondary side |
: Modifications of save/restore flow to realize continuous migration, to make sure the state of VM in Secondary side |
||
: always be consistent with VM in Primary side. |
: always be consistent with VM in Primary side. |
||
* COLO Block Replication (Please refer to [http://wiki.qemu.org/Features/BlockReplication BlockReplication]) |
* COLO Block Replication: (Please refer to [http://wiki.qemu.org/Features/BlockReplication BlockReplication]) |
||
: When primary VM writes data into image, the colo disk manger captures this data<br> |
: When primary VM writes data into image, the colo disk manger captures this data<br> |
||
: and send it to secondary VM’s which makes sure the context of secondary VM's image is consentient with<br> |
: and send it to secondary VM’s which makes sure the context of secondary VM's image is consentient with<br> |
||
Line 24: | Line 16: | ||
* COLO Proxy: |
* COLO Proxy: |
||
: We need an module to compare the packets returned by Primary VM and Secondary VM<br> |
: We need an module to compare the packets returned by Primary VM and Secondary VM<br> |
||
: and decide whether to start a checkpoint according to some rules. |
: and decide whether to start a checkpoint according to some rules. <br> |
||
: In previous version. COLO Proxy is a linux kernel module for host. Because of this module <br> |
|||
: for host. |
|||
: can't accepted by kernel community,you have to apply some patches to linux kernel and compile it yourself. <br> |
|||
: No support has been provided to kernelspace COLO Proxy.<br> |
|||
: In current version.COLO Proxy is a part of Qemu, all codes running in userspace. The filter-redirector, filter-mirror,<br> |
|||
: colo-compare and filter-rewriter compose the COLO-proxy. We can get better performance with COLO-proxy's help.<br> |
|||
: Compare with previous kernelspace COLO-Proxy, no more additional job to do, you just need ensure your qemu version support COLO Proxy. <br> |
|||
= Current Status = |
= Current Status = |
||
Line 31: | Line 28: | ||
The overall status of COLO: |
The overall status of COLO: |
||
* COLO Manager (Merged since 4.7.0-rc1): |
* COLO Manager (Merged since 4.7.0-rc1): |
||
* COLO Block replication ( |
* COLO Block replication (Merged by Qemu) |
||
* COLO Proxy ( |
* COLO Proxy (Userspace COLO Proxy has been merged by Qemu) |
||
: The legacy kernelspace COLO Proxy [https://github.com/zhangckid/colo-proxy View on Github ] |
|||
'''Note''': We are missing COLO Block/Proxy now, and these two parts are implemented base on Qemu. |
|||
= Requirements = |
= Requirements = |
||
Line 42: | Line 39: | ||
to secondary vm. The directly connected nic must not be used by any other |
to secondary vm. The directly connected nic must not be used by any other |
||
purpose. If your guest has more than one nic, you should have directly |
purpose. If your guest has more than one nic, you should have directly |
||
connected nic for each guest nic. If you don't have |
connected nic for each guest nic. If you don't have enough directly connected |
||
nic, you can use vlan. |
nic, you can use vlan. |
||
Line 48: | Line 45: | ||
# Kernel with dom0 support |
# Kernel with dom0 support |
||
# If your host os has OEM-released xen tools, please uninstall it |
# If your host os has OEM-released xen tools, please uninstall it |
||
# Use latest Qemu version call for Xen |
|||
# kernel module |
|||
:: (Because have some COLO module communication related patches haven't be merged, you can use internal version: [https://github.com/zhangckid/qemu/tree/qemu-colo-for-xen View on Github] ) |
|||
:: nf_conntrack |
|||
:: nf_conntrack_ipv4 |
|||
:: nf_nat |
|||
:: libnl-tools >= 3.0. |
|||
== Guest requirements == |
== Guest requirements == |
||
Line 80: | Line 74: | ||
e.g. |
e.g. |
||
master: |
master: |
||
br0: 192.168. |
br0: 192.168.2.98 |
||
eth1: 192.168.1.33 |
eth1: 192.168.1.33 |
||
eth2: 192.168. |
eth2: 192.168.3.1 |
||
slave: |
slave: |
||
br0: 192.168. |
br0: 192.168.2.99 |
||
br1: no ip address |
br1: no ip address |
||
eth1: 192.168.1.88 |
eth1: 192.168.1.88 |
||
eth2: 192.168. |
eth2: 192.168.3.2 |
||
</pre> |
</pre> |
||
<pre> |
<pre> |
||
Line 116: | Line 110: | ||
<pre> |
<pre> |
||
# cd ~ |
# cd ~ |
||
# git clone https://github.com/ |
# git clone https://github.com/xen-project/xen.git |
||
# git clone https://github.com/ |
# git clone https://github.com/zhangckid/qemu.git |
||
# git clone https://github.com/Pating/iptables |
|||
# git clone https://github.com/Pating/colo-proxy |
|||
# git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git |
|||
</pre> |
|||
* Prepare host kernel |
|||
:colo-proxy kernel module need cooperate with linux kernel. |
|||
<pre> |
|||
# cd ~/colo-proxy/ |
|||
# git checkout 405527cb |
|||
# cd ~/linux/ |
|||
# git checkout v4.0 |
|||
# patch -p1 < ~/colo-proxy/colo-patch-for-kernel.patch |
|||
</pre> |
|||
:Then compile kernel with Dom0 requirements configs and intall the new kernel, finally reboot. |
|||
* Proxy module |
|||
:proxy module is used for network packets compare. |
|||
<pre> |
|||
# cd ~/colo-proxy/ |
|||
# make |
|||
# make install |
|||
</pre> |
|||
* Modified iptables |
|||
:We have added a new rule to iptables command. |
|||
<pre> |
|||
# cd ~/iptables |
|||
# ./autogen.sh && ./configure |
|||
# make && make install |
|||
</pre> |
</pre> |
||
* Build and install xen |
* Build and install xen |
||
<pre> |
<pre> |
||
# cd ~/xen |
# cd ~/xen |
||
# git checkout -b changlox/colo_v14_full |
|||
# ./autogen.sh; ./configure --enable-debug |
# ./autogen.sh; ./configure --enable-debug |
||
# make dist-xen; make install-xen |
# make dist-xen; make install-xen |
||
Line 162: | Line 125: | ||
<pre> |
<pre> |
||
# cd ~/qemu |
# cd ~/qemu |
||
# git checkout - |
# git checkout qemu-colo-for-xen |
||
# cd ~/xen/tools/qemu-xen-dir |
# cd ~/xen/tools/qemu-xen-dir |
||
# ./configure --enable-xen --target-list=x86_64-softmmu \ |
# ./configure --enable-xen --target-list=x86_64-softmmu \ |
||
Line 177: | Line 140: | ||
:Add "xen_platform_pci=0" and below disk/net config into the guest configfile. |
:Add "xen_platform_pci=0" and below disk/net config into the guest configfile. |
||
<pre> |
<pre> |
||
disk = [ 'format=raw,devtype=disk,access=w,backendtype=qdisk,vdev=hda,colo,colo-host=192.168.3.2,colo-port= |
disk = [ 'format=raw,devtype=disk,access=w,backendtype=qdisk,vdev=hda,colo,colo-host=192.168.3.2,colo-port=9001,colo-export=qdisk1,active-disk=/mnt/ramfs/active_disk.img,hidden-disk=/mnt/ramfs/hidden_disk.img,target=/home/zhangchen/suse-64hvm-zc.img'] |
||
vif = [ 'mac=00:16:4f:00:00:11, bridge=br0, model= |
vif = [ 'mac=00:16:4f:00:00:11, bridge=br0, model=rtl8139, colo_sock_sec_redirector0_id=red0,colo_sock_sec_redirector0_ip=192.168.2.98,colo_sock_sec_redirector0_port=9003, |
||
colo_sock_sec_redirector1_id=red1,colo_sock_sec_redirector1_ip=192.168.2.98,colo_sock_sec_redirector1_port=9004, |
|||
colo_filter_sec_redirector0_queue=tx,colo_filter_sec_redirector0_indev=red0,colo_filter_sec_redirector1_queue=rx, |
|||
colo_filter_sec_redirector1_outdev=red1,colo_filter_sec_rewriter0_queue=all,colo_sock_mirror_id=mirror0,colo_sock_mirror_ip=192.168.2.98, |
|||
colo_sock_mirror_port=9003,colo_sock_compare_pri_in_id=compare0,colo_sock_compare_pri_in_ip=192.168.2.98,colo_sock_compare_pri_in_port=9021, |
|||
colo_sock_compare_sec_in_id=compare1,colo_sock_compare_sec_in_ip=192.168.2.98,colo_sock_compare_sec_in_port=9004,colo_sock_compare_notify_id=not1, |
|||
colo_sock_compare_notify_ip=192.168.2.98,colo_sock_compare_notify_port=9998,colo_sock_redirector0_id=compare_out, |
|||
colo_sock_redirector0_ip=192.168.2.98,colo_sock_redirector0_port=9005,colo_sock_redirector1_id=compare0-0,colo_sock_redirector1_ip=192.168.2.98, |
|||
colo_sock_redirector1_port=9021,colo_sock_redirector2_id=compare_out0,colo_sock_redirector2_ip=192.168.2.98,colo_sock_redirector2_port=9005, |
|||
colo_filter_mirror_queue=tx,colo_filter_mirror_outdev=mirror0,colo_filter_redirector0_queue=rx,colo_filter_redirector0_indev=compare_out, |
|||
colo_filter_redirector1_queue=rx,colo_filter_redirector1_outdev=compare0,colo_compare_pri_in=compare0-0,colo_compare_sec_in=compare1, |
|||
colo_compare_out=compare_out0,colo_compare_notify_dev=not1,colo_checkpoint_host=192.168.2.98,colo_checkpoint_port=9998' ] |
|||
</pre> |
</pre> |
||
* Copy physical machine disk image from Primary to Secondary,and make sure their absolute path are the same |
* Copy physical machine disk image from Primary to Secondary,and make sure their absolute path are the same |
||
''' |
'''Note''': colo-port is the secondary host's IP, colo-port is the secondary host's NBD server port, forwarddev is the directly connected nic. |
||
= Run COLO = |
= Run COLO = |
||
Line 187: | Line 161: | ||
On both Primary/Secondary hosts: |
On both Primary/Secondary hosts: |
||
<pre> |
<pre> |
||
# service xencommons start |
|||
# modprobe nf_conntrack_colo |
|||
</pre> |
</pre> |
||
Line 197: | Line 171: | ||
active_disk=/mnt/ramfs/active_disk.img |
active_disk=/mnt/ramfs/active_disk.img |
||
hidden_disk=/mnt/ramfs/hidden_disk.img |
hidden_disk=/mnt/ramfs/hidden_disk.img |
||
local_img=~/suse-64hvm.img |
|||
tmp_disk_size=`./qemu-colo/qemu-img info $local_img |grep 'virtual size' |awk '{print $3}' |
|||
function create_image() |
function create_image() |
||
{ |
{ |
||
~/qemu/qemu-img create -f qcow2 $1 $tmp_disk_size |
|||
} |
} |
||
Line 211: | Line 187: | ||
if [[ ! -e $active_disk ]]; then |
if [[ ! -e $active_disk ]]; then |
||
create_image $active_disk |
create_image $active_disk |
||
fi |
fi |
||
Line 221: | Line 197: | ||
prepare_temp_images |
prepare_temp_images |
||
</pre> |
</pre> |
||
Note: It is recommended to put active disk and hidden disk in ramdisk. |
'''Note''': It is recommended to put active disk and hidden disk in ramdisk. |
||
On Primary host: |
On Primary host: |
||
<pre> |
<pre> |
||
# xl create -p <domconfig> |
# xl create -p <domconfig> |
||
# xl pause <domconfig> |
|||
# xl remus -c -u <dom> 192.168.2.88 |
|||
# xl remus -c -p -u <domconfig> 192.168.3.2 |
|||
</pre> |
</pre> |
||
= Known problems = |
= Known problems = |
||
* Secondary vm may crash due to triple fault. |
|||
'''Note''': this problem doesn't happen every time. So you can run colo again to avoid this problem. |
|||
<pre>NOTE: Problem 1 doesn't happen every time. So you can run colo again to |
|||
avoid this problem.</pre> |
|||
= Trouble shooting = |
= Trouble shooting = |
||
If there's some error happend when staritng COLO, you can do: |
* If there's some error happend when staritng COLO, you can do: |
||
# Make sure you have all necessary modules that DOM0 needed on both side. |
# Make sure you have all necessary modules that DOM0 needed on both side. |
||
# Make sure you have followed all the instructions in this README. |
# Make sure you have followed all the instructions in this README. |
||
# Try to reboot both primary and secondary host. |
# Try to reboot both primary and secondary host. |
||
# If you still have problems, collect the error logs and contact |
# If you still have problems, collect the error logs and contact Zhang Chen(zhangckid@gmail.com), Xie Changlong(xiecl.fnst@cn.fujitsu.com), |
||
# Wen Congyang(wency@cn.fujitsu.com), Yang Hongyang(imhy.yang@gmail.com) for help. |
|||
= Example = |
= Example = |
||
Line 251: | Line 227: | ||
<pre> |
<pre> |
||
builder='hvm' |
builder='hvm' |
||
memory='2048' |
|||
memory = 512 |
|||
vcpus=2 |
vcpus=2 |
||
cpus=[ |
cpus=['2','3'] |
||
name |
name='hvm_nopv_colo' |
||
device_model_version='qemu-xen' |
|||
device_model_override='/home/zhangckid/qemu/x86_64-softmmu/qemu-system-x86_64' |
|||
disk = [ 'format=raw,devtype=disk,access=w |
disk = [ 'format=raw,devtype=disk,access=w,backendtype=qdisk,vdev=hda,colo,colo-host=192.168.3.2,colo-port=9001,colo-export=qdisk1,active-disk=/mnt/ramfs/active_disk.img,hidden-disk=/mnt/ramfs/hidden_disk.img,target=/home/zhangchen/suse-64hvm-zc.img'] |
||
vif = [ 'mac=00:16:4f:00:00:11, bridge=br0, model=rtl8139, colo_sock_sec_redirector0_id=red0,colo_sock_sec_redirector0_ip=192.168.2.98,colo_sock_sec_redirector0_port=9003, |
|||
colo_sock_sec_redirector1_id=red1,colo_sock_sec_redirector1_ip=192.168.2.98,colo_sock_sec_redirector1_port=9004, |
|||
colo_filter_sec_redirector0_queue=tx,colo_filter_sec_redirector0_indev=red0,colo_filter_sec_redirector1_queue=rx, |
|||
vif = [ 'mac=00:16:4f:00:00:11, bridge=xenbr0, model=virtio-net, forwarddev=eth1' ] |
|||
colo_filter_sec_redirector1_outdev=red1,colo_filter_sec_rewriter0_queue=all,colo_sock_mirror_id=mirror0,colo_sock_mirror_ip=192.168.2.98, |
|||
colo_sock_mirror_port=9003,colo_sock_compare_pri_in_id=compare0,colo_sock_compare_pri_in_ip=192.168.2.98,colo_sock_compare_pri_in_port=9021, |
|||
colo_sock_compare_sec_in_id=compare1,colo_sock_compare_sec_in_ip=192.168.2.98,colo_sock_compare_sec_in_port=9004,colo_sock_compare_notify_id=not1, |
|||
colo_sock_compare_notify_ip=192.168.2.98,colo_sock_compare_notify_port=9998,colo_sock_redirector0_id=compare_out, |
|||
colo_sock_redirector0_ip=192.168.2.98,colo_sock_redirector0_port=9005,colo_sock_redirector1_id=compare0-0,colo_sock_redirector1_ip=192.168.2.98, |
|||
colo_sock_redirector1_port=9021,colo_sock_redirector2_id=compare_out0,colo_sock_redirector2_ip=192.168.2.98,colo_sock_redirector2_port=9005, |
|||
colo_filter_mirror_queue=tx,colo_filter_mirror_outdev=mirror0,colo_filter_redirector0_queue=rx,colo_filter_redirector0_indev=compare_out, |
|||
colo_filter_redirector1_queue=rx,colo_filter_redirector1_outdev=compare0,colo_compare_pri_in=compare0-0,colo_compare_sec_in=compare1, |
|||
colo_compare_out=compare_out0,colo_compare_notify_dev=not1,colo_checkpoint_host=192.168.2.98,colo_checkpoint_port=9998' ] |
|||
#----------------------------------------------------------------------------- |
#----------------------------------------------------------------------------- |
||
# boot on floppy (a), hard disk (c), Network (n) or CD-ROM (d) |
# boot on floppy (a), hard disk (c), Network (n) or CD-ROM (d) |
||
# default: hard disk, cd-rom, floppy |
# default: hard disk, cd-rom, floppy |
||
boot="c" |
|||
boot='c' |
|||
sdl=0 |
sdl=0 |
||
vnc=1 |
vnc=1 |
||
vnclisten='' |
|||
vnclisten='0.0.0.0' |
|||
vncunused = 1 |
|||
stdvga = 0 |
stdvga = 0 |
||
serial='pty' |
serial='pty' |
||
apic=1 |
apic=1 |
||
apci=1 |
apci=1 |
||
pae=1 |
pae=1 |
||
extid=0 |
extid=0 |
||
keymap= |
keymap='en-us' |
||
localtime=1 |
localtime=1 |
||
hpet=1 |
hpet=1 |
||
usbdevice='tablet' |
usbdevice='tablet' |
||
xen_platform_pci = 0 |
|||
xen_platform_pci=0 |
|||
</pre> |
</pre> |
||
= Man Pages = |
|||
* [http://xenbits.xen.org/docs/unstable/man/xl.1.html#DOMAIN-SUBCOMMANDS xl(1) search for Remus] |
|||
* [http://xenbits.xen.org/docs/unstable/man/xl.conf.5.html xl.conf(5) search for colo.default.proxyscript] |
|||
= Links = |
= Links = |
||
Line 306: | Line 286: | ||
[[Category:Glossary]] |
[[Category:Glossary]] |
||
[[Category:Xen 4.5]] |
[[Category:Xen 4.5]] |
||
[[Category:Xen 4.7]] |
Latest revision as of 17:17, 11 October 2017
COLO or Coarse Grain Lock Stepping is an High Availability solution that builds on top of Remus. Remus was prepared for use with COLO in Xen 4.5. The COLO Manager component is part of Xen 4.7, while other components will eventually be part of QEMU.
Background
COLO FT/HA (COarse-grain LOck-stepping Virtual Machines for Non-stop Service) project is a high availability solution. Both primary VM (PVM) and secondary VM (SVM) run in parallel. They receive the same request from client, and generate response in parallel too. If the response packets from PVM and SVM are identical, they are released immediately. Otherwise, a VM checkpoint (on demand) is conducted. The idea is presented in Xen summit 2012, and 2013, and academia paper in SOCC 2013.
Components
- COLO Manager:
- COLO Checkpoint/Failover Controller
- Modifications of save/restore flow to realize continuous migration, to make sure the state of VM in Secondary side
- always be consistent with VM in Primary side.
- COLO Block Replication: (Please refer to BlockReplication)
- When primary VM writes data into image, the colo disk manger captures this data
- and send it to secondary VM’s which makes sure the context of secondary VM's image is consentient with
- the ontext of primary VM 's image.
- COLO Proxy:
- We need an module to compare the packets returned by Primary VM and Secondary VM
- and decide whether to start a checkpoint according to some rules.
- In previous version. COLO Proxy is a linux kernel module for host. Because of this module
- can't accepted by kernel community,you have to apply some patches to linux kernel and compile it yourself.
- No support has been provided to kernelspace COLO Proxy.
- In current version.COLO Proxy is a part of Qemu, all codes running in userspace. The filter-redirector, filter-mirror,
- colo-compare and filter-rewriter compose the COLO-proxy. We can get better performance with COLO-proxy's help.
- Compare with previous kernelspace COLO-Proxy, no more additional job to do, you just need ensure your qemu version support COLO Proxy.
Current Status
COLO (based on xm) has already been in development for over three years. A paper has come out at 2013. Since XEN has deprecated xm and turn to xl, we are implementing COLO on xl now. The overall status of COLO:
- COLO Manager (Merged since 4.7.0-rc1):
- COLO Block replication (Merged by Qemu)
- COLO Proxy (Userspace COLO Proxy has been merged by Qemu)
- The legacy kernelspace COLO Proxy View on Github
Requirements
Hardware requriements
There is at least one directly connected nic to forward the network requests from client to secondary vm. The directly connected nic must not be used by any other purpose. If your guest has more than one nic, you should have directly connected nic for each guest nic. If you don't have enough directly connected nic, you can use vlan.
Dom0 requirements
- Kernel with dom0 support
- If your host os has OEM-released xen tools, please uninstall it
- Use latest Qemu version call for Xen
- (Because have some COLO module communication related patches haven't be merged, you can use internal version: View on Github )
Guest requirements
Only HVM guest(without pv extensions) is supported now. If you want to use OEM released guest os, please use SUSE. REDHAT and Ubuntu is not supported now because I don't find any way to disable pv extensions. If you want to use REDHAT or Ubuntu, you need to build the newest kernel which has the parameter xen_nopv.
Setup COLO environment
Network link topology
=================================normal ====================================== +--------+ |client | master +----+---+ slave -------------------------+ | + -------------------------+ PVM | + | | +-------+ +----[eth0]-----[switch]-----[eth0]---------+ | |guest | +---+-+ | | +---+-+ | | [tap0]--+ br0 | | | | br0 | | | | +-----+ [eth1]-----[forward]----[eth1]--+ +-----+ SVM | +-------+ | | | +-------+| | | | +-----+ | guest || [eth2]---[checkpoint]---[eth2] +--+br1 |-[tap0] || | | +-----+ | || | | +-------+| -------------------------+ +--------------------------+ e.g. master: br0: 192.168.2.98 eth1: 192.168.1.33 eth2: 192.168.3.1 slave: br0: 192.168.2.99 br1: no ip address eth1: 192.168.1.88 eth2: 192.168.3.2
===========================after failover===================================== +--------+ |client | master (dead) +----+---+ slave (alive) -------------------------+ | ---------------------------+ PVM | + | | +-------+ +----[eth0]-----[switch]-----[eth0]-------+ | |guest | +---+-+ | | +---+-+ | | [tap0]--+ br0 | | | | br0 +--+ | | | +-----+ [eth1]-----[forward]----[eth1] +-----+ | SVM | +-------+ | | | +-------+| | | +-----+ | | guest || [eth2]---[checkpoint]---[eth2] |br1 | +[tap0] || | | +-----+ | || | | +-------+| -------------------------+ +--------------------------+
Test environment prepare
On both Primary/Secondary hosts:
- checkout necessary repos:
# cd ~ # git clone https://github.com/xen-project/xen.git # git clone https://github.com/zhangckid/qemu.git
- Build and install xen
# cd ~/xen # ./autogen.sh; ./configure --enable-debug # make dist-xen; make install-xen # make dist-tools; make install-tools
- Build qemu
# cd ~/qemu # git checkout qemu-colo-for-xen # cd ~/xen/tools/qemu-xen-dir # ./configure --enable-xen --target-list=x86_64-softmmu \ --extra-cflags="-I~/xen/tools/include -I~/xen/tools/libxc -I~/xen/tools/xenstore" \ --extra-ldflags="-L~/xen/tools/libxc -L~/xen/tools/xenstore" # make $(grep -c processor /proc/cpuinfo)
Note: You must use qemu that we provide, qemu-xen and qemu-xen-traditional are not supported.
On Primary host:
- guest config
- Add "xen_platform_pci=0" and below disk/net config into the guest configfile.
disk = [ 'format=raw,devtype=disk,access=w,backendtype=qdisk,vdev=hda,colo,colo-host=192.168.3.2,colo-port=9001,colo-export=qdisk1,active-disk=/mnt/ramfs/active_disk.img,hidden-disk=/mnt/ramfs/hidden_disk.img,target=/home/zhangchen/suse-64hvm-zc.img'] vif = [ 'mac=00:16:4f:00:00:11, bridge=br0, model=rtl8139, colo_sock_sec_redirector0_id=red0,colo_sock_sec_redirector0_ip=192.168.2.98,colo_sock_sec_redirector0_port=9003, colo_sock_sec_redirector1_id=red1,colo_sock_sec_redirector1_ip=192.168.2.98,colo_sock_sec_redirector1_port=9004, colo_filter_sec_redirector0_queue=tx,colo_filter_sec_redirector0_indev=red0,colo_filter_sec_redirector1_queue=rx, colo_filter_sec_redirector1_outdev=red1,colo_filter_sec_rewriter0_queue=all,colo_sock_mirror_id=mirror0,colo_sock_mirror_ip=192.168.2.98, colo_sock_mirror_port=9003,colo_sock_compare_pri_in_id=compare0,colo_sock_compare_pri_in_ip=192.168.2.98,colo_sock_compare_pri_in_port=9021, colo_sock_compare_sec_in_id=compare1,colo_sock_compare_sec_in_ip=192.168.2.98,colo_sock_compare_sec_in_port=9004,colo_sock_compare_notify_id=not1, colo_sock_compare_notify_ip=192.168.2.98,colo_sock_compare_notify_port=9998,colo_sock_redirector0_id=compare_out, colo_sock_redirector0_ip=192.168.2.98,colo_sock_redirector0_port=9005,colo_sock_redirector1_id=compare0-0,colo_sock_redirector1_ip=192.168.2.98, colo_sock_redirector1_port=9021,colo_sock_redirector2_id=compare_out0,colo_sock_redirector2_ip=192.168.2.98,colo_sock_redirector2_port=9005, colo_filter_mirror_queue=tx,colo_filter_mirror_outdev=mirror0,colo_filter_redirector0_queue=rx,colo_filter_redirector0_indev=compare_out, colo_filter_redirector1_queue=rx,colo_filter_redirector1_outdev=compare0,colo_compare_pri_in=compare0-0,colo_compare_sec_in=compare1, colo_compare_out=compare_out0,colo_compare_notify_dev=not1,colo_checkpoint_host=192.168.2.98,colo_checkpoint_port=9998' ]
- Copy physical machine disk image from Primary to Secondary,and make sure their absolute path are the same
Note: colo-port is the secondary host's IP, colo-port is the secondary host's NBD server port, forwarddev is the directly connected nic.
Run COLO
On both Primary/Secondary hosts:
# service xencommons start
On Secondary host: excute the following script:
#! /bin/bash active_disk=/mnt/ramfs/active_disk.img hidden_disk=/mnt/ramfs/hidden_disk.img local_img=~/suse-64hvm.img tmp_disk_size=`./qemu-colo/qemu-img info $local_img |grep 'virtual size' |awk '{print $3}' function create_image() { ~/qemu/qemu-img create -f qcow2 $1 $tmp_disk_size } function prepare_temp_images() { grep -q "^none /mnt/ramfs ramfs" /proc/mounts if [[ $? -ne 0 ]]; then mount -t ramfs none /mnt/ramfs/ -o size=2G fi if [[ ! -e $active_disk ]]; then create_image $active_disk fi if [[ ! -e $hidden_disk ]]; then create_image $hidden_disk fi } prepare_temp_images
Note: It is recommended to put active disk and hidden disk in ramdisk.
On Primary host:
# xl create -p <domconfig> # xl pause <domconfig> # xl remus -c -p -u <domconfig> 192.168.3.2
Known problems
- Secondary vm may crash due to triple fault.
Note: this problem doesn't happen every time. So you can run colo again to avoid this problem.
Trouble shooting
- If there's some error happend when staritng COLO, you can do:
- Make sure you have all necessary modules that DOM0 needed on both side.
- Make sure you have followed all the instructions in this README.
- Try to reboot both primary and secondary host.
- If you still have problems, collect the error logs and contact Zhang Chen(zhangckid@gmail.com), Xie Changlong(xiecl.fnst@cn.fujitsu.com),
- Wen Congyang(wency@cn.fujitsu.com), Yang Hongyang(imhy.yang@gmail.com) for help.
Example
If you use SLES11.3, you can get the detailed steps from the wiki: Setup COLO on SLES11 SP3
An example guest config:
builder='hvm' memory='2048' vcpus=2 cpus=['2','3'] name='hvm_nopv_colo' device_model_version='qemu-xen' device_model_override='/home/zhangckid/qemu/x86_64-softmmu/qemu-system-x86_64' disk = [ 'format=raw,devtype=disk,access=w,backendtype=qdisk,vdev=hda,colo,colo-host=192.168.3.2,colo-port=9001,colo-export=qdisk1,active-disk=/mnt/ramfs/active_disk.img,hidden-disk=/mnt/ramfs/hidden_disk.img,target=/home/zhangchen/suse-64hvm-zc.img'] vif = [ 'mac=00:16:4f:00:00:11, bridge=br0, model=rtl8139, colo_sock_sec_redirector0_id=red0,colo_sock_sec_redirector0_ip=192.168.2.98,colo_sock_sec_redirector0_port=9003, colo_sock_sec_redirector1_id=red1,colo_sock_sec_redirector1_ip=192.168.2.98,colo_sock_sec_redirector1_port=9004, colo_filter_sec_redirector0_queue=tx,colo_filter_sec_redirector0_indev=red0,colo_filter_sec_redirector1_queue=rx, colo_filter_sec_redirector1_outdev=red1,colo_filter_sec_rewriter0_queue=all,colo_sock_mirror_id=mirror0,colo_sock_mirror_ip=192.168.2.98, colo_sock_mirror_port=9003,colo_sock_compare_pri_in_id=compare0,colo_sock_compare_pri_in_ip=192.168.2.98,colo_sock_compare_pri_in_port=9021, colo_sock_compare_sec_in_id=compare1,colo_sock_compare_sec_in_ip=192.168.2.98,colo_sock_compare_sec_in_port=9004,colo_sock_compare_notify_id=not1, colo_sock_compare_notify_ip=192.168.2.98,colo_sock_compare_notify_port=9998,colo_sock_redirector0_id=compare_out, colo_sock_redirector0_ip=192.168.2.98,colo_sock_redirector0_port=9005,colo_sock_redirector1_id=compare0-0,colo_sock_redirector1_ip=192.168.2.98, colo_sock_redirector1_port=9021,colo_sock_redirector2_id=compare_out0,colo_sock_redirector2_ip=192.168.2.98,colo_sock_redirector2_port=9005, colo_filter_mirror_queue=tx,colo_filter_mirror_outdev=mirror0,colo_filter_redirector0_queue=rx,colo_filter_redirector0_indev=compare_out, colo_filter_redirector1_queue=rx,colo_filter_redirector1_outdev=compare0,colo_compare_pri_in=compare0-0,colo_compare_sec_in=compare1, colo_compare_out=compare_out0,colo_compare_notify_dev=not1,colo_checkpoint_host=192.168.2.98,colo_checkpoint_port=9998' ] #----------------------------------------------------------------------------- # boot on floppy (a), hard disk (c), Network (n) or CD-ROM (d) # default: hard disk, cd-rom, floppy boot='c' sdl=0 vnc=1 vnclisten='' stdvga = 0 serial='pty' apic=1 apci=1 pae=1 extid=0 keymap='en-us' localtime=1 hpet=1 usbdevice='tablet' xen_platform_pci = 0
Man Pages
Links
For more information see: