OpenStack的Resize和冷遷移代碼解析及改進

原文:http://www.hengtianyun.com/download-show-id-79.htmlhtml

OpenStack的Resize(升級)功能,咱們能夠改變虛擬機的CPU核數、內存及磁盤大小,固然虛擬機只能向上升級,不容許向降低級。經過分析源代碼,咱們發現Resize的過程其實就是冷遷移的過程,Resize多傳進去了一個flavor參數。下面將分析OpenStack升級虛擬機和冷遷移的功能。前端

1、前端入口python

(一) Resize算法

/usr/share/openstack-dashboard/openstack_dashboard/dashboards/project/instances/workflows/resize_instance.py後端

從上面的代碼可知,傳了兩個相關參數進去,第一個爲虛擬機id(instance_id),第二個爲升級的flavor。繼續深刻api.nova.server_resize api

/usr/share/openstack-dashboard/openstack_dashboard/api/nova.py跨域

從代碼可知,利用novaclient客戶端,向後端發出升級請求 dom

(二) 冷遷移python2.7

/usr/share/openstack-dashboard/openstack_dashboard/dashboards/admin/instances/tables.py函數

前段經過api.nova.server_migrate發起遷移請求,其中參數obj_id就是虛擬機的id,深刻api.nova.server_migrate

/usr/share/openstack-dashboard/openstack_dashboard/api/nova.py

從代碼可知,利用novaclient客戶端,向後端發出遷移請求

2、後端響應

當novaclient發出請求時,通常由nova-api組件做出響應。咱們將分別分析nova-api如何對resize和冷遷移進行響應。

(一) Resize

對Resize請求進行響應的函數位於文件

/usr/lib/python2.7/dist-packages/nova/api/openstack/compute/servers.py

繼續深刻self._resize()函數

從上述代碼可知,最後經過compute_api.resize進行調用,它傳了instance和flavor_id兩個參數進去 

(二) 冷遷移

/usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/admin_actions.py

從代碼可知,冷遷移也調用了compute_api.resize(),相比Resize功能,它只傳了instance一個參數進去

(三) Resize和冷遷移的共同過程

下面將從compute_api.resize()開始分析,這段代碼位於文件

/usr/lib/python2.7/dist-packages/nova/compute/api.py

/usr/lib/python2.7/dist-packages/nova/conductor/api.py

Nova-conductor組件響應請求

/usr/lib/python2.7/dist-packages/nova/conductor/manager.py

函數_cold_migrate()

經過上述代碼咱們發現,首先是經過rpc調用nova-scheduler組件調度最優節點。調度算法分爲兩個階段,即filter和weight。首先是過濾(filter),從全部的主機中找到符合實例運行條件的主機,而後從過濾出來的主機中,找到最合適的一個主機。

過濾階段系統默認調用的filter主要包括RetryFilter、AvailabilityZoneFilter、RamFilter、ComputeFilter、ComputeCapabilitiesFilter、ImagePropertiesFilter,其中比較重要的filter包括AvailabilityZoneFilter和RamFilter,AvailabilityZoneFiter保證了調度發生在同一個zone,RamFilter確保了內存是否足夠,默認狀況下,ram的擴大系數爲1.5,也就是假如物理內存爲100G,內存被虛擬爲150G,經過nova.conf配置文件,咱們能夠改變擴大系數。此外,經過配置文件,咱們還能夠改變調用的過濾器,除了上述過濾器外,咱們還可使用CoreFilter、DiskFilter、IoOpsFilter等。這些都是系統自帶的過濾器,咱們也能夠根據需求,本身構造過濾器。

Weight階段,從它作的工做來看,就是從符合條件的主機中選擇「最合適」的主機,這個選擇的過程是經過「評分」來實現的。現階段的weight很簡單,主要經過RAMWeigher進行權衡,剩餘內存越大,權值越大。

當上述工做完成後,若未挑選出合適的節點,Resize過程結束,系統報錯,若挑選出了合適節點,開始Resize流程,首先,rpc調用目的節點的nova-compute,即self.compute_rpcapi.prep_resize。

目的節點nova-compute開始響應

/usr/lib/python2.7/dist-packages/nova/compute/manager.py(2885)_prep_resize()

在prep_resize階段,主要保存了虛擬機Resize先後的狀態,最後經過rpc調用源節點的nova-compute,即self.compute_rpcapi.resize_instance

/usr/lib/python2.7/dist-packages/nova/compute/manager.py(3020)resize_instance()

 

上述代碼,一個比較重要的過程就是遷移磁盤文件,該功能經過self.driver.migrate_disk_and_power_off這個函數實現,咱們能夠具體看一下這個函數

/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py(4487)migrate_disk_and_power_off()

經過上述步驟,成功把虛擬機的磁盤文件複製到了目的節點上,開始遷移的最後一步,建立虛擬機這一步經過rpc調用目的節點的nova-compute實現,即self.compute_rpcapi.finish_resize,其具體代碼以下。

/usr/share/pyshared/nova/compute/manager.py:3153

/usr/lib/python2.7/dist-packages/nova/compute/manager.py(3073)_finish_resize()

/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py

經過self._create_domain_and_network就成功建立了虛擬機。

1、 不足與改進

經過對Resize的分析,咱們發現有如下幾個缺陷

1)        AvailabilityZoneFilter

遷移過程當中,會出現跨域的resize,availabilityZoneFilter好像並無起到過濾錯誤,這是因爲咱們建立虛擬機時,虛擬機的域選擇爲ramdom,所以AvailabilityZoneFilter過濾器會對全部域的主機都放行,致使虛擬機升級到別的域域上去。

2)        鏡像複製過程

遷移過程當中,先會在源節點將增量鏡像和base鏡像進行合併,而後在複製到目的節點上,合併的過程比較耗時,咱們能夠直接將增量鏡像複製到目的節點,而後下載base鏡像,最後作一次rebase便可。

相關文章
相關標籤/搜索