某云跨平台(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版环境中

首先你得查到虚机的计算节点,然后才知道怎么去找数据。

[[email protected]~]# 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;本地虚机新老虚机如果镜像不一样需要才做这一步。

[[email protected]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
[[email protected]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

注意:

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

2)image-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 ‘\r‘|xargs -i cp -r {}  /tmp
#sleep 5
expect <<!
set timeout -1
spawn ssh $sourcehost
expect "[email protected]"
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
时间: 2024-10-10 06:07:10

某云跨平台(I版到K版)迁移实践总结的相关文章

服务器安全运维:安全狗服云手机android端V2·2版正式上线

安全狗服云旗下基于云计算技术,于2014年初打造的云时代下最好的服务器安全运维云平台,其用"云安全,新运维"的思路为用户提供服务器安全所需的一切服务. 安全狗服云继7月9号服云web端V3.4(企业服务)版上线后,7月10号,服云android端V2·2版也正式上线.同web端V3.4一样,android端V2·2主要也是对企业服务功能模块进行全面的完善和升级,意在为企业用户带来更高效更便捷的安全服务.建议升级使用,地址:http://fuyun.safedog.cn/client.h

【C/C++学院】(29)网络编程--实现跨平台传输文件(TCP版)

网络编程--实现跨平台传输文件(TCP版)源码下载地址 为了实现跨平台,需要对跨平台的代码进行条件编译. gcc的-D选项. 连接选项 -lWs2_32 代表要用Ws2_32.lib这个库 gcc编译选项,-D 代表定义一个宏,等同于在c语言当中定义 #defind WIN 在windows下,使用socket之前,必须使用WSAStartup初始化socket,程序运行结束以后必须调用WSACleanup释放相关资源 windown下,关闭socket使用closesocket函数 //mak

阿里云-ONS-Help:消息队列 RocketMQ 版

ylbtech-阿里云-ONS-Help:消息队列 RocketMQ 版 1.返回顶部 1. 消息队列 RocketMQ 版 查看产品> 消息队列RocketMQ版是阿里云基于Apache RocketMQ构建的低延迟.高并发.高可用.高可靠的分布式消息中间件. 产品更新 常见问题 立即购买 学习路径 由浅入深,带您玩转消息队列RocketMQ版! 了解 消息队列RocketMQ版简介 产品简介 名词解释 适用场景 产品架构 产品定价 计费概述 资源包说明 欠费说明 成本对比 上手 快速入门 主

微软发布 Windows Server 2016 预览版第三版,开发者要重点关注Nano Server

微软已经发布 Windows Server 2016 和 System Center 2016 第三个技术预览版,已经提供下载.Windows Server 2016 技术预览版第三版也是首个包括了容器技术的支持的版本,也提供了 Nano Server 和数据中心增强的功能. Windows Server 容器是微软和 Docker 合作的,开发者可以通过隔离操作系统环境的方式来运行应用.Windows Server 容器是 Docker 开源计划的一部分,容器可以通过 PowerShell 或

微博URL短网址生成算法原理及(java版、php版实现实例)

短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接. 例如:http://t.cn/SzjPjA 短网址服务,可能很多朋友都已经不再陌生,现在大部分微博.手机邮件提醒等地方已经有很多应用模式了,并占据了一定的市场.估计很多朋友现在也正在使用. 看过新浪的短连接服务,发现后面主要有6个字符串组成,于是第一个

alpha版、beta版、rc版

很多软件在正式发布前都会发布一些预览版或者测试版,一般都叫“beta版”或者 “rc版”,特别是开源软件,甚至有“alpha版”,下面来解释一下各个版本的意思. alpha版:内部测试版.α是希腊字母的第一个,表示最早的版本,一般用户不要下载这个版本,这个版本包含很多BUG,功能也不全,主要是给开发人员和 测试人员测试和找BUG用的. beta版:公开测试版.β是希腊字母的第二个,顾名思义,这个版本比alpha版发布得晚一些,主要是给“部落”用户和忠实用户测试用的,该版本任然存 在很多BUG,但

(转)金蝶KIS迷你版、标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司联系”

金蝶KIS迷你版.标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司联系” 2013-07-10 12:17:51|  分类: 金蝶专题|举报|字号 订阅 金蝶KIS迷你版.标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司的技术支持机构联系” 问题描述:厦门金蝶KIS迷你版.标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司的技术支持机构联系”.但是选择“确定”后仍然可以查询到数据.问题原因: GLQty

PHP框架Yii2.0安装(基础版、高级版)

最近农成也是切入了yiiframework 2.0,就是安装yii2.0就花费了不少的时间,为此做了很多的弯路,特此写一篇博文来给后面学习的同学少走一点的弯路.写的不好的地方欢迎各位学习的同学们能够指点出来. yii2.0的安装,官方提供了两种的安装办法,一种是通过composer来安装,另外一种是通过跟yii1.0的办法直接下载安装包来安装.至于对于第一种composer的安装,农成就不做多余的说明了,这里有很好的安装教程.点击进去就可以看到了,为此农成就不在说了,下面就给大家详细讲讲第二种通

使用VNET-to-VNET连接Microsoft Azure国际版和中国版

Microsoft Azure的VNET-to-VNET功能可以实现跨虚拟网络的VPN连接,通过VNET-to-VNET互联的两个虚拟网络可以在同一个订阅下或者隶属不同的订阅,而且可以跨数据中心.这实质上就是:VNET-to-VNET可以连接Microsoft Azure平台上的任意两个虚拟网络. VNET-to-VNET连接是要经过VPN Gateway的,VPN Gateway有固定的公网IP地址,既然这样,理论上VNET-to-VNET是可以连接Microsoft Azure国际版和中国版