亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

OpenStack之虛機熱遷移的代碼詳細解析

2024-09-01 13:49:04
字體:
來源:轉載
供稿:網友

話說虛機遷移分為冷遷移以及熱遷移,所謂熱遷移用度娘的話說即是:熱遷移(Live Migration,又叫動態遷移、實時遷移),即虛機保存/恢復(Save/Restore):將整個虛擬機的運行狀態完整保存下來,同時可以快速的恢復到原有硬件平臺甚至是不同硬件平臺上?;謴鸵院?,虛機仍舊平滑運行,用戶不會察覺到任何差異。OpenStack的虛機遷移是基于Libvirt實現的,下面來看看Openstack虛機熱遷移的具體代碼實現。

首先,由API入口進入到nova/api/openstack/compute/contrib/admin_actions.py

@wsgi.action('os-migrateLive')  def _migrate_live(self, req, id, body):    """Permit admins to (live) migrate a server to a new host."""    context = req.environ["nova.context"]    authorize(context, 'migrateLive')    try:      block_migration = body["os-migrateLive"]["block_migration"]      disk_over_commit = body["os-migrateLive"]["disk_over_commit"]      host = body["os-migrateLive"]["host"]    except (TypeError, KeyError):      msg = _("host, block_migration and disk_over_commit must "          "be specified for live migration.")      raise exc.HTTPBadRequest(explanation=msg)    try:      block_migration = strutils.bool_from_string(block_migration,                            strict=True)      disk_over_commit = strutils.bool_from_string(disk_over_commit,                             strict=True)    except ValueError as err:      raise exc.HTTPBadRequest(explanation=str(err))    try:      instance = self.compute_api.get(context, id, want_objects=True)      self.compute_api.live_migrate(context, instance, block_migration,                     disk_over_commit, host)    except (exception.ComputeServiceUnavailable,        exception.InvalidHypervisorType,        exception.UnableToMigrateToSelf,        exception.DestinationHypervisorTooOld,        exception.NoValidHost,        exception.InvalidLocalStorage,        exception.InvalidSharedStorage,        exception.MigrationPreCheckError) as ex:      raise exc.HTTPBadRequest(explanation=ex.format_message())    except exception.InstanceNotFound as e:      raise exc.HTTPNotFound(explanation=e.format_message())    except exception.InstanceInvalidState as state_error:      common.raise_http_conflict_for_instance_invalid_state(state_error,          'os-migrateLive')    except Exception:      if host is None:        msg = _("Live migration of instance %s to another host "            "failed") % id      else:        msg = _("Live migration of instance %(id)s to host %(host)s "            "failed") % {'id': id, 'host': host}      LOG.exception(msg)      # Return messages from scheduler      raise exc.HTTPBadRequest(explanation=msg)    return webob.Response(status_int=202)

   這里第一行可以看到是與API文檔的第二行照應的:
  

 {  "os-migrateLive": {    "host": "0443e9a1254044d8b99f35eace132080",    "block_migration": false,    "disk_over_commit": false  }}

好了,源碼中其實執行遷移工作的就是第26、27行的一條語句:

self.compute_api.live_migrate(context, instance, block_migration,                 disk_over_commit, host)

由這句進入到nova/compute/api.py中,源碼如下:

@check_instance_cell  @check_instance_state(vm_state=[vm_states.ACTIVE])  def live_migrate(self, context, instance, block_migration,           disk_over_commit, host_name):    """Migrate a server lively to a new host."""    LOG.debug(_("Going to try to live migrate instance to %s"),         host_name or "another host", instance=instance)    instance.task_state = task_states.MIGRATING    instance.save(expected_task_state=[None])    self.compute_task_api.live_migrate_instance(context, instance,        host_name, block_migration=block_migration,        disk_over_commit=disk_over_commit)

第2行是一個裝飾器,用于在進入API方法之前,檢測虛擬機和/或任務的狀態, 如果實例處于錯誤的狀態,將會引發異常;接下來實時遷移虛機到新的主機,并將虛機狀態置于“migrating”,然后由12行進入nova/conductor/api.py

def live_migrate_instance(self, context, instance, host_name,                block_migration, disk_over_commit):     scheduler_hint = {'host': host_name}     self._manager.migrate_server(       context, instance, scheduler_hint, True, False, None,       block_migration, disk_over_commit, None)

將主機名存入字典scheduler_hint中,然后調用nova/conductor/manager.py方法migrate_server,

