基于本地存儲的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