1. 程式人生 > >虛擬化學習筆記-KVM虛擬化跨機遷移原理

虛擬化學習筆記-KVM虛擬化跨機遷移原理

線上遷移過程劃分為三個階段:準備階段、遷移階段和切換階段。
遷移環境為虛擬化底層KVM+Qemu、虛擬化管理Libvirt、虛擬化網路Openvswitch。

準備階段

  • Step.1 選擇一臺具有足夠磁碟和記憶體資源的物理機DestHost,並在DestHost上建立VM對應的系統盤和資料盤,同時選定接收遷移資料的tcp埠(如圖 1-1所示),這兩個磁碟在DestHost和SourceHost上的路徑必須完全一致。不同的是,DestHost上初始建立的只是空盤,上面沒有真實資料。
圖 1-1在目標端新建虛擬機器映象
  • Step.2 通過虛擬化管理軟體Libvirt在DestHost上建立一個和VM同樣配置的虛擬機器VM’,系統盤和資料盤使用Step.1中建立的系統盤和資料盤(如圖 1-2所示)。VM’當前是paused狀態,虛擬機器VM’的vcpu處於暫停狀態,同時虛擬機器VM’會通過監聽一個內網的tcp埠來接收遷移資料
圖 1-2 在目標端建立新虛擬機器

遷移階段

  • Step.3 虛擬化管理層Libvirt給VM對應的Qemu程序發出一個遷移指令,並指定引數,例如指定DestHost為目標、需要遷移塊裝置、最大停機時間、遷移頻寬限制等,然後遷移資料就會通過指定tcp鏈路傳輸給DestHost上的VM’。需要注意,遷移資料的網路包不是經過 vswitch,而是直接從SourceHost的ethx網絡卡出,進到DestHost的ethx,因為VM’對應Qemu程序正作為DestHost一個使用者態程序,監聽在ethx對應的內網ip(如圖 1-3所示)。


    圖 1-3 虛擬機器遷移資料
  • step.4 經過前面三步,虛擬機器的資料就正式開始遷移,剩下的挑戰是如何保證資料遷移的一致性,因為此時VM處於執行狀態,裡面時刻發生記憶體更新、磁碟io操作和裝置狀態變更,而VM’是paused狀態,只通過一個執行緒接收VM程序發過來的資料。

為此,在遷移過程中各種資料如何有序遷移?首先,Libvirt會發送qmp_dirve_mirror命令來通知Qemu進行虛擬機器磁碟資料遷移,從而在源端和目標端直接同步磁碟資料。然後,Libvirt會再次傳送qmp_migrate命令通知Qemu進行虛擬機器記憶體資料遷移,進一步完成虛擬機器主要資料的遷移。最後,由於裝置狀態對應的資料量很少,在遷移最後階段會通過一次性同步,將Qemu裡每個設備註冊的狀態同步到目標端。

另外,遷移過程中發生變更的資料如何遷移?如果不遷移變更的資料,那資料必然不一致,也表明遷移還不能結束,因此Qemu一般通過資料遷移準備、資料遷移、資料遷移收尾三個步驟來完成。

迴圈呼叫磁碟和記憶體遷移函式也是按階段來分別呼叫的。首先,迴圈呼叫磁碟和記憶體遷移函式的遷移資料準備功能,即前期準備工作,例如把磁碟按block為單位組織成一個數組,並設定記錄髒塊機制;把記憶體所有頁全部設定為髒頁,併發送開始遷移的標誌到VM’的程序。

緊接著,需要進行真正的資料遷移,Qemu在這個階段呼叫磁碟和記憶體遷移函式的第二步驟功能,並且要求必須等磁碟資料遷移完成後才會執行記憶體資料遷移。如圖 1-4所示,Qemu首先會進行磁碟(記憶體)的全量資料遷移,依次將每個block(頁)遷移到目標端DestHost。


圖 1-4 全量資料遷移示意圖

然後再通過多次迭代,將遷移過程中虛擬機器產生的新資料遷移到目標端DestHost(如圖 1-5所示)。這一迭代過程是收斂的,收斂依據與之前設定的頻寬、最大停機時間有關。同時,在迭代過程中,Qemu將邊遷移邊記錄剩下的髒資料大小,並與停機時間進行比較,如果這個值比停機時間大,那麼繼續遷移,如果比停機時間小,那麼源端Qemu程序就會暫停,從而避免產生新的髒資料,以便進行遷移收尾工作。
在虛擬機器暫停之後,進入第三步遷移收尾工作,源端Qemu程序會把磁碟、記憶體髒資料和裝置狀態一次性同步到目標端,完成時VM和VM’的資料將會一致。這時,上層管理軟體會把VM關閉,並把VM’的vcpu恢復執行狀態,整個虛擬機器的資料遷移就完成了。


圖 1-5 增量資料遷移示意圖

切換階段

  • Step.5 資料遷移完成後,VM關閉,VM’作為它的一個完全拷貝,在DestHost上執行著,但網路還是不通的(如圖 1-2所示)。VM’通過DestHost的vswitch 連線到物理機網絡卡,vswitch相當於一個虛擬交換機,而VM從SourceHost遷移到DestHost,在網路上相當於把網線從一個交換機拔下插到另一個交換機上,此時就需要一次arp廣播,告知VM的mac地址已經變更到另外一臺交換機的某個埠。

這就是遷移完成後的網路切換,由於切換時間很短,少於tcp的超時重傳時間,因此對於原VM上跑著網路服務程式幾乎是無感知的。此後,如圖 1-6所示,目標端DestHost虛擬機器就具備和使用者直接進行互動的能力,而源端SourceHost虛擬機器此時就可以刪除。


圖 1-6 完成虛擬機器遷移示意圖

整個遷移過程對使用者來說是透明的。
雖然,當前KVM虛擬化線上遷移能夠滿足大多數情況下的使用者虛擬機器遷移,但還存在以下問題:

- 在磁碟和記憶體負載高的情況下,存在遷移無法完成的情況;
- 跨機遷移存在網路中斷時間長的問題;
- 跨儲存型別的場景下如何進行遷移;
- 如何應用遷移進行虛擬機器元件的更新。