def migrate_server(self, context, instance, scheduler_hint, live, rebuild,      flavor, block_migration, disk_over_commit, reservations=None):    if instance and not isinstance(instance, instance_obj.Instance):      # NOTE(danms): Until v2 of the RPC API, we need to tolerate      # old-world instance objects here      attrs = ['metadata', 'system_metadata', 'info_cache',           'security_groups']      instance = instance_obj.Instance._from_db_object(        context, instance_obj.Instance(), instance,        expected_attrs=attrs)    if live and not rebuild and not flavor:      self._live_migrate(context, instance, scheduler_hint,                block_migration, disk_over_commit)    elif not live and not rebuild and flavor:      instance_uuid = instance['uuid']      with compute_utils.EventReporter(context, self.db,                     'cold_migrate', instance_uuid):        self._cold_migrate(context, instance, flavor,                  scheduler_hint['filter_properties'],                  reservations)    else:      raise NotImplementedError()

由于在nova/conductor/api.py中傳過來的參數是

self._manager.migrate_server(       context, instance, scheduler_hint, True, False, None,       block_migration, disk_over_commit, None)

因此live是True,rebuild是Flase,flavor是None,執行第12、13行代碼:

 if live and not rebuild and not flavor:       self._live_migrate(context, instance, scheduler_hint,                block_migration, disk_over_commit)  _live_migrate代碼如下:def _live_migrate(self, context, instance, scheduler_hint,           block_migration, disk_over_commit):    destination = scheduler_hint.get("host")    try:      live_migrate.execute(context, instance, destination,               block_migration, disk_over_commit)    except (exception.NoValidHost,        exception.ComputeServiceUnavailable,        exception.InvalidHypervisorType,        exception.InvalidCPUInfo,        exception.UnableToMigrateToSelf,        exception.DestinationHypervisorTooOld,        exception.InvalidLocalStorage,        exception.InvalidSharedStorage,        exception.HypervisorUnavailable,        exception.MigrationPreCheckError) as ex:      with excutils.save_and_reraise_exception():        #TODO(johngarbutt) - eventually need instance actions here        request_spec = {'instance_properties': {          'uuid': instance['uuid'], },        }        scheduler_utils.set_vm_state_and_notify(context,            'compute_task', 'migrate_server',            dict(vm_state=instance['vm_state'],               task_state=None,               expected_task_state=task_states.MIGRATING,),            ex, request_spec, self.db)    except Exception as ex:      LOG.error(_('Migration of instance %(instance_id)s to host'            ' %(dest)s unexpectedly failed.'),            {'instance_id': instance['uuid'], 'dest': destination},            exc_info=True)      raise exception.MigrationError(reason=ex)

首先,第三行中將主機名賦給destination,然后執行遷移,后面的都是異常的捕捉,執行遷移的代碼分為兩部分,先看第一部分,在nova/conductor/tasks/live_migrate.py的184行左右:

def execute(context, instance, destination,      block_migration, disk_over_commit):  task = LiveMigrationTask(context, instance,               destination,               block_migration,               disk_over_commit)  #TODO(johngarbutt) create a superclass that contains a safe_execute call  return task.execute()

先創建包含安全執行回調的超類,然后返回如下函數也即執行遷移的第二部分代碼,在54行左右:

def execute(self):    self._check_instance_is_running()    self._check_host_is_up(self.source)    if not self.destination:      self.destination = self._find_destination()    else:      self._check_requested_destination()    #TODO(johngarbutt) need to move complexity out of compute manager    return self.compute_rpcapi.live_migration(self.context,        host=self.source,        instance=self.instance,        dest=self.destination,        block_migration=self.block_migration,        migrate_data=self.migrate_data)        #TODO(johngarbutt) disk_over_commit?

這里有三部分內容:

如果目前主機不存在,則由調度算法選取一個目標主機,并且進行相關的檢測,確保能夠進行實時遷移操作;

如果目標主機存在,則直接進行相關的檢測操作,確保能夠進行實時遷移操作;

執行遷移操作。

前兩部分不再贅述,直接看第三部分代碼,在nova/compute/rpcapi.py中:

def live_migration(self, ctxt, instance, dest, block_migration, host,            migrate_data=None):    # NOTE(russellb) Havana compat    version = self._get_compat_version('3.0', '2.0')    instance_p = jsonutils.to_primitive(instance)    cctxt = self.client.prepare(server=host, version=version)    cctxt.cast(ctxt, 'live_migration', instance=instance_p,          dest=dest, block_migration=block_migration,          migrate_data=migrate_data)

