跳转到: 导航, 搜索

XenServer迁移

  • Launchpad 条目
  • 创建:
  • 贡献者:

总结

发布说明

我们需要能够在同一区域内,将 XenServer 实例从一个宿主机迁移到另一个宿主机。这提供了大量有用的功能,例如能够通过迁移实例来更换即将报废或过时的宿主机。迁移也是功能性调整大小的基础依赖。

原理

如上所述,出于任何物理原因能够撤离宿主机是非常可取的。此外,客户无需快照和创建新实例,即可调整实例大小(增加 RAM 和磁盘配额)也很有用。

用户故事

  1. 作为运维人员,我希望能够撤离硬件出现故障的宿主机,以便能够以对客户影响最小的方式更换服务器。
  2. 作为用户,我希望能够迁移我的实例,以便能够迁移到更快和/或更新的硬件。

前提条件

已经存在快照正在运行的 XenServer 实例的功能。

设计与实现

抽象的 Websequence 图如下所示

Index.php.png

在这个设计中出现了一些问题。首先,由于当前的调度器实现,无法保证调度器能够意识到迁移的能力。 “简单”调度器实现表明这是可能的,但我认为至少目前我们不应该依赖这种能力。上述的权宜之计是首先将消息投递到目标宿主机,目标宿主机仅识别自身并直接将消息代理到源宿主机。

我们可以通过使初始迁移调用上下文感知来提供更智能的调度器概念。 如果我们是源宿主机并且也存在目标宿主机参数,我们只需开始 Rsync。 否则,将消息投递到源宿主机,并将自身附加到消息参数中。 感觉有点不一致,但拥有一个迁移感知的调度器会更有效率。

第一步将按照上述序列图实现,第二步将在必要时添加上述功能。

迁移状态

  • 无状态 / 无迁移实例:目标宿主机从 API 接收到投递消息,并使用必要的字段创建一个迁移实例。 在此阶段,目标宿主机创建一个填充了当前实例属性和新属性的迁移实例,将状态设置为 正在迁移前,然后将消息投递到源宿主机。
  • 正在迁移前: 源宿主机已收到迁移 VM 的意图通知,然后对 VM 进行快照并将状态更改为 正在迁移
  • 正在迁移: 源宿主机正在将 VHD Rsync 到目标宿主机。 之后,将迁移状态设置为 '正在迁移_步骤2'。 然后,源宿主机关闭实例,然后开始将 COW Rsync 到目标宿主机。 之后,源宿主机将迁移状态设置为 迁移后 并将消息投递到目标计算节点
  • 迁移后: 目标宿主机从 Instance 表和传输的 VHD/COW 创建一个新实例,使用新的主机名更新实例记录,然后将 migration_status 设置为 验证迁移
  • 验证迁移: 迁移将处于此状态,直到发出后续 API 调用。 此时,源计算节点将 vm-destroy 旧实例并将迁移状态标记为 完成
  • 完成: 无论迁移是“已确认”还是“已撤销”,迁移都处于此状态。
  • 撤销: 目标计算节点将销毁新实例,然后将消息投递到源宿主机以重新启动旧实例。 将恢复旧实例属性,然后将迁移状态设置为 完成

磁盘传输

There are few different ways we could go about transferring the disk to the destination host
  1. 创建一个 XAPI 插件来为我们执行 Rsync
  2. SSH 进入 dom0。 我真的更希望避免这种方法,但根据 1 需要多长时间,这可能是最佳选择

优化

  • 我们可以暂停实例而不是关闭它,然后在迁移过程中迁移 RAM VHD,以便用户不会丢失正常运行时间

代码变更

Openstack API 将修改“action”端点以暴露“resize”功能,这只是一个具有更大 RAM 和磁盘配额的迁移。

迁移

Openstack API 中已经存在功能,但此时返回 HTTP 501。 之后,现有的 API 客户端应该能够通过 API 中存在的“resize”功能成功迁移。 此外,还将通过 Admin API 暴露用于在不调整实例大小的情况下进行迁移的功能。

测试/演示计划

这不必在规范接近 Beta 之前添加或完成。