背景
某项目,现有控制节点*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详解

5994

被折叠的 条评论
为什么被折叠?