熱遷移開始執行:

def live_migration(self, context, instance, dest,            post_method, recover_method, block_migration=False,            migrate_data=None):    """Spawning live_migration operation for distributing high-load.    :param context: security context    :param instance:      nova.db.sqlalchemy.models.Instance object      instance object that is migrated.    :param dest: destination host    :param post_method:      post operation method.      expected nova.compute.manager.post_live_migration.    :param recover_method:      recovery method when any exception occurs.      expected nova.compute.manager.recover_live_migration.    :param block_migration: if true, do block migration.    :param migrate_data: implementation specific params    """    greenthread.spawn(self._live_migration, context, instance, dest,             post_method, recover_method, block_migration,             migrate_data)

這個方法中建立一個綠色線程來運行方法_live_migration,來執行實時遷移; 主要是調用libvirt python接口方法virDomainMigrateToURI,來實現從當前主機遷移domain對象到給定的目標主機;

spawn:建立一個綠色線程來運行方法“func(*args, **kwargs)”,這里就是來運行方法_live_migration;

 _live_migration:執行實時遷移; 主要是調用libvirt python接口方法virDomainMigrateToURI,來實現從當前主機遷移domain對象到給定的目標主機;

接著在綠色線程中調用_live_migration方法:

def _live_migration(self, context, instance, dest, post_method,            recover_method, block_migration=False,            migrate_data=None):    """Do live migration.    :param context: security context    :param instance:      nova.db.sqlalchemy.models.Instance object      instance object that is migrated.    :param dest: destination host    :param post_method:      post operation method.      expected nova.compute.manager.post_live_migration.    :param recover_method:      recovery method when any exception occurs.      expected nova.compute.manager.recover_live_migration.    :param block_migration: if true, do block migration.    :param migrate_data: implementation specific params    """    # Do live migration.    try:      if block_migration:        flaglist = CONF.libvirt.block_migration_flag.split(',')      else:        flaglist = CONF.libvirt.live_migration_flag.split(',')      flagvals = [getattr(libvirt, x.strip()) for x in flaglist]      logical_sum = reduce(lambda x, y: x | y, flagvals)      dom = self._lookup_by_name(instance["name"])      dom.migrateToURI(CONF.libvirt.live_migration_uri % dest,               logical_sum,               None,               CONF.libvirt.live_migration_bandwidth)    except Exception as e:      with excutils.save_and_reraise_exception():        LOG.error(_("Live Migration failure: %s"), e,             instance=instance)        recover_method(context, instance, dest, block_migration)    # Waiting for completion of live_migration.    timer = loopingcall.FixedIntervalLoopingCall(f=None)
if block_migration:         flaglist = CONF.libvirt.block_migration_flag.split(',')

這個獲取塊遷移標志列表,block_migration_flag:這個參數定義了為塊遷移設置遷移標志。 

else:         flaglist = CONF.libvirt.live_migration_flag.split(',')       flagvals = [getattr(libvirt, x.strip()) for x in flaglist]      logical_sum = reduce(lambda x, y: x | y, flagvals)

這部分獲取實時遷移標志列表,live_migration_flag這個參數定義了實時遷移的遷移標志。

 dom = self._lookup_by_name(instance["name"])

根據給定的實例名稱檢索libvirt域對象。

 timer = loopingcall.FixedIntervalLoopingCall(f=None)

獲取等待完成實時遷移的時間。

