天天看點

基于本地存儲的kvm虛拟機線上遷移

基于本地存儲的kvm虛拟機線上遷移

kvm虛拟機遷移分為4種

(1)熱遷移基于共享存儲

(2)熱遷移基于本地存儲

(3)冷遷移基于共享存儲

(4)冷遷移基于本地存儲

這裡介紹的是基于本地存儲的熱遷移

動态塊遷移版本要求

qemu版本要求  大于或等于0.12.1(centos6.7或以上都沒問題)

rpm -qa|grep qemu

qemu-kvm-0.12.1.2-2.491.el6_8.1.x86_64

qemu-kvm-tools-0.12.1.2-2.491.el6_8.1.x86_64

目标主控端:192.168.1.24  機器名:CQ-KVM01

源主控端:192.168.1.26   機器名:CQ-KVM02

遷移使用tcp認證方式

kvm虛拟機名稱,是一台跑nginx的虛拟機:CQ-NGINX01

1、配置libvirtd服務 源主控端和目标主控端都要執行

vi /etc/libvirt/libvirtd.conf

listen_tls = 0   

listen_tcp = 1

tcp_port = "16509"

listen_addr = "0.0.0.0"

auth_tcp = "none"

mdns_adv = 0

解釋

listen_tls:關閉tls,預設是開啟的

listen_tcp :開啟tcp認證

tcp_port:tcp端口配置,預設端口是16509

auth_tcp:配置是否開啟密碼認證,預設不開啟

mdns_adv:是否開啟mdns多點傳播,預設關閉

sed -i 's/^#listen_tls = 0/listen_tls = 0/' /etc/libvirt/libvirtd.conf

sed -i 's/^#listen_tcp = 1/listen_tcp = 1/' /etc/libvirt/libvirtd.conf

sed -i 's/^#tcp_port = \"16509\"/tcp_port = \"16509\"/' /etc/libvirt/libvirtd.conf

sed -i 's/^#listen_addr = \"192.168.0.1\"/listen_addr = \"0.0.0.0\"/' /etc/libvirt/libvirtd.conf

sed -i 's/^#auth_tcp = \"sasl\"/auth_tcp = \"none\"/' /etc/libvirt/libvirtd.conf

sed -i 's/^#mdns_adv = 1/mdns_adv = 0/' /etc/libvirt/libvirtd.conf

cat libvirtd.conf |grep -iE "listen_tls"

cat libvirtd.conf |grep -iE "listen_tcp"

cat libvirtd.conf |grep -iE "tcp_port"

cat libvirtd.conf |grep -iE "listen_addr"

cat libvirtd.conf |grep -iE "auth_tcp"

cat libvirtd.conf |grep -iE "mdns_adv"

2、配置libvirtd監聽方式,無論是tcp,ssh,tls認證方式都需要配置 , 源主控端和目标主控端都要執行

vi /etc/sysconfig/libvirtd

LIBVIRTD_ARGS="--listen"

3、編輯/etc/libvirt/qemu.conf檔案  源主控端和目标主控端都要執行

vi /etc/libvirt/qemu.conf

vnc_listen = "0.0.0.0"

vnc_listen:使虛拟機帶外VNC預設監聽.0.0.0.0

4、重新開機libvirtd服務,使配置生效,  源主控端和目标主控端都要執行

/etc/init.d/libvirtd restart

5、檢查端口和程序,libvirtd是否監聽16509端口,  源主控端和目标主控端都要執行

netstat -lntp | grep libvirtd

tcp        0      0 0.0.0.0:16509               0.0.0.0:*                   LISTEN      48825/libvirtd    

修改iptables腳本,放行16509端口和49152端口

#ACCESS kvm

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 5900:5909 -j ACCEPT

iptables -A INPUT -p tcp --dport 16509 -j ACCEPT

iptables -A INPUT -p tcp --dport 49152 -j ACCEPT

6、在源主控端和目标主控端加上IP和主機的解析

#24機器上

echo "192.168.1.26 CQ-KVM02"  >> /etc/hosts

#26機器上

echo "192.168.1.24 CQ-KVM01"  >> /etc/hosts

7、在源主控端連接配接目标主控端的libvirtd并檢視虛拟機資訊

virsh -c qemu+tcp://[email protected]:16509/system

virsh -c qemu+tcp://[email protected]:16509/system

8、在目标主控端建立同樣大小的鏡像檔案,路徑、名稱也要一樣

要加上preallocation=metadata,否則使用virt-install指令安裝完成後虛拟機磁盤鏡像會變為raw格式

qemu-img create -f qcow2  -o preallocation=metadata  /data/kvmimg/CQ-NGINX01.qcow2 100G

9、遷移 ,192.168.1.26為目标主控端的内網IP,tcp認證方式,遷移時間有點長需要開一個screen視窗,不需要cd 到鏡像檔案所在目錄

screen -S migratekvm

virsh migrate --live --copy-storage-all --unsafe --persistent  CQ-NGINX01  qemu+tcp://[email protected]:16509/system

10、在目标主控端執行,會顯示paused狀态 即是suspended狀态

watch virsh list --all

11、在目标主控端執行,顯示遷移進度

