OpenStack上的虚拟机迁移

背景

某项目,现有控制节点*1(controller),计算节点*4(compute1-compute4)。
现在,因为业务调整,需要撤出compute1、compute2。
原有在这两个节点上的虚拟机需要迁移到compute3、compute4上。
其中,compute1、compute2为同型号主机,compute3、compute4为同型号主机。

相关知识

在Openstack中,迁移主要分为2种方式:冷迁移热迁移

冷迁移(cold migration),也叫静态迁移。关闭电源的虚拟机进行迁移。通过冷迁移,可以选择将关联的磁盘从一个数据存储移动到另一个数据存储。
热迁移(Live Migration),又叫动态迁移、实时迁移,即虚拟机保存/恢复,通常是将整个虚拟机的运行状态完整保存下来,同时可以快速的恢复到原有硬件平台甚至是不同硬件平台上。恢复以后,虚拟机仍旧平滑运行,用户不会察觉到任何差异。

冷迁移热迁移
优点虚拟机不需要位于共享存储器上,数据丢失率小。软件和硬件系统的维护升级,不会影响用户的关键服务,提高了服务的高可用性和 用户的满意度。
缺点需要关闭电源,业务中断。过程不可中断,操作复杂。

热迁移的操作方式

对于热迁移,OpenStack提供了命令行接口,看起来操作很简单.

$ openstack server migrate [--live hostname] serverId

例如,我们想把vm1迁移到compute3节点上,就可以执行:

$ openstack server migrate --live compute3 vm1

但是限制条件比较多,如要求迁移前后的cpu特性一致。

冷迁移的操作方式

冷迁移有很多种方式:

  • 命令行接口
    也是上面的openstack server migrate命令,不加–live就可以了。缺点是,无法制定迁移到哪台主机。
    类似的,还有通过Horizon界面选择迁移功能。

  • 快照迁移
    先为虚拟机创建快照,然后通过快照创建虚拟机。

  • 实例(虚拟机)文件迁移
    拷贝实例文件到相应的计算节点,手工修改修改nova.instances中的host和node属性为迁移后的计算节点名称。
    其中,实例文件存放在计算节点的/var/lib/glance/images/目录下,镜像缓存在/var/lib/glance/cache/目录下。
    实际上,这两个路径都是可以配置的,相关配置信息在/etc/glance/glance-api.conf中

image_cache_dir = /var/lib/glance/cache/

[glance_store]
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
stores = file,http,cinder

具体操作

考虑到负载平衡,将原来在compute1上的虚拟机迁移到compute3上,将原来在compute2上的虚拟机迁移到compute4上。
compute1 --> compute3
compute2 --> compute4

先尝试使用热迁移的方式

# openstack server migrate --live compute3 97250af5-cb38-4d87-aaf0-c2d3faf1a74c
Unacceptable CPU info: CPU doesn't have compatibility.

0

Refer to http://libvirt.org/html/libvirt-libvirt-host.html#virCPUCompareResult (HTTP 400) (Request-ID: req-5bbcdc16-4d99-40a1-9e24-e9badff8ed7d)

可见,目标主机CPU缺少特性compatibility,无法直接使用热迁移。

使用冷迁移方式中的文件迁移方式

以实例6f5dd222-f231-46b1-bb4c-942ac5dc3faf迁移到计算节点compute3为例。

迁移文件的两种方法:

1. 打包实例文件

原计算节点
压缩文件并发送

# tar -czvf 6f5dd222-f231-46b1-bb4c-942ac5dc3faf.tar.gz 6f5dd222-f231-46b1-bb4c-942ac5dc3faf
# sz 6f5dd222-f231-46b1-bb4c-942ac5dc3faf.tar.gz

目标计算节点
接收文件并解压

# rz
# tar -xzvf 6f5dd222-f231-46b1-bb4c-942ac5dc3faf.tar.gz
2. 使用scp传输文件
# scp -r 6f5dd222-f231-46b1-bb4c-942ac5dc3faf root@192.168.22.5:/var/lib/nova/instances

其中,-r表示传输文件夹,192.168.22.5为compute3的ip地址
这里需要输入root@192.168.22.5的密码。如果不知道密码,可以先使用别的用户传过去,然后再使用chown修改文件的用户和用户组信息。