熱遷移代碼部分至此結束。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久亚洲春色中文字幕| 国产欧美日韩免费看aⅴ视频| 日韩欧美国产一区二区| 精品偷拍各种wc美女嘘嘘| 国内精品视频在线| 97视频网站入口| 亚洲电影免费在线观看| 国产丝袜一区二区三区免费视频| 91精品国产综合久久香蕉922| 精品欧美激情精品一区| 久久av资源网站| 久久精品国产久精国产一老狼| 久久人人爽亚洲精品天堂| 欧美在线观看www| 亚洲一区二区三区视频播放| zzjj国产精品一区二区| 久久99精品视频一区97| 国产精品成人免费电影| 91精品国产91久久久久久久久| 久热精品在线视频| 久久777国产线看观看精品| 自拍偷拍亚洲一区| 欧美日韩免费区域视频在线观看| 国产日韩欧美在线播放| 国产日本欧美在线观看| 国产成人精品一区| 国产精品色午夜在线观看| 激情成人在线视频| 九九热这里只有精品免费看| 一本一本久久a久久精品牛牛影视| 日本成人免费在线| 国产日本欧美一区二区三区| 国产精品伦子伦免费视频| 97超级碰碰人国产在线观看| 亚洲激情视频在线观看| 2021久久精品国产99国产精品| 欧美日本啪啪无遮挡网站| 日韩av最新在线观看| 久久国产精品视频| 欧美精品久久久久久久久| 尤物九九久久国产精品的特点| 亚洲老头老太hd| 久久精品视频在线播放| www.欧美精品一二三区| 国产精品免费网站| 海角国产乱辈乱精品视频| 亚洲人成人99网站| 青青草原成人在线视频| 国内久久久精品| 亚洲成人a级网| 欧美日韩视频在线| 国内精品久久影院| 中文字幕亚洲欧美日韩高清| 久久男人的天堂| 国产69久久精品成人看| 亚洲性线免费观看视频成熟| 欧美激情精品久久久久久黑人| 91国语精品自产拍在线观看性色| 欧美精品在线观看| 中文字幕日韩高清| 精品国产一区二区三区久久久狼| 日韩欧美在线视频| 日韩精品中文字幕久久臀| 亚洲激情国产精品| 精品福利一区二区| 欧美亚洲国产日韩2020| 岛国av午夜精品| 国产精品亚洲综合天堂夜夜| 欧美一级淫片aaaaaaa视频| 亚洲成人激情在线| 欧美性视频网站| 国产精品自拍网| 久久久天堂国产精品女人| 欧美午夜视频在线观看| 久久亚洲电影天堂| 国产美女精品视频| 亚洲男人的天堂网站| 91精品国产91久久| 热99久久精品| 91精品国产91久久久久久不卡| 91亚洲国产精品| 欧美激情乱人伦| 国产精品永久免费视频| 亚洲午夜未满十八勿入免费观看全集| 成人av资源在线播放| 午夜欧美不卡精品aaaaa| 成人h片在线播放免费网站| 中文字幕在线观看日韩| 97在线观看视频国产| 国产成人精品免高潮费视频| 欧美成年人在线观看| 国产精品永久免费视频| 91在线观看欧美日韩| 欧美日韩中文在线| 亚洲一区二区日本| 国产精品久久久久久亚洲影视| 久久久www成人免费精品| 亚洲天堂av在线免费观看| 亚洲精品www久久久久久广东| 欧美日韩成人黄色| 不卡av电影院| 国产有码一区二区| 亚洲综合日韩中文字幕v在线| 亚洲精品中文字幕女同| 欧美日韩国产在线播放| 欧美在线观看网址综合| 国产一区二区三区视频| 久久久精品亚洲| 欧美色视频日本版| 26uuu久久噜噜噜噜| 91成品人片a无限观看| 欧美性20hd另类| 亚洲美女免费精品视频在线观看| 97在线免费视频| 久久久国产精品x99av| 亚洲欧美制服另类日韩| 亚洲精品永久免费精品| 4p变态网欧美系列| 国产精品主播视频| 久久香蕉频线观| 国产中文字幕日韩| 在线免费观看羞羞视频一区二区| 日韩在线观看免费网站| 中文字幕亚洲一区在线观看| 欧美亚洲另类在线| 国产一区二区欧美日韩| 欧美黑人xxxⅹ高潮交| 欧美理论电影在线观看| 国产精品美女久久久久久免费| 91av在线网站| 亚洲国产精品久久久久秋霞蜜臀| 久久艹在线视频| 狠狠久久亚洲欧美专区| 日韩有码片在线观看| 欧美成人免费小视频| 亚洲成人av在线播放| 精品国产一区二区三区四区在线观看| 欧美成人h版在线观看| 91亚洲国产成人精品性色| 97人人做人人爱| 精品美女国产在线| 九九九久久国产免费| 亚洲欧美国产精品va在线观看| 国产在线视频一区| 91精品国产91久久久久久吃药| 91精品视频在线看| 国产精品国产亚洲伊人久久| 韩国精品美女www爽爽爽视频| 91av成人在线| 亚洲一区二区三区xxx视频| 4444欧美成人kkkk| 成人信息集中地欧美| 成人激情黄色网| 亚洲综合中文字幕在线| 热re99久久精品国产66热| 亚洲视频在线视频| 欧美自拍大量在线观看| 欧美黄色性视频| 国产999精品久久久影片官网| 欧美激情中文字幕乱码免费| 日韩在线视频免费观看| 国产精品视频久久| 午夜精品久久久久久久白皮肤| 亚洲国产高清福利视频|