• 沒有找到結果。

Openstack 動態轉移機制

第三章 跨雲的虛擬機器機制

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 進行資料庫的操作。

相關文件