一、前言:
据官方称Cloudstack的HA(高可用)功能在4.2.1 SP3中已经修复一些bug,遂测试其可用性。
CloudStack的HA功能分为VM的HA和Host的HA
比较:
CS4.2.1 HA+KVM
|
区别
|
前提
|
备注
|
基于VM
|
启用VM的HA功能后,如果VM异常宕机(crash)
或者进程被异常终止(而并非主机原因),
CS会自动检测并尝试在当前主机重新开启该VM
|
1.VM被从内部(init 0, halt ,shutdown)关闭,或进程被杀掉。 2.不能使用cloudstack控制界面关闭。 |
如果是使用cloudstack控制界面关闭,那该VM不会进行HA
尝试。
如果是前提1中方法导致VM关闭,CS会自动重新启动该VM。
|
基于HOST
|
启用主机的HA功能后,如果物理主机异常宕机或
者出现物理损坏,
CS会尝试将在该主机上面的虚
拟机,在打了HA tag的主机上面
重新启动。
|
1.不能使用reboot,shutdown这些命令关闭物理主机。
2.必须是被动、异常关闭,而不是主动关闭主机。
3.
比如:系统crash、断电,网络故障等。
原理:cloudstack-manager在内存中记录物理主机存活 状态,如果manager通过cloudstack-agent接收到物理主 机正常关闭时,则把内存信息中的该物理主机T除掉, 那么主动T除的情况下,是不会发生HA切换的。 |
即使是因为物理主机网络异常触发的HA,所有VM都会被
关闭并且在打了HA标签的主机上重新启动。
所以就是VM重新在其他服务器上启动的过程。
|
基于VM+HOST
|
2者结合,才真正实现高可用性。
|
生产中,推荐该做法。
|
Cloudstack与Cloudplatform操作步骤一样。据Citrix的售后顾问称,其两者并无太大差别。几乎一样。
另外,这里操作步骤还是把暗黑魔君大牛的直接拿来用。 总结的挺好,我书读的不多,暗黑君可别打我。
1.设置全局变量中的HA标签
2.给需要成为VM高可用特性的主机打上HA标签
3.创建支持VM高可用特性的计算方案
4.通过普通模板使用HA计算方案,创建实例
5.对一台启动高可用的VM进行手动关机或杀进程,测试VM高可用(虚拟机自动启动)
6.对一台服务器进行关机操作,测试HOST高可用(其上的虚拟机自动在启动HA的主机上启动)
4.通过普通模板使用HA计算方案,创建实例
5.对一台启动高可用的VM进行手动关机或杀进程,测试VM高可用(虚拟机自动启动)
5.1.从内部使用(init 0, halt ,shutdown)关闭,或将进程干掉。
然后30秒后查看该虚拟机是否重新起来了。
不再演示,唯一注意的是使用这种方法将虚拟机关闭,CS会自动将该VM重新启动。
5.2. 在CloudStack界面中,将该虚拟机关机。
此方法关闭虚拟机,将不再触发ha设置。
6.对一台服务器进行关机操作,测试HOST高可用(其上的虚拟机自动在启动HA的主机上重新启动)
NFO[storage.secondary.SecondaryStorageManagerImpl](secstorage-1:)Unable tostartsecondary storage vmforstandbycapacity,secStorageVm vmId:4,will recycle itandstartanewone
WARN[cloud.consoleproxy.ConsoleProxyManagerImpl](consoleproxy-1:)Exceptionwhiletrying tostartconsoleproxy
com.cloud.exception.InsufficientServerCapacityException:Unable tocreatea deploymentforVM[ConsoleProxy|v-5-VM]Scope=interfacecom.cloud.dc.DataCenter;id=1
at com.cloud.vm.VirtualMachineManagerImpl.advanceStart(VirtualMachineManagerImpl.java:841)
at com.cloud.vm.VirtualMachineManagerImpl.start(VirtualMachineManagerImpl.java:577)
at com.cloud.vm.VirtualMachineManagerImpl.start(VirtualMachineManagerImpl.java:570)
at com.cloud.consoleproxy.ConsoleProxyManagerImpl.startProxy(ConsoleProxyManagerImpl.java:556)
at com.cloud.consoleproxy.ConsoleProxyManagerImpl.allocCapacity(ConsoleProxyManagerImpl.java:928)
at com.cloud.consoleproxy.ConsoleProxyManagerImpl.expandPool(ConsoleProxyManagerImpl.java:1672)
at com.cloud.consoleproxy.ConsoleProxyManagerImpl.expandPool(ConsoleProxyManagerImpl.java:157)
at com.cloud.vm.SystemVmLoadScanner.loadScan(SystemVmLoadScanner.java:111)
at com.cloud.vm.SystemVmLoadScanner.access$100(SystemVmLoadScanner.java:33)
at com.cloud.vm.SystemVmLoadScanner$1.reallyRun(SystemVmLoadScanner.java:81)
at com.cloud.vm.SystemVmLoadScanner$1.run(SystemVmLoadScanner.java:72)
atjava.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
atjava.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
atjava.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
atjava.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
atjava.lang.Thread.run(Thread.java:744)