分享

OpenStack Mitaka热迁移分析(一)

本帖最后由 hunter33434 于 2016-8-26 10:34 编辑

问题导读
1.热迁移是什么,它的过程是怎么样的?
2.热迁移和冷迁移的区别?
3.现阶段热迁移的问题(BUG)?
4.热迁移之后会怎么优化?

前言:
OpenStack中的迁移分为冷迁移和热迁移,是由OpenStack中的nova服务实现的。冷迁移和热迁移最大的区别是在迁移过程中vm state的不同。
冷迁移很简单,直接使用命令 nova migrate  <vm_id> <host_name>,然后nova会去调用
libvirt中 cold migrate的接口进行迁移。本文重点是讲热迁移,冷迁移这边先一笔带过。

迁移详解
1.热迁移分为两种,一种是有共享存储的迁移,一种是没有共享存储的块迁移。
命令行很简单:
1.png
在迁移云主机过程中,云主机有三种存储类型,即本地根磁盘、卷(云硬盘)、共享磁盘,两种方式的热迁移对其支持程度如下表:
2.png

2.接下去是对热迁移process的分析:
a.第一步肯定是pre-migration,即通过scheduler调度器,将A上的VM要进行迁移的信息告诉node    B,B会开始一些准备工作(准备创建磁盘等)。
3.png
b.Reservation阶段,可以理解成先是在B上确定是否有资源来启动和VM A相同配置的虚拟机,并预留这个虚拟机。
4.png
c.Iterative pre-copy 阶段,即开始拷贝阶段,先将磁盘信息进行copy,然后将内存以及脏页进行copy
5.png
d.Stop and copy阶段,这里尤其要注意,两台VM都会被suspend,会将剩余的pages和CPU状态进行copy。从这里我们其实可以知道,在热迁移的过程中,VM不会完全都在运行状态,它会有短暂的暂停时间(注意并不是关机),在实际的线上环境中,这么一点时间是可以接受的.
这里补充一点: 虚拟机迁移方案中的实时迁移是用一个precopy算法去迭代拷贝,在每次拷贝的过程中用内部记录的方式记录内存“脏”页,当“脏”张页数据集小于一定程度时,比如4K的时候,停止虚拟机,把内容和寄存器迁移,由于需要停机拷贝的内容非常少,因此停机的时间非常短,不过实时迁移一般是相同体系的CPU才能相互迁移。
6.png
e.Commitment 完成阶段,VM A在node B中启动。
7.png

3.上面对热迁移的过程进行了比较系统的解释,但这些都是理论上的情况,在实际生产环境中,迁移遇到的问题可以说数不胜数。
  a.比如在迁移过程中,在没有共享存储的情况下网络带宽会达到一个很高的值,如果迁移的网络上还跑着其他服务(比如每个组件的api),整个服务的性能都会被拉下来。
因此如果迁移在实际应用中会比较的频繁,我还是建议单独拿出一条网络给迁移用。
8.png
nova也已经可以用上了新参数  live_migration_inbound_addr
这样会对整个云平台性能有比较好的提升,不会到时候出现多台VM迁移将整个资源环境给弄崩的情况。
解决方法很多,在不改变物理环境的情况下比较推荐限制带宽,可以在nova.conf文件中进行设定:
nova.conf settings
live_migration_bandwidth = <speed (MiB/s)>

也可以用libvirt命令设定
virsh migrate-setspeed <domain> <speed (MiB/s)>

b.其实从上面的图可以分析出来在迁移过程中其实是有问题的:在磁盘拷贝的过程中,原来的云主机中内存依然在往磁盘进行读写,虽然内存是最后进行拷贝的,但若是物理环境一般,迁移时间过长将导致一些数据的丢失,测试和开发等内部环境影响不会很大,若是给外部客户使用,建议迁移最好在用户访问比较少的时段进行。

c.这是最近才遇到的问题,就是两台物理服务器之间的CPU型号不同,导致迁移过去的云主机会起不起来,这个问题我暂时还没有办法解决,其他的比如内存型号不同会怎么样也还需要进行验证,在这里给大家提个醒,主要还是io和网络的性能对迁移的成功率影响比较大。

d.若使用共享存储且使用ceph来做存储后端的话,需要时刻关注io存储的变化,大量虚拟机迁移很容易导致io瓶颈,之前某做openstack公司就是因为ceph的原因导致1000多台物理服务器全部down掉,并且告警时间晚了整整十分钟。


热迁移改进
针对上面的某些缺点,libvirt对之后的迁移正在进行某些方面的改进。比如:
9.png
从图中我们可以看到,在post-copy的过程中,原宿主机上的虚拟机暂停了,而目标宿主机内的虚拟机会处于运行状态,这样就有效缓解了在copy磁盘过程中内存数据丢失的概率,因为在这里,内存数据会直接写入目标宿主机的VM内。

结束
最后推荐大家几个比较实用的命令:
nova live-migration <server> [<host>] --check  这个命令是检测可调度范围内的目标宿主机

nova server-migration-list <server>
nova server-migration-show <server> <migration id> 查看虚拟机迁移列表

nova live-migration-abort <server> <migration id> 取消迁移任务

nova live-migration-force-complete <server> <migration id> 强制完成迁移(会自动取消暂停的状态)

之后会和大家继续探讨热迁移在nova-libvirt的调用过程以及libvirt实现热迁移的代码分析。
若大家对LM有其他想了解的可以随时来问。














已有(7)人评论

跳转到指定楼层
yamol_爱撕布 发表于 2016-8-25 15:50:44
很有收获  O(∩_∩)O谢谢楼主
回复

使用道具 举报

doscho 发表于 2016-8-26 11:22:22
学习了,收获很大,谢谢!
理论+实践,将遇到的问题,分享出来,最宝贵。
回复

使用道具 举报

hunter33434 发表于 2016-8-26 11:29:54
doscho 发表于 2016-8-26 11:22
学习了,收获很大,谢谢!
理论+实践,将遇到的问题,分享出来,最宝贵。

恩 谢谢  一起进步!
回复

使用道具 举报

hunter33434 发表于 2016-8-26 11:30:37
yamol_爱撕布 发表于 2016-8-25 15:50
很有收获  O(∩_∩)O谢谢楼主

谢谢支持~
回复

使用道具 举报

芸芸众生 发表于 2018-1-5 10:19:52
虚拟机热迁移,怎么获取内存快照。我读的文献,内存快照的获取是基于一种热迁移机制。实在是走投无路,想问问你。神,请您稍稍指点下呗。
回复

使用道具 举报

hunter33434 发表于 2018-4-4 11:39:33
芸芸众生 发表于 2018-1-5 10:19
虚拟机热迁移,怎么获取内存快照。我读的文献,内存快照的获取是基于一种热迁移机制。实在是走投无路,想问 ...

原理是qemu里面实现的,你可以看一下libvirt的managedsave接口
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条