QEMU COLO (Fault Tolerance) 容错功能总结

QEMU COLO (Fault Tolerance)功能调研成果总(2.8.1版本)


1. COLO 现状:
很早就有公司,例如IBM,实现QEMU 的 Fault Tolerance功能(
microcheckpoint简称mc),基于VM checkpoint 的方式(对虚拟机状态定期检查,判断,并做出相应同步和调整),还有一些不知名的实现方式如kemari。不过均未被QEMU官方所接受。

QEMU 从2.8.1版本起对colo项目支持,所以目前libvirt还并没有对colo全面支持,但是libvirt 通过与qmp交互,来管理QEMU虚拟机,所以依旧可以通过libvirt 配置colo, 但是管理方面逻辑,需要自己实现。


2. COLO实现FT的相关原理:


colo是一种 non-stop service 的解决方案,结合了lock-
stepping(锁步) 和 checkpoint 两种同步方式。

lock-stepping 即对命令的同步,对于服务器则是指通过网络接受到的指令包,将发送给primary vm的指令包进行复制,对比,修改,并同时发送给 secondary vm ,使secondary vm接收到和 primary vm 相同的指令。单一 使用lock-stepping 必须对严格的对每一份指令包进行复制 ,并且即使相同的指令,两台虚拟机的处理方式和结果也可能略有不同。

checkpoint 即一定频率对两台虚拟机状态进行检测,适当调整同步的过程。增加检测频率可以提高同步效率,但同时会增加消耗。


两者结合可以减少checkpoint 的频率,减少消耗。(即使这样 ,测试过程中colo同步的两台虚拟机 ,延迟也比较明显)

colo实现的前提是要先热迁移虚拟机,所以colo是作为热迁移的一种模式,放到了qemu/migraiton 下,在即将迁移结束时,会有对是否为colo模式的判断,在colo模式下,不会关闭清除迁移源主机,而是开启checkpoint 和lock-stepping ,以及存储拷贝,block replication,并且设计了缓冲池disk buffer以便处理存储差异化,存储拷贝是qemu另一大功能,更多存储拷贝信息,可以查阅官方Block Replication文档。为了实现故障转移功能,加入了failover功能,即通过heartbeat 连接源和目的宿主机,当 heartbeat socket 断开时 ,在secondary vm 启动failover 以充当primary vm,实现 non-stop service 功能。


3. COLO的配置过程(参见官方配置和测试方案链接,以下是对部分命令的解释):

x86_64-softmmu/qemu-system-x86_64 -enable-kvm -boot c -m 2048 -smp 2 -qmp stdio -vnc :7 -name primary -cpu qemu64,+kvmclock -device piix3-usb-uhci \
#kvm加速 ,硬盘启动,内存,cpu

#启动qmp 标准输入 ,vnc 7号端口
-drive if=virtio,id=colo-disk0,driver=quorum,read-pattern=fifo,vote-

threshold=1,children.0.file.filename=./fedora.img,children.0.driver=raw -S\#quorum是一种分布投票模式 ,这里-S是暂不启动CPU,可以去掉。或在qmp中启动

-netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown \

#虚拟机外部网络设备 及 启动脚本
-device e1000,id=e0,netdev=hn0,mac=52:a4:00:12:78:66 \

#虚拟机网卡配置
-chardev socket,id=mirror0,host=10.10.130.88,port=9003,server,nowait -

chardev socket,id=compare1,host=10.10.130.88,port=9004,server,nowait \-chardev socket,id=compare0,host=10.10.130.88,port=9001,server,nowait -

chardev socket,id=compare0-0,host=10.10.130.88,port=9001 \
-chardev socket,id=compare_out,host=10.10.130.88,port=9005,server,nowait

\

-chardev socket,id=compare_out0,host=10.10.130.88,port=9005 \#配置COLO所需的socket

-object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0 \#包括heartbeat 和 数据传输等

-object filter-redirector,netdev=hn0,id=redire0,queue=rx,indev=compare_out -objectfilter-redirector,netdev=hn0,id=redire1,queue=rx,outdev=compare0 \

