第三章 跨雲的虛擬機器機制
3.2 跨雲動態轉移機制
3.2.2 Openstack 動態轉移機制
OpenStack 是在 Controller Node 上使用 Nova 模組,由 Nova 的子模組執行虛 擬機器的動態轉移指令。動態轉移只能進行在兩台不同的 Compute Node 之間,
虛擬機器將從來源主機動態轉移到目標主機上。在 OpenStack 的轉移方式有兩種,
一種是動態轉移(Live migration),另一種是區塊轉移(Block migration)。動態轉移 的前提是有共享的空間,轉移的過程只需要將虛擬機器的記憶體狀態轉移,而區
21
塊轉移除了轉移記憶體狀態之外,還需要轉移磁碟空間上的資料。本章節是針對 動態轉移的步驟流程進行說明,如圖八:
圖八 OpenStack 虛擬機器動態轉移流程
1.首先,管理者取得認證後呼叫 nova-api 執行動態轉移,nova-api 的 admin_actions 有定義管理者可以對虛擬機器進行的操作。Nova-api 接收到 執行動態轉移的命令,取得欲轉移的虛擬機器的名稱,則通知 nova-compute 的 api 執行動態轉移。
2.nova-compute 的 api 會先檢查虛擬機器的狀態是否為正常運作,再將虛擬 機器的狀態更新為轉移中,更新的狀態會使用 db-api 寫入 Nova 資料庫,
狀態更新後,nova-compute 會通知 nova-scheduler 執行動態轉移。
3.因為在 OpenStack 中使用 RabbitMQ 來傳遞訊息,因此 nova-compute 要 通知 nova-scheduler,則是使用 scheduler 的 rpcapi,將要傳遞的訊息發送到 nova-scheduler 的 manager。
4.nova-scheduler 的 manager 接收到動態轉移的通知,則呼叫 nova-scheduler
22
的 driver 進行動態轉移的排程工作,driver 會先檢查虛擬機器動態轉移的來 源主機及目標主機:
(1) 檢 查 來 源 主 機 : 檢 查 虛 擬 機 器 的 狀 態 是 否 為 運 行 中 , 並 呼 叫 servicegroup 的 api 檢查來源主機是否提供服務,再檢查來源主機是否 正常運行。
(2)檢查目標主機:如果沒有指定目標主機,則 nova-scheduler 會選擇除 了來源主機之外的主機為目標主機;當目標主機已經指定,則進行目標 主機的檢查,檢查目標主機是否與來源主機相同,以及目標主機是否提 供服務,再呼叫 servicegroup 的 api 檢查目標主機是否正常運行中。此 外,檢查目標主機是否有足夠的記憶體可以進行動態轉移。
(3)動態轉移的例行檢查:檢查來源主機及目標主機的虛擬機器管理系 統是一樣的,而且目標主機的虛擬機器管理系統版本要大於來源主機 的。
(4)通知目標主機的 nova-compute 進行檢查:目標主機上的 nova-compute 會檢查是否有足夠的磁碟空間,並檢查 CPU 的規格是否符合虛擬機器 的要求。檢查之後,nova-compute 會檢查與來源主機的共享磁碟空間是 否正常連結,並檢查目標主機是否有足夠的磁碟空間。
以上檢查程序完成後,使用 nova-compute 的 rpcapi 通知虛擬機器目前運行 的 Compute Node 也就是來源主機,命令來源主機的 nova-compute 進行動態 轉移。
5.來源主機的 nova-compute 接收動態轉移的命令,使 nova-compute 的 manger 進行動態轉移。manager 會以 nova-compute 的 rpcapi 通知目標主機的 nova-compute,以進行動態轉移的前置轉移。前置轉移將儲存空間以及網路 設定重新設定,但是在這裡是使用共享儲存空間,所以不用轉移儲存空間。
在前置轉移動作中,會呼叫 network-api 使 nova-network 重新配置網路,為
23
轉移的虛擬機器,設置新的網路連接到目標主機上,並取消來源主機的網路 連接。
6.當前置轉移完成,來源主機的 nova-compute 呼叫 virt.libvirt 執行虛擬機器 的動態轉移。虛擬機器轉移到目標主機後,來源主機的 nova-compute 呼叫 nova-conductor 的 api 將虛擬機器的相關資料更新。
7.nova-conductor 的 api 會將要更新的訊息傳遞給 nova-conductor 的 manager,
並且將訊息更新到資料庫中。
圖九 虛擬機器動態轉移 Nova 與外部模組關係
OpenStack 使用 Nova 模組執行動態轉移的過程中,使用呼叫外部的 API,
如圖九,Nova 使用 network-api 子模組時,network-api 是呼叫 quantum.api 和 Quantum 進行溝通。要取得映像檔相關資訊的時候,則是使用 image.glance 取得 Glance 資料庫所紀錄的資料。當 Nova 需要取得磁碟空間相關資訊的時候,則是 使用 volume.cinder 以存取 Cinder 的資料庫。nova-compute 要對虛擬機器進行操
24
作的時候,是使用 virt.libvirt 呼叫 Libvirt 進行操作。當 Nova 要存取或修改自己 的資料庫時,則是使用 db.api 進行資料庫的操作。