虚机的迁移主要分为一下三个阶段:
预迁移 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 = None
pre_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