遷移類型:
*非在線遷移 (有時也稱之為‘遷移’)。也就是在遷移到另外的計算節點時的這段時間虛擬機實例是處於宕機狀態的。在此情況下,實例需要重啟才能工作。
*在線遷移 (或 '真正的在線遷移')。實例幾乎沒有宕機時間。用於當實例需要在遷移時保持運行。在線遷移有下面幾種類型:
* 基於共享存儲的在線遷移。所有的Hypervisor都可以訪問共享存儲。
* 塊在線遷移。無須共享存儲。但諸如CD-ROM之類的只讀設備是無法實現的。
* 基於卷的在線遷移。實例都是基於卷的而不是臨時的磁盤,無須共享存儲,也支持遷移(目前僅支持基於libvirt的hypervisor)。
什么是熱遷移
熱遷移(Live Migration,又叫動態遷移、實時遷移),即虛擬機保存/恢復(Save/Restore):將整個虛擬機的運行狀態完整保存下來,同時可以快速的恢復到原有硬件平台甚至是不同硬件平台上。恢復以后,虛擬機仍舊平滑運行,用戶不會察覺到任何差異。
openstack熱遷移
OpenStack有兩種在線遷移類型:live migration和block migration。Livemigration需要實例保存在NFS共享存儲中,這種遷移主要是實例的內存狀態的遷移,速度應該會很快。Block migration除了實例內存狀態要遷移外,還得遷移磁盤文件,速度會慢些,但是它不要求實例存儲在共享文件系統中。
NFS允許一個系統在網絡上與他人共享目錄和文件。通過使用NFS,用戶和程序可以像訪問本地文件一樣訪問遠端系統上的文件。
遷移步驟
-
遷移前的條件檢查
動態遷移要成功執行,一些條件必須滿足,所以在執行遷移前必須做一些條件檢查。-
權限檢查,執行遷移的用戶是否有足夠的權限執行動態遷移。
-
參數檢查,傳遞給 API 的參數是否足夠和正確,如是否指定了 block-migrate 參數。
-
檢查目標物理主機是否存在。
-
檢查被遷移的虛擬機是否是 running 狀態。
-
檢查源和目的物理主機上的 nova-compute service 是否正常運行。
-
檢查目的物理主機和源物理主機是否是同一台機器。
-
檢查目的物理主機是否有足夠的內存(memory)。
-
檢查目的和源物理主機器 hypervisor 和 hypervisor 的版本是否相同。
-
-
遷移前的預處理
在真正執行遷移前,必須做一下熱身,做一些准備工作。
* 在目的物理主機上獲得和准備虛擬機掛載的塊設備(volume)。
* 在目的物理主機上設置虛擬機的網絡(networks)。
* 目的物理主機上設置虛擬機的防火牆(fireware)。
- 遷移
條件滿足並且做完了預處理工作后,就可以執行動態遷移了。主要步驟如下:- 調用 libvirt python 接口 migrateToURI,來把源主機遷移到目的主機。
dom.migrateToURI(CONF.live_migration_uri % dest,logical_sum,None,CONF.live_migration_bandwidth)
live_migration_uri:這個 URI 就是在 3.2.2 里介紹的 libvirtd 進程定義的。
live_migration_bandwidth:這個參數定義了遷移過程中所使用的最大的帶寬。 - 以一定的時間間隔(0.5)循環調用 wait_for_live_migration 方法,來檢測虛擬機遷移 的狀態,一直到虛擬機成功遷移為止。
- 調用 libvirt python 接口 migrateToURI,來把源主機遷移到目的主機。
- 遷移后的處理
當虛擬機遷移完成后,要做一些善后工作。-
在源物理主機上 detach volume。
-
在源物理主機上釋放 security group ingress rule。
-
在目的物理主機上更新數據庫里虛擬機的狀態。
-
在源物理主機上刪除虛擬機。
-
上面四步正常完成后,虛擬機就成功的從源物理主機成功地遷移到了目的物理主機了
Live Migration 的實現
熱遷移條件:
1.計算節點之間可以通過主機名互相訪問
2.計算節點和控制節點的nova uid和gid保持一致
3.vncserver_proxyclient_address和vncserver_listen 監聽的是本地IP
4.必須有共享存儲,實例存放在共享存儲中,且每個計算節點都可以訪問共享存儲。否則只能使用塊遷移
配置
-
添加live_migration_flag
修改nova的配置文件,在[libvirt] 段下 添加如下字段
live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"
-
修改libvirt配置
配置versh免密碼連接,修改/etc/libvirt/libvirtd.conf
添加如下配置
listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
listen_addr = "172.16.201.8" #根據自己的計算節點IP改寫
auth_tcp = "none"
修改/etc/sysconfig/libvirtd 添加如下參數
LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf
LIBVIRTD_ARGS="--listen"
重啟libvirt
systemctl restart libvirtd.service
查看監聽端口:
[root@compute1 ~]# netstat -lnpt | grep libvirtd
tcp 0 0 172.16.206.6:16509 0.0.0.0:* LISTEN 9852/libvirtd
測試:
在compute1節點上:
virsh -c qemu+tcp://compute2/system
在compute2節點上
virsh -c qemu+tcp://compute1/system
如果能無密碼連接上去,表示配置沒問題
動態遷移
- 查看所有實例
nova list
- 查看需要遷移虛擬機實例
nova show f3d749ba-98e1-4624-9782-6da729ad164c
-
查看可用的計算節點
nova-manage service list -
查看目標節點資源
nova-manage service describe_resource computer1 -
開始遷移,正常無任何回顯
nova live-migration 8da00f69-05f6-4425-9a8a-df56b79a474f computer1
- 也可以通過dashboard 節點遷移
用節點遷移需要使用admin管理員用戶執
冷遷移配置
冷遷移需要啟動nova賬戶,並配置ssh 免密碼認證
usermod -s /bin/bash nova
su - nova
ssh-keygen -t rsa
#生成密鑰
cp -fa id_rsa.pub authorized_keys
將密鑰復制到所有計算節點的/var/lib/nova/.ssh下,並設置權限為nova用戶
編輯/etc/nova/nova.conf的配置文件,修改下面參數
allow_resize_to_same_host=True
scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter
在計算節點重啟nova服務
systemctl restart openstack-nova-compute
在controller節點重啟nova 相關服務
systemctl restart openstack-nova-api.service openstack-nova-scheduler.service