Resize 的作用是調整 instance 的 vCPU、記憶體和磁盤資源。
Instance 需要多少資源是定義在 flavor 中的,resize 操作是通過為 instance 選擇新的 flavor 來調整資源的配置設定。
有了前面對 Migrate 的分析,再來看 Resize 的實作就非常簡單了。 因為 instance 需要配置設定的資源發生了變化,在 resize 之前需要借助 nova-scheduler 重新為 instance 選擇一個合适的計算節點,如果選擇的節點與目前節點不是同一個,那麼就需要做 Migrate。
是以本質上講:Resize 是在 Migrate 的同時應用新的 flavor。 Migrate 可以看做是 resize 的一個特例: flavor 沒發生變化的 resize,這也是為什麼我們在上一節日志中看到 migrate 實際上是在執行 resize 操作。
下面是 Resize instance 的流程圖
向 nova-api 發送請求
nova-api 發送消息
nova-scheduler 執行排程
nova-scheduler 發送消息
nova-compute 執行操作
Resize 分兩種情況:
nova-scheduler 選擇的目标節點與源節點是不同節點。操作過程跟上一節 Migrate 幾乎完全一樣,隻是在目标節點啟動 instance 的時候按新的 flavor 配置設定資源。 同時,因為要跨節點複制檔案,也必須要保證 nova-compute 程序的啟動使用者(通常是 nova,也可能是 root,可以通過 ps 指令确認)能夠在計算節點之間無密碼通路。 對這一種情況我們不再贅述,請參看前面 Migrate 小節。
目标節點與源節點是同一個節點。則不需要 migrate。下面我們重點讨論這一種情況。
客戶(可以是 OpenStack 最終使用者,也可以是其他程式)向 API(nova-api)發送請求:“幫我 Resize 這個 Instance”
選擇新的 flavor
點選 Resize 按鈕
檢視日志 /opt/stack/logs/n-api.log
nova-api 向 Messaging(RabbitMQ)發送了一條消息:“Resize 這個 Instance”
檢視源代碼 /opt/stack/nova/nova/compute/api.py,方法是 resize_instance。
nova-scheduler 收到消息後,會為 instance 選擇合适的目标計算節點。
檢視日志 /opt/stack/logs/n-sch.log
在本例中,nova-scheduler 選擇了 devstack-compute1 作為的目節點,與源節點相同。
nova-scheduler 發送消息,通知計算節點可以遷移 instance 了
源代碼在 /opt/stack/nova/nova/scheduler/filter_scheduler.py 第 95 行,方法為 select_destinations
在目标節點上啟動 instance,過程與 launch instance 非常類似。
日志記錄在 /opt/stack/logs/n-cpu.log
會經過如下幾個步驟:
按新的 flavor 為 instance 準備 CPU、記憶體和磁盤資源
關閉 instance
建立 instance 鏡像檔案
将 instance 的目錄備份一份,命名為<instance_id>_resize,以便 revert。
建立 instance 的 XML 定義檔案
準備虛拟網絡
啟動 instance
這時,instance 的狀态處于“Confirm or Revert Resize/Migrate”狀态,需要使用者确認或者回退目前的遷移操作,實際上給了使用者一個反悔的機會。
當我們按下 Confirm 按鈕後,會發生如下事情:
nova-api 接收到 confirm 的消息
删除計算節上備份的 instance 目錄 <instance_id>_resize
反過來,如果執行 Revert 操作會發生什麼事情呢?
nova-api 接收到 revert 的消息
在計算節點上關閉 instance
通過備份目錄 <instance_id>_resize 恢複 instance 目錄。
重新啟動 instance
以上是 Resize 操作的詳細分析,下一節我們讨論 Live Migrate。
本文轉自CloudMan6 51CTO部落格,原文連結:
http://blog.51cto.com/cloudman/1785042