tailf /var/log/libvirt/qemu/CQ-NGINX01.log

12、在目标主控端執行,鏡像檔案目錄為/data/kvmimg/,顯示虛拟機鏡像的大小,會看到虛拟機鏡像會不斷增大表示資料已經在遷移過來

注意建立鏡像檔案的時候要使用preallocation=metadata

cd /data/kvmimg/

watch du -h *

13、虛拟機遷移完成後,源主控端為關機狀态,目标主控端變為running狀态

virsh list --all #源主控端

virsh list --all #目标主控端

14、源主控端删除xml配置檔案

virsh destroy CQ-NGINX01

virsh undefine CQ-NGINX01

注意:

遷移過程中ping會有卡頓,有時會丢幾個包,如果虛拟機中有部署資料庫,應用程式最好有重連機制

回遷方法

建議不要删除源主控端上的鏡像檔案,保留鏡像檔案

#在目标主控端上執行 ,回遷到源主控端

virsh dumpxml CQ-NGINX01  >~/CQ-NGINX01.xml

virsh migrate --live --copy-storage-all --unsafe --persistent CQ-NGINX01  qemu+tcp://[email protected]:16509/system

源主控端和目标主控端最好要保持硬體一緻 ,這樣遷移和回遷出問題的幾率才能降到最低!

遷移速度和成功率和網絡有很大關系,主控端的網絡盡量是萬兆或千兆多網卡綁定,可以提高遷移速度和成功率

#限制遷移速度 為600M/s

virsh migrate-setspeed  CQ-NGINX01  600

線上遷移問題彙總

(如果ssh的端口不是預設22,可以寫為 qemu+ssh://target:port/system)

Question 1:

error: internal error hostname on destination resolved to localhost, but migration requires an FQDN

解決辦法很簡單,因為預設情況下hostname 是 localhost,我們需要把目标的hostname修改一下,臨時的也可以。

#hostname target

Question 2:

error: internal error Attempt to migrate guest to the same host 00020003-0004-0005-0006-000700080009

這個在mail list 中有大牛說是伺服器提供商的問題,

你可以用#dmidecode -s system-uuid 檢視一下這個ID,理論上是#virsh sysinfo | grep uuid 及# virsh capabilities | grep uuid

這三個ID是一樣的。(之前看論壇裡發的解決方法是需要下載下傳一個dmidecode 指令的檔案去替換系統的,達到修改的目的,不過我隻是修改了libvirt的配置檔案就可以了,可能是版本的問題)

我們修改一下libvirtd的配置檔案

#sed -i "/#host_uuid/ahost_uuid = \"`uuidgen`\"" /etc/libvirt/libvirtd.conf

重新開機一下libvirtd 服務

# /etc/init.d/libvirtd restart

然後再檢視一下

# virsh capabilities | grep uuid

Question 3:

error: unable to set user and group to '107:107' on '/image/vmtest/disk.img': No such file or directory

如果順利進入到這步的話,就很簡單了,沒有directory 直接建立一個就可以,沒有disk.img 直接create一個

注:建立的磁盤應該和源虛拟機的磁盤是一樣的大小(更大應該是可以)和格式(raw還是qcow2)

qemu-img create /image/vmtest/disk.img +sizeG

Question 4:

error: Unable to resolve address 'target' service '49155': Name or service not known

《《Name or service not known》》在/etc/hosts 添加解析的ip和target的域名即可

Question 5:

error: Unable to read from monitor: Connection reset by peer

可能目标主控端和源主控端記憶體不夠

建議:目标主控端和源主控端上都關閉一些不必要的虛拟機把記憶體騰出來

也可以清空cache把記憶體騰出來

#清除cache 首先執行sync指令

sync

echo 3 > /proc/sys/vm/drop_caches

基于TCP認證方式的遷移(需要輸入使用者名和密碼)

步驟跟上面大緻相同,隻是有些步驟需要做相應變更

1、配置libvirtd服務 源主控端和目标主控端都要執行,auth_tcp使用sasl認證方式

auth_tcp = "sasl"

sed -i 's/^#auth_tcp = \"sasl\"/auth_tcp = \"sasl\"/' /etc/libvirt/libvirtd.conf

2、建立libvirt管理使用者virtadmin

saslpasswd2 -a libvirt virtadmin

Password:

Again (for verification):

使用者名:virtadmin

密碼:xxxxxxx

可以使用sasldblistuser2指令檢視建立了那些使用者:

sasldblistusers2 -f /etc/libvirt/passwd.db

7、在源主控端連接配接目标主控端的libvirtd并檢視虛拟機資訊,會詢問使用者和密碼,輸入saslpasswd2指令建立的使用者virtadmin和密碼即可

Please enter your authentication name: virtadmin

Please enter your password:

Welcome to virsh, the virtualization interactive terminal.

9、遷移 ,192.168.1.26為目标主控端的内網IP,tcp認證方式,遷移時間有點長需要開一個screen視窗,不需要cd 到鏡像檔案所在目錄,

同樣輸入saslpasswd2 指令建立的使用者virtadmin和密碼即可

virsh migrate --live --copy-storage-all --unsafe --persistent CQ-NGINX01 qemu+tcp://[email protected]:16509/system

繼續閱讀