没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
OpenStack
基于
Libvirt
的虚拟化平台调度实现 ----Nova
虚拟
机动态迁移源码分析
这篇博文开始,我们来解析一下 Nova 虚拟机动态迁移的实现源码。
这里不会再像前面那样对代码进行逐行的详细解析,目的是来整理
Nova 虚拟机动态迁移的实现步骤和相关源码部分架构。
首先我们来看虚拟机动态迁移在 Opentack Nova 中的 API 请求处理
函数/nova/api/openstack/compute/contrib/admin_actions.py--
--def _migrate_live:
1 def _migrate_live(self, req, id, body):
2 """
3 Permit admins to (live) migrate a server to a new host.
4 允许管理员实时迁移一个服务到新的主机;
5 """
6 context = req.environ["nova.context"]
7 authorize(context, 'migrateLive')
8
9 try:
10 block_migration = body["os-migrateLive"]
["block_migration"]
11 disk_over_commit = body["os-migrateLive"]
["disk_over_commit"]
12 # 确定服务迁移的目标主机;
13 host = body["os-migrateLive"]["host"]
14 except (TypeError, KeyError):
15 msg = _("host and block_migration must be specified.")
16 raise exc.HTTPBadRequest(explanation=msg)
17
18 try:
19 instance = self.compute_api.get(context, id)
20 # live_migrate:实施地迁移服务到新的主机;
21 self.compute_api.live_migrate(context, instance,
block_migration,
22 disk_over_commit, host)
23 except (exception.ComputeServiceUnavailable,
24 exception.InvalidHypervisorType,
25 exception.UnableToMigrateToSelf,
26 exception.DestinationHypervisorTooOld) as ex:
27 raise exc.HTTPBadRequest(explanation=ex.format_message())
28 except Exception:
29 if host is None:
30 msg = _("Live migration of instance %(id)s to another
host"
31 " failed") % locals()
32 else:
33 msg = _("Live migration of instance %(id)s to host %
(host)s"
34 " failed") % locals()
35 LOG.exception(msg)
36 # Return messages from scheduler
37 raise exc.HTTPBadRequest(explanation=msg)
38
39 return webob.Response(status_int=202)
在这个方法中我们可以看到,实现虚拟机动态迁移主要实现的语句就
是:self.compute_api.live_migrate(context, instance,
block_migration, disk_over_commit, host)
我们接着看方法 live_migrate 的源码:
40 # check_instance_state:这是一个装饰器,用于在进入 API 方法之前,检测虚拟机
和/或任务的状态;
41 # 如果实例处于错误的状态,将会引发异常;
42 @check_instance_state(vm_state=[vm_states.ACTIVE])
43 def live_migrate(self, context, instance, block_migration,
44 disk_over_commit, host_name):
45 """
46 实时地迁移服务到新的主机;
47 """
48 LOG.debug(_("Going to try to live migrate instance to %s"),
49 host_name or "another host", instance=instance)
50
51 # update:更新实例的记录,如果任务或者虚拟机状态发生改变则发送一个状态更
新的通知;
52 # 返回更新后的实例信息;
53 instance = self.update(context, instance,
54 task_state=task_states.MIGRATING,
55 expected_task_state=None)
56
57 # 调用 call 方法实现在主题 topic 的模式上发送实时迁移虚拟机的消息,并等待
回应;
58 self.scheduler_rpcapi.live_migration(context, block_migration,
59 disk_over_commit, instance, host_name)
这个方法中,主要实现了两部分内容,更新记录中的实例信息和在主
题 topic 的模式上发送实时迁移虚拟机的消息。我们先来看跟新记录
中的实例信息这部分内容,主要是通过调用方法 update 方法实现的。
具体来看方法 update 的实现源码:
60 def update(self, context, instance, **kwargs):
61 """
62 更新数据存储中的实例;
63
64 :param context: The security context
65 安全上下文信息;
66 :param instance: The instance to update
67 要更新的实例;
68
69 # 更新实例的记录,如果任务或者虚拟机状态发生改变则发送一个状态更新的通知;
70 # 返回更新后的实例信息;
71 """
72
73 # 更新实例的记录,如果任务或者虚拟机状态发生改变则发送一个状态更新的通知;
74 # 返回旧的实例信息和更新后的实例信息;
75 _, updated = self._update(context, instance, **kwargs)
76 return updated
77 def _update(self, context, instance, **kwargs):
78 # 更新实例的记录,如果任务或者虚拟机状态发生改变则发送一个状态更新的通知;
79 # 返回旧的实例信息和更新后的实例信息;
80
81 # 更新实例的信息;
82 # 返回旧的实例信息和更新后的实例信息;
83 old_ref, instance_ref =
self.db.instance_update_and_get_original(context, instance['uuid'],
kwargs)
84 # 发送通知,来报告实例中发生的任何改变;
85 notifications.send_update(context, old_ref, instance_ref,
service="api")
86
87 return dict(old_ref.iteritems()),
dict(instance_ref.iteritems())
方法_update 主要实现了两方面的内容,一是实现更新实例信息,二
是发送通知,来报告实例中发生的任何改变。先来看方法
instance_update_and_get_original 的实现源码:
88 def instance_update_and_get_original(context, instance_uuid, values):
89 """
90 更新实例的信息;
91 返回旧的实例信息和更新后的实例信息;
92 """
93 rv = IMPL.instance_update_and_get_original(context, instance_uuid,
values)
94 try:
95 # 在 top 等级的 cell 上,更新实例;
96 cells_rpcapi.CellsAPI().instance_update_at_top(context, rv[1])
97 except Exception:
98 LOG.exception(_("Failed to notify cells of instance update"))
99 return rv
100 def instance_update_and_get_original(context, instance_uuid, values):
101 """
102 更新实例的信息;
103 返回旧的实例信息和更新后的实例信息;
104 """
105 return _instance_update(context, instance_uuid, values,
106 copy_old_instance=True)
107 def _instance_update(context, instance_uuid, values,
剩余20页未读,继续阅读
资源评论
weixin_43444701
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 先秦文学试题库参考答案与解析.doc
- 西南大学《心理健康教育》作业和答案.doc
- 镶嵌式电力调度模拟屏通用技术条件.doc
- 小学数学综合实践活动《营养午餐》教学案例[陈倩影].doc
- 宜宾市义教小学数学学科教学指导意见(李冰).doc
- 义务教育学校校长专业标准.doc
- 一年级(下册)语文第八单元单元分析和教(学)案.doc
- 珍惜资源,保护环境作文.doc
- 园艺植物研究--紫罗兰的切花保鲜.doc
- 中小学教师招考教综知识点整理.doc
- 中考语文试题分类解析-选词填空.doc
- 中小学综合实践活动教学案.doc
- 中医推拿关节整复手法学习.doc
- 中学生心理健康教育的方法和途径.doc
- 桩基技术人员培训考试题.doc
- 注册安全工程师安全生产法及相关法律法规考前知识点总结.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功