• 跨平台(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 需要很原来的虚拟机名称保持一致

    2image-uuid,已经在K版环境上传了I版镜像,可以直接使用:

    有些镜像无法使用,创建这些镜像的虚拟机时,请用任意其他镜像代替

    3)flavor,选择和以前的flavor内容一致的模板

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

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

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

    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服务,风险会少很多。
    2、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 '
    '|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
    "
    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
    "    
    expect "~]#"
    send "echo copy competed!
    "
    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
    1:<instance-name>
    2:<image-uuid>
    3:<flavor-id>
    4:<net-uuid>
    5:<fixed-ip>
    6:<security-groups_id>
    7: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
  • 相关阅读:
    Vue2.0权限树组件
    request.getParameter()获取不到数据的问题
    Spring framework体系架构
    iframe高度自适应的6个方法
    javascript 实现双指放大缩小旋转图片
    php curl请求返回NULL解决方法
    微信小程序判断手机有没有定位的方法
    微信小程序data-dd="{{dd}}"失效的解决方法
    PHP 网页编码问题
    pip install psd-tools安装失败方法
  • 原文地址:https://www.cnblogs.com/zhoumingang/p/5525598.html
Copyright © 2020-2023  润新知