# chown nova:nova 6f5dd222-f231-46b1-bb4c-942ac5dc3faf
# chown root:root 6f5dd222-f231-46b1-bb4c-942ac5dc3faf/console.log
# chown root:root 6f5dd222-f231-46b1-bb4c-942ac5dc3faf/disk
# chown nova:nova 6f5dd222-f231-46b1-bb4c-942ac5dc3faf/disk.info

修改数据库信息

# mysql
> use nova;
> select  host, node from instances where uuid='6f5dd222-f231-46b1-bb4c-942ac5dc3faf';
> update instances set host='compute3', node='compute3' where uuid='6f5dd222-f231-46b1-bb4c-942ac5dc3faf';

验证

进入horizon,查看实例的信息(其实用命令行也能看,悲催的是,我们的实例是中文名,显示不出来)。
可以看到,计算节点已经变成了compute3。
启动虚拟机,虚拟机进入运行状态。

小插曲

其中一台虚拟机cf703bde-1d09-4ead-93a4-c7f0124b0e50在迁移后无法正常启动,查看日志:

2019-09-24 14:28:01.380 6648 INFO nova.compute.manager [req-0146123d-f288-4333-b86c-a0420702ffa7 8d4ec297ebd74270816f3b625bb79e62 076ed0a80d0a421b842fcedfeb9488b0 - default default] [instance: cf703bde-1d09-4ead-93a4-c7f0124b0e50] Successfully reverted task state from powering-on on failure for instance.
2019-09-24 14:28:01.449 6648 ERROR oslo_messaging.rpc.server [req-0146123d-f288-4333-b86c-a0420702ffa7 8d4ec297ebd74270816f3b625bb79e62 076ed0a80d0a421b842fcedfeb9488b0 - default default] Exception during message handling: ImageUnacceptable: Image 2c48a7f5-9914-4c8a-a6f9-58a0d739555e is unacceptable: Image has no associated data

显示没有找到镜像,然后尝试下载镜像

# openstack image save 2c48a7f5-9914-4c8a-a6f9-58a0d739555e

提示无法下载镜像。难道镜像丢了?但是在compute2上,这个虚拟机运行的很正常啊。为什么在compute4节点上就不行了呢?
在horizon上尝试用这个镜像创建虚拟机多台虚拟机,发现分配在compute2上的可以正常创建,分配在其他节点上都都会报上面的错。
翻了下Cloudman对nova启动虚拟机的介绍:
nova-compute部署instance详解
其中提到:

nova-compute 首先会检查 image 是否已经下载(比如之前已经创建过基于相同 image 的 instance)。如果没有,就从 Glance 下载 image 到本地。
由此可知,如果计算节点上要运行多个相同 image 的 instance,只会在启动第一个 instance 的时候从 Glance 下载 image,后面的 instance 启动速度就大大加快了。

可以猜想到,在compute2上,存在着这个镜像的快照;compute4上没有这个快照,而从glance上下载image到本地时又出错了。
如果从compute2上拷贝了一份镜像缓存到compute4,是否可以让虚拟机成功启动呢?

文中又提到:

image 的存放目录是 /opt/stack/data/nova/instances/_base,这是由 /etc/nova/nova.conf 的下面两个配置选项决定的。

instances_path = /opt/stack/data/nova/instances
base_dir_name = _base

在compute2上,在/var/lib/nova/instances/cf703bde-1d09-4ead-93a4-c7f0124b0e50/下,执行

# qemu-img info disk

找到虚拟机依赖的镜像缓存d753c9d684891bdf01feff168a56ce1c0956b385
执行

# scp /var/lib/nova/instances/_base/d753c9d684891bdf01feff168a56ce1c0956b385 root@192.168.22.6:/var/lib/nova/instances/_base/

其中, 192.168.22.6为compute4的ip。
在compute4上执行:

# chown libvirt-qemu:kvm /var/lib/nova/instances/_base/d753c9d684891bdf01feff168a56ce1c0956b385

再次尝试启动这个虚拟机,启动成功。

参考

OpenStack虚拟机冷迁移与热迁移
openstack手动迁移实例
OpenStack Docs: Compute下的:
live migration usage
migration
migrate instance with snapshot
CloudMan:nova-compute部署instance详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值