-object colo-compare,id=comp0,primary_in=compare0-0,secondary_in=compare1,outdev=compare_out0

{'execute':'qmp_capabilities'}
{ 'execute': 'human-monitor-command',

'arguments': {'command-line': 'drive_add -n buddydriver=replication,mode=primary,file.driver=nbd,file.host=10.10.130.87,file.port=8889,file.export=colo-disk0,node-name=node0'}}

#使用hmp配置存储同步网络
{ 'execute':'x-blockdev-change', 'arguments':{'parent': 'colo-disk0', 'node':'node0' } }
{ 'execute': 'migrate-set-capabilities',

'arguments': {'capabilities': [ {'capability': 'x-colo', 'state': true } ] } }#迁移的属性(状态)中 添加colo状态
{ 'execute': 'migrate', 'arguments': {'uri': 'tcp:10.10.130.87:8888' } }#启动迁移

x86_64-softmmu/qemu-system-x86_64 -boot c -m 2048 -smp 2 -qmp stdio -vnc:7 -name secondary -enable-kvm -cpu qemu64,+kvmclock -device piix3-usb-uhci \

-drive if=none,id=colo-disk0,file.filename=./fedora.img,driver=raw,node-name=node0 \

-drive if=virtio,id=active-disk0,driver=replication,mode=secondary,file.driver=qcow2,top-id=active-disk0,file.file.filename=/mnt/active_disk.img,file.backing.driver=qcow2,file.backing.file.filename=/mnt/hidden_disk.img,file.backing.backing=colo-disk0 \

-netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown \

-device e1000,netdev=hn0,mac=52:a4:00:12:78:66 -chardevsocket,id=red0,host=10.10.130.88,port=9003 \

-chardev socket,id=red1,host=10.10.130.88,port=9004 \
-object filter-redirector,id=f1,netdev=hn0,queue=tx,indev=red0 \
-object filter-redirector,id=f2,netdev=hn0,queue=rx,outdev=red1 \-object filter-rewriter,id=rew0,netdev=hn0,queue=all -incoming tcp:0:8888

{'execute':'qmp_capabilities'}
{ 'execute': 'nbd-server-start', 'arguments': {'addr': {'type': 'inet', 'data': {'host':'10.10.130.87', 'port': '8889'} } }}
{'execute': 'nbd-server-add', 'arguments': {'device': 'colo-disk0', 'writable': true}}


colo的配置是可以基于nova已经创建的两台虚拟机的,即所有的-device, -netdev, -object , -chardev都可以通过类似{" execute ":xxxxxxxx, "arguments": xxxxxxxx}的qmp命令在虚拟机创建后进行配置。

在相关链接的qmp接口文档中可以查找。


4. COLO 适应于Openstack 的方案:


Nova 实现冷迁移 和 热迁移 的过程,伴随着复杂的网络迁移和存储迁移,其中Neutron 网络部分的迁移,即虚拟机外部 包括网桥,安全组等配置是由nova实现的逻辑负责的,而虚拟机内部的网络配置 是通过xml文件由libvirt负责的。xml文件的内容,即虚拟机的相关配置我们可以通过libvirt使用qmp命令配置。虚拟机外部网络部分,可以使用热迁移中的网络迁移。或者修改nova创建虚拟机部分,允许为两个虚拟机分配相同的ip,虚拟机内部网络配置是默认迁移达到一致的(而且即使secondary vm 是启动的,但是他并不从网卡接收数据包,直到启动failover),而网桥上的端口号等并不影响虚拟机本身。



相关链接:

功能架构:

http://events.linuxfoundation.org/sites/events/files/slides/Status%20Update%20About%20COLO%20FT%20KVM%20forum%202016%20finial.pdf


官方配置和测试方案:

http://wiki.qemu.org/Features/COLO

qemu monitor protocol (qmp 即libvirt 调用的命令接口)文档: qemu/qapi-schema.json

human monitor protocol (hmp 另一种命令接口)文档 :qemu/hmp-commands.hx

创建虚拟机参数文档:qemu/qemu-options.hx

你可能感兴趣的:(OpenStack)