跨平台(I版到K版)迁移实践总结

       所谓跨平台迁移,对于了解openstack冷迁移过程的同窗来讲,其实就是手动去执行冷迁移的代码行为,固然像我这种抵制体力劳动的人,确定会想写脚本去跑,即便不会也要边学边用。
迁移并不是想象的简单,缘由大概有几点:
1.网络的迁移,浮动ip的迁移;
2.虚机数量众多, 光传输数据就是几十个T,并且 得保持虚拟机全部信息不能有一点错误;
3.虚机类型多,类型包括本地虚机、卷虚机、以及本来是卷虚机的本地虚机,都没有尝试过方案是否可行;
4.I版镜像和K版使用的镜像差别较大,I版有些很老的镜像尚未用cloudinit去配置虚机信息。
 
一台虚机的迁移过程
前提:
①.K版环境搭建完成、而且关闭config-drive和metadata server。
//由于cloudinit若是检查到虚机的uuid变了会从新去读metadata信息,这样会改变原虚机的密码。
//这里后面我会总结下,若是再让我作一次,我不会作这一步,带来了太多的问题。
②在K版环境中,为老的虚机建立一样的租户用户、镜像、flavor、安全组和网络等信息。
这里虽然一句话,可是工做量很大,涉及大量的虚机资源,并且须要与前端同步。
 
1. 对于老的虚拟机,得保证虚机中网卡信息 已删除
rm -f /etc/udev/rules.d/70-persistent-net.rules
//这一步的目的是保证新的虚机中不带原虚机网卡信息,否则新的虚机网卡eth0起不来。
 
2.将I版环境中的虚机关机
nova stop uuid
 // 注意须要确认已经关机
 
3.登陆到I版虚机所在的计算节点
3.1将数据拷贝K版环境中
首先你得查到虚机的计算节点,而后才知道怎么去找数据。
[root@node-63~]# scp -r /var/lib/nova/instances/5e8d5d06-e3ed-4f56-b28b-7d57309e9fbb node-76:/tmp/
 
对于卷虚机或者说是原来是卷虚机的本地虚机,它的disk是raw格式的
两种方法解决:①修改libvirt.xml文件中的disk的文件格式
②使用qemu转换raw到qcow2,显然这种更合适,缘由raw是空洞文件很大,而qcow2是增量的。
qemu-img convert -f raw disk -O qcow2  disk 
 
3.2将vm的对应的backing-file拷贝到K版环境(我认为这一步其实能够不用作)。
#卷虚机没有backing-file;本地虚机新老虚机若是镜像不同须要才作这一步。
[root@node-63~]# qemu-img info /var/lib/nova/instances/5e8d5d06-e3ed-4f56-b28b-7d57309e9fbb/disk
image:/var/lib/nova/instances/5e8d5d06-e3ed-4f56-b28b-7d57309e9fbb/disk
file format: qcow2
virtual size:50G(53687091200 bytes)
disk size:734M
cluster_size:65536
backing file:/var/lib/nova/instances/_base/c631b3cc0e8ed9b5fa4d9020995b108d50ba085f
Format specific information:
    compat:1.1
lazy refcounts:false

  

[root@node-63~]# scp /var/lib/nova/instances/_base/c631b3cc0e8ed9b5fa4d9020995b108d50ba085f node-76:/tmp/5e8d5d06-e3ed-4f56-b28b-7d57309e9fbb/

 

4.开始迁移
  1. source /root/openrc-xxx 
// 这个我在迁移开始前,把全部的用户的环境变量都写好了,因此直接用。
4.1 建立一台和 I 版规格如出一辙的虚拟机
nova boot <instance-name>--image <image-uuid>--flavor <flavor-id>--nic net-id=<net-uuid>,v4-fixed-ip=<fixed-ip>--security-groups
<security-groups_id> --available-zone nova:hostname

注意:前端

1instance-name 须要很原来的虚拟机名称保持一致node

2image-uuid,已经在K版环境上传了I版镜像,能够直接使用:数据库

有些镜像没法使用,建立这些镜像的虚拟机时,请用任意其余镜像代替centos

3)flavor,选择和之前的flavor内容一致的模板安全

4)net-uuid,请选择正确的网络bash

5)v4-fixed-ip,填写正确的ip地址,和老系统保持ip一致网络

6)--security-groups,填写正确的安全组ssh

7)--available-zone ,事先规划好的目标计算节点工具

再次注意:测试

建立虚拟机时,须要使用特定租户建立,而不是用admin建立。

 
4.2. 待虚拟机启动成功后, 将其关闭
nova stop 41c0cc46-8afd-4333-877b-45310f2a80b2
 
4.3登录到K版计算结点
1. 替换vm的disk
mv /var/lib/nova/instances/5e8d5d06-e3ed-4f56-b28b-7d57309e9fbb/disk /var/lib/nova/instances/<new-vm-uuid>/
 
注意disk的权限, 本身调整下
 
2. 对于新老虚机镜像用的不一致的要作此步骤。
mv /var/lib/nova/instances/5e8d5d06-e3ed-4f56-b28b-7d57309e9fbb/c631b3cc0e8ed9b5fa4d9020995b108d50ba085f /var/lib/nova/instances/_base/
注意c631b3cc0e8ed9b5fa4d9020995b108d50ba085f 的权限
 
5.登录K版环境控制节点开机
nova start xxxx
至此、虚机数据迁移部分其实基本完成
 
