openstack instance migraiton status
openstack 虛擬機遷移總共有4種類型:
- resize (調(diào)整虛擬機配置大小)
- migraiton (冷遷移, 與resize動作基本一樣)
- live-migration (熱遷移)
- evacuation (疏散,用于將出問題的物理機上的虛機遷移到新的物理機上)
其中migration底層調(diào)用的就是resize的代碼,在新舊的物理機和都會保留虛機的數(shù)據(jù),用于等待確認或取消操作。
openstack 涉及到三種狀態(tài),vm_state,task_state和power_state。我們主要將一下在做遷移操作時涉及的task_state.
1. resize/migration
在虛擬機active和stopped狀態(tài)下可以進行migrate/resize,migration和resize的代碼一樣,resize與migrate的區(qū)別是在遷移的同時,改變虛擬機的flavor,所以他們的task_state都是一樣的。他們的狀態(tài)分為過渡狀態(tài)和穩(wěn)定狀態(tài)。
遷移之后,會在數(shù)據(jù)庫中新增migration表記錄,同時會增加instance_system_metadata表記錄,記錄老的flavor和新的flavor,如果是resize,也會更新instances表中虛擬機的flavor信息。
對于resize,還有兩個相關操作:confirm_resize和revert_resize,兩個操作都是在虛擬機狀態(tài)為resized下的操作。前者是resize的確認,后者是回退。也就是說,在做完migrate/resize操作后,給用戶提供了后悔的機會,比如用戶可能對新規(guī)格的虛擬機性能不滿意,不愿意花冤枉錢,于是可以調(diào)用revert_resize,是虛擬機回退到之前的狀態(tài)(包括虛擬機所在的主機和虛擬機的規(guī)格)。還需要注意,會有這樣的情況,用戶做完了resize/migrate,然后沒有確認也沒有回退(因為可能resize操作并不收費,所以用戶想著能體驗多長時間就用多長時間)。此時,OpenStack提供了循環(huán)任務的機制處理這種情況,當系統(tǒng)中配置項resize_confirm_window大于0時,計算節(jié)點會自動將在本機中狀態(tài)為resized,時間超過resize_confirm_window的虛擬機進行確認。
注意:resize/migration操作錯誤之后不會在migration數(shù)據(jù)表中出現(xiàn)error狀態(tài),任務卡死了(目前發(fā)現(xiàn)是這樣的),所以當動作的過度狀態(tài)長時間在數(shù)據(jù)庫中,說明操作出錯?。?!
狀態(tài)轉(zhuǎn)換圖如下:
st=>start: 開始
e=>end: 結束
op1=>operation: pre-migrating
op2=>operation: migrating
op3=>operation: post-migrating
op4=>operation: finished
op5=>operation: confirming
op6=>operation: confirmed
op7=>operation: reverting
op8=>operation: reverted
c1=>condition: confirm?
st->op1->op2->op3->op4->c1
c1(yes,right)->op5->op6->e
c1(no)->op7->op8->e
pre-migrating --> migrating --> post-migrating --> fininshed --> confirm or revert
配置項allow_resize_to_same_host表示是否允許遷移到本機,默認是False。
在做migrate/resize前還應注意,計算節(jié)點間是需要配置nova用戶無密碼訪問的;同時,migrate/resize操作支持共享存儲。
2. live-migration
migrate操作會先將虛擬機停掉,也就是所謂的“冷遷移”,而os-migrateLive是“熱遷移”,虛擬機不會停機。
live-migration是在虛擬機active狀態(tài)下的操作,且不允許熱遷移到本機。
live-migration允許用戶指定block_migration參數(shù),表示是否進行塊遷移。有幾種情況:
- block_migration=True,但系統(tǒng)使用了共享存儲,拋異常;
- block_migration=False,但系統(tǒng)沒有使用共享存儲且虛擬機沒有使用后端系統(tǒng)卷,拋異常;
live-migration 的task_state如下:
st=>start: 開始
e=>end: 結束
op1=>operation: running
op2=>operation: completed
op3=>operation: error/failed
c1=>condition: 正確?
st->op1->c1
c1(yes, right)->op2->e
c1(no)->op3->e
參考資料: