一、前言:
據官方稱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)