6.单个浮动ip从I版迁移K版
//由于分批停机,因此无法将整个公网ip一会儿迁移过去。
 
7.把新的虚机信息以及网络信息给前端,同步到前端数据库
 
8.当全部虚拟机都迁移完成后,打开config driver
问题来了,当虚机重启后,cloudinit发现虚机的uuid相对于老环境变化了,它会去从新检查metadata信息,所以会致使虚机的原始密码被修改掉,问题既然发生了,就得想办法解决。因而就把虚机的cloudinit开机不自启动。
centos  使用chkconfig去关掉,Ubuntu我没找到办法去关闭自启动方法,因而就暴力删除了加个参数--purge。
还有种老镜像把rc.local的脚本删掉便可。
 
测试结果:

1. 是否可以正常启动,重启,读写数据。

2.虚机全部信息保持与原虚机一致,包括登陆密码。

3.网络可达东西南北流量正常,浮动ip能够访问。

 
总结:由于是第一次作这样的跨平台迁移,因此实施的过程其实有很多能够改进的地方。
1.configdrive的问题
当初考虑关闭的缘由是,并不知道能够拿到全部用户虚机密码。
若是知道,那就简单了,直接在新建虚机的时候,用userdata传密码进去就好了,这样省去了开关configdrive
以及修改cloudinit服务,风险会少不少。
二、scp传输会致使断点重传
这个可使用rsync同步工具去传,支持断点续传。
3.部分虚机没有关机传输数据,致使了部分虚机文件系统没法正常启动。
 
附录
#分几个脚本的缘由是,一部分工做在白天一部分在晚上进行。
1.传输虚机数据
#!/bin/bash
#1:vm uuid
#2:dest host
#copy instance file to remote host
set-e
if[ $# -ne 2 ];then 
    echo "please inpute two parment 1:uuid and 2:dest hostip"
    exit
fi
source openrc-zmg.sh
echo vm-uuid:$1
echo remotehostip: $2
status=`nova show $1|grep "^| status"|cut -f 3-d "|"|sed 's/ //g'` 
if["$status"="ACTIVE"];then    
    echo "please use [nova stop uuid] to shutoff the vm"
    exit
fi
nova show $1
sourcehost=`nova show $1|grep "OS-EXT-SRV-ATTR:host"|cut -f 3-d "|"`
echo sourcehost:$sourcehost
diskfile=/var/lib/nova/instances/$1
echo $diskfile
#ssh $sourcehost  "sshpass -p qwe123 scp -r /var/lib/nova/instances/$1 $2:/tmp"
#echo diskfile copy complete
#sleep 5
#ls
#ssh  $sourcehost qemu-img info /var/lib/nova/instances/"$1"/disk|grep backing|cut  -d : -f 2|tr -d '\r'|xargs -i cp -r {}  /tmp     
#sleep 5
expect <<!  
set timeout -1
spawn ssh $sourcehost
expect "root@node"
send "sshpass -p qwe123  rsync  -arv --progress  /var/lib/nova/instances/$1 $2:/var/lib/nova/instances/tmp\r"
expect "~]#"
send "qemu-img info /var/lib/nova/instances/$1/disk|grep  back|cut -d : -f 2|xargs -i sshpass -p qwe123 scp  {} $2:/var/lib/nova/instances/tmp/$1\r"    
expect "~]#"
send "echo copy competed!\r"
expect eof
!

 

2.根据execl信息,批量建立
xargs -n7  ./create-vm.sh <test
create-vm.sh
#!/bin/bash
set-e
if[ $# -ne 7 ];then
    echo -e "please input parament\n1:<instance-name>\n2:<image-uuid>\n3:<flavor-id>\n4:<net-uuid>\n5:<fixed-ip>\n6:<security-groups_id>\n7:hostname"
    exit
fi
nova boot  "$1"--image $2 --flavor $3 --nic net-id=$4,v4-fixed-ip=$5  --security-groups $6 --availability-zone nova:$7
sleep  30
uuid=`nova show "$1"|grep "^| id"|cut -f 3-d "|"`  
nova show "$1"
 
3替换数据
#!/bin/bash
set-e
if[ $# -ne 2 ];then
    echo "please inpute two parment 1:new vm uuid and 2:old vm uuid"
    exit
fi
status=`nova show $1|grep "^| status"|cut -f 3-d "|"|sed 's/ //g'`
echo $status
if["$status"="ACTIVE"];then
    echo "please use [nova stop uuid] to shutoff the vm"
    exit
fi
source admin-tenant.sh
nova show $1
host=`nova show $1|grep "OS-EXT-SRV-ATTR:host"|cut -f 3-d "|"`
echo "=====VM is at:$host=============="
ssh $host mv /var/lib/nova/instances/tmp/$2/disk  /var/lib/nova/instances/$1/
echo "========mv disk compelted===="
sleep 3
echo "=====check the disk time for change======== "
ssh $host ls -al /var/lib/nova/instances/$1/disk
echo "disk change ok!"
sleep 10
nova start $1
echo "========start vm==wait 30s======"
nova show $1
sleep 30
echo "=======create 0M disk.config======="
ssh $host qemu-img create /var/lib/nova/instances/$1/disk.config 0M;
ssh $host chown nova:nova /var/lib/nova/instances/$1/disk.config;
echo "======check disk.config owner====== "
ssh $host ls -al /var/lib/nova/instances/$1/disk.config
相关文章
相关标签/搜索