原文: http://www.hengtianyun.com/download-show-id-79.html
OpenStack的Resize(升級)功能,我們可以改變虛擬機的CPU核數、內存及磁盤大小,當然虛擬機只能向上升級,不允許向下降級。通過分析源代碼,我們發現Resize的過程其實就是冷遷移的過程,Resize多傳進去了一個flavor參數。下面將分析OpenStack升級虛擬機和冷遷移的功能。
一、 前端入口
(一) ? Resize
/usr/share/openstack-dashboard/openstack_dashboard/dashboards/project/instances/workflows/resize_instance.py
從上面的代碼可知,傳了兩個相關參數進去,第一個為虛擬機id(instance_id),第二個為升級的flavor。繼續深入api.nova.server_resize?
/usr/share/openstack-dashboard/openstack_dashboard/api/nova.py
從代碼可知,利用novaclient客戶端,向后端發出升級請求?
(二) ? 冷遷移
/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客戶端,向后端發出遷移請求
二、 后端響應
當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就成功創建了虛擬機。
一、? 不足與改進
通過對Resize的分析,我們發現有以下幾個缺陷
1)??????? ? AvailabilityZoneFilter
遷移過程中,會出現跨域的resize,availabilityZoneFilter好像并沒有起到過濾錯誤,這是由于我們創建虛擬機時,虛擬機的域選擇為ramdom,因此AvailabilityZoneFilter過濾器會對所有域的主機都放行,導致虛擬機升級到別的域域上去。
2)??????? ? 鏡像復制過程
遷移過程中,先會在源節點將增量鏡像和base鏡像進行合并,然后在復制到目的節點上,合并的過程比較耗時,我們可以直接將增量鏡像復制到目的節點,然后下載base鏡像,最后做一次rebase即可。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
