早前,我们大众点评网的业务应用是windows+.net语言的开发平台,大部分业务都是在一个工程下进行开发,打包上线直接就是一个大的压缩包,业务部署在多台物理机器上。随着前两年.net开发平台迁移到linux+java开发平台,很多业务应用不再像.net那样是一个大的数据包上线,大多数业务都开始拆分出来,很多机器的资源出现利用率不高的情况,于是业务应用基本上迁移到虚拟机集群上,只有部分资源占用比较多的业务还在使用物理机器,比如搜索,离线数据处理,hadoop集群,数据库等。
由于前期基于稳定性和维护成本考虑,我们大众点评网使用的是VMWare esx4虚拟化解决方案,后期在虚拟机上部署业务应用也就延续使用了。由于公司内部的一些调整以及相关部署成本的考虑,运维人员的技术素养也足矣让我们重新考虑对VMWare虚拟化方案进行迁移,我们对生产环境业务的虚拟机化方案重新进行评估测试和全站业务迁移,参考了xen,kvm等虚拟化方案,最后确定下使用kvm方案,而且前期我们也在部分机器集群上应用了kvm虚拟化方案,并在运维相关同事的帮助下对网络以及磁盘io进行了优化配置。
整个VMWare esx迁移到linux KVM 过程系统运维张晋同学(目前已就职新公司)主要负责kvm虚拟化的测试和调整,作为偏向于业务方面的运维人员,我主要负责了解KVM虚拟化测试和调整过程以及实施整个迁移过程。
一个月的时间,我们完全将线上的虚拟化方案从VMWare esx 迁移到了Linux KVM,迁移过程发现了Centos Linux 6.0 系统内核的问题,顺带着也将系统内核进行了升级。我们公司整个业务相关操作系统使用的是Cento OS Linux,目前使用的是 Centos Linux 6.3 版本,内核版本会根据系统需要进行升级。
下面开始讲下整个迁移过程以及相关脚本,由于整个迁移过程主要时间耗费在数据的导出与备份,迁移过程还是蛮快的。
迁移分为两类,动态迁移(无需关机)和静态迁移(需要关机),我们整个迁移过程使用的是动态迁移方式。
整个迁移过程分为两个部分:我们迁移过程,关机是为了在保证IP不变的基础上重装系统进行迁移,如果直接迁移到新的宿主机器上只需要在迁移时修改IP相关信息,不需要关闭虚拟机和宿主机的。
1.针对符合运维规范的业务,(业务应用名称-----主机名-----业务部署方式------java容器使用的是jboss,目前已经替换为tomcat),迁移过程IP信息不会改变
下线应用(从负载均衡摘除)----备份数据------删除相关证书信息-----虚拟机关机----当宿主机上所有物理机执行完以上步骤,开始重装物理机操作系统,安装定制好的Linux KVM 物理机操作系统镜像----创建KVM虚拟机(IP信息会改变),并配置相关主机信息----恢复数据----通过puppet推送应用相关数据-----自检---上线应用
2.针对一些特殊应用,无法通过备份业务应用数据恢复的方式,我们使用VMWare esx4的备份工具vcbMounter(esxi5,可直接用vsphere 图形操作 ) 导出磁盘镜像,然后通过qemu-img convert转换磁盘镜像格式,直接在Linux KVM机器上启动。迁移过程也是可以保证IP信息保持不变的。
要备份虚拟机磁盘镜像文件,需要在安装vmware tools并且保持虚拟机开机的情况下进行操作。
安装vmware-tools-distrib:
cd /media/VMware Tools
cp VMwareTools.tar.gz /data
tar xzvf VMwareTools.tar.gz
cd vmware-tools-distrib
./vmware-install.pl
相关脚本:删除路由信息是考虑到迁移过程有些机器IP会
#!/bin/bash scp /data/vmware.tar.gz $1:/root ssh $1 "tar -zxvpf /root/vmware.tar.gz -C /root" ssh $1 "/usr/bin/yes | /usr/bin/tr '\y' '\n' | /usr/bin/perl /root/vmware-tools-distrib/vmware-install.pl" ssh $1 "rm -rf /etc/udev/rules.d/70-persistent-net.rules" (mac地址更新后需要删除,否则会找不到网卡) ssh $1 "sed -i -e '/HWADDR/d' /etc/sysconfig/network-scripts/ifcfg-eth0" ssh $1 "sed -i -e '/route/d' /etc/rc.d/rc.local" ssh $1 "sed -i -e '/route/d' /etc/rc.local" ssh $1 "echo 'qunying.liu@dianping' | passwd --stdin root" ssh $1 "wget -P /root http://dataserver/cblr/ks_mirror/CentOS60-x86_64/ipsetup(ip设置脚本)" ssh $1 "echo '/etc/init.d/network restart 1>/dev/null && sh /etc/rc.d/rc.local' >> /root/ipsetup"
ssh 10.1.x.x(vmware宿主机)
挂载远程备份目录:
mkdir /vmfs/volumes/datastore1/vmbak(创建备份目录)
/etc/init.d/iptables stop (关闭系统iptables,否则会挂载远程目录失败)
mount -t cifs -o username=qunying.liu,password='hehe' //fileserver/vmdisk /vmfs/volumes/datastore1/vmbak
借助vmware tools工具导出vmware虚拟机磁盘镜像文件:
vcbMounter -h 10.1.x.x(宿主机) -u root -p ‘宿主机密码qunying.liu’' -a ipaddr:虚拟机IP -M 1 -r /vmfs/volumes/datastore1/vmbak/虚拟机目录
在Linux文件服务器下
cd /data/vmdisk/虚拟机目录
qemu-img convert -O qcow2 export-out.vmdk kvm-qunying.liu.img (转换vmware磁盘文件vmdk到 qcow2 格式,以便kvm可以识别)
scp kvm-qunying.liu.img 宿主机IP:/data
宿主机操作系统重装完毕后,恢复虚拟机
virsh destroy 新虚拟机名称 ;rm -f /data/vmdisk/新虚拟机.img ;mv 转换的虚拟机文件 /data/vmdisk/;virsh start 转换后的虚拟机
相比较而言,第一部分由于迁移的数据主要是业务数据与应用以及系统相关的配置文件,数据量不多备份恢复速度是很快的,时间主要消耗在系统重装过程。第二部分迁移过程属于完全备份和转换虚拟机磁盘镜像,如果不需要保证IP信息不变,操作系统可以提前安装好,我们这里要求保证IP信息不变,那就需要转换备份完磁盘镜像文件(VMDK格式到RAW格式)后就可以重装系统,重装完系统后再恢复磁盘镜像文件。
静态迁移方式:需要关闭待迁移的虚拟机,当然宿主机是不能关机的,不支持快照迁移,只支持RHEL和windows虚拟机迁移。
从 RHEL6(RedHat Enterprise Linux 6)开始,RHEL 发行版中包含了Red Hat 公司开发的 virt-v2v工具。它是由 perl语言编写的脚本,可以自动化的将创建在 Xen,KVM 和VMware ESX 上的虚拟机拷贝到 virt-v2v的主机,并且自动的更改配置,使之能够被 libvirt进行管理。目前,virt-v2v 支持静态迁移下列虚拟机:RHEL4、RHEL5, RHEL6,WindowsXP,WindowsVista, Windows 7, Windows Server 2003 和Windows Server 2008。
virt-v2v -ic esx://宿主机ip/?no_verify=1 -os migration -of qcow2 --bridge br0 RHEL5.5
-os migration: 迁移虚拟机的镜像文件到主机上的存储池
-of qcow2: 转换迁移后虚拟机的文件格式
--bridge br0: 设置迁移后虚拟机的网络映射到网桥 br0
RHEL5.5:VmwareESXi上虚拟机的名字,迁移后保持名字一致
之前在网上也看到过有关静态迁移的一些实践文章,感兴趣的小伙伴可以查看:
http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm3/
http://koumm.blog.51cto.com/703525/1304461