虚机的迁移主要分为一下三个阶段:
预迁移 pre_live_migration
迁移 live_migration
迁移后 post_live_migration。
另外,迁移失败后,有rollback操作
1,迁移接口
迁移一个虚机会通过消息队列,最终调用到compute服务中的live_migration接口
def live_migration(self, context, dest, instance,block_migration=False, migrate_data=None):migrate_data = dict(migrate_data or {})try:if block_migration:disk = self.driver.get_instance_disk_info(instance['name'])else:disk = Nonepre_migration_data = self.compute_rpcapi.pre_live_migration(context, instance,block_migration, disk, dest, migrate_data)migrate_data['pre_live_migration_result'] = pre_migration_data# 以上是预迁移阶段,获取虚机的迁移信息,即告知目标主机做好迁移准备,并返回相关数据except Exception:with excutils.save_and_reraise_exception():LOG.exception(_('Pre live migration failed at %s'),dest, instance=instance)self._rollback_live_migration(context, instance, dest,block_migration, migrate_data)#否则就回滚刚才的操作,同样也是通知目标主机此次迁移失败,销毁相关数据self.driver.live_migration(context, instance, dest,self._post_live_migration,self._rollback_live_migration,block_migration, migrate_data)# 执行迁移动作,同时传递了两个方法:# _post_live_migration 迁移成功后,应该执行的操作# _rollback_live_migration 迁移失败后,回滚操作
2,pre_live_migration
(注,这个是在目标主机上的操作)def pre_live_migration(self, context, instance,block_migration=False, disk=None,migrate_data=None):block_device_info = self._get_instance_volume_block_device_info(context, instance, refresh_conn_info=True)#查看虚机的块设备network_info = self._get_instance_nw_info(context, instance) #获取虚机的网络信息pre_live_migration_data = self.driver.pre_live_migration(context,instance,block_device_info,network_info,disk,migrate_data)#执行预迁移的一些操作self