跳转到: 导航, 搜索

XenServer/LiveMigration

XenServer 实时迁移

以下是一些与 XenServer 实时迁移相关的文档。

迁移类型

实时迁移主要有两种情况

  • 虚拟机位于共享存储上
  • 虚拟机不位于共享存储上

当虚拟机位于共享存储上时,可以使用 XenServer 的池概念执行迁移。但是,源主机和目标主机必须都位于该池中。

如果不使用共享存储,则必须将虚拟机的磁盘移动到新服务器。 XenServer 的一项新功能(称为 Storage XenMotion)将能够提供帮助:http://wiki.xen.org/wiki/CrossPoolMigrationv3

使用块迁移的实时迁移

这需要 XenServer 6.1(带有高级许可证)、XenServer 6.2 或更高版本(带有免费许可证)或 XCP 1.6 及更高版本。

在使用上述版本之一以及使用 Havana 或更高版本的 OpenStack 时,无需启用池(使用聚合)即可获得实时迁移,只需将 --block-migrate 选项添加到迁移命令即可。

使用主机聚合的实时迁移

如果您使用配置了 主机聚合XenServer 池,并且将该池配置为使用共享存储作为默认存储,则可以在该池中的不同主机之间迁移虚拟机。

注意:使用主机聚合创建 XenServer 池的测试不够充分。主要建议使用块迁移,如前一节所述,而不是尝试使用主机聚合与 XenServer。

使用主机聚合设置 XenServer

要设置池,您至少需要两台服务器,并且它们必须兼容:http://docs.vmd.citrix.com/XenServer/6.0.0/1.0/en_gb/reference.html#pooling_homogeneity_requirements

nova 配置有几个要求

  • 您必须配置 XenServer 的真实管理 IP(不是 169.254.0.1),并且 nova DomU 也必须位于该网络上
  • 您必须配置为使用默认池存储:sr_matching_filter=default-sr:true

一旦您在服务器上运行了 OpenStack(使用 XenServer/DevStack 或其他方式),您需要将它们组合成一个池。

现在您可以使用 nova cli 创建聚合

nova aggregate-create my_test_pool my_availability_zone


nova aggregate-set-metadata <aggregate_id> hypervisor_pool=true
nova aggregate-set-metadata <aggregate_id> operational_state=created


您可以使用 aggregate-list 获取 ID,然后使用工具添加您的主服务器(使用该超visor 上的 nova compute 的主机名,您可以使用“nova-manage service list”来检查名称)

nova aggregate-add-host <aggregate_id> my_master_host


现在您可以使用 xe 或 XenCenter 添加一些共享存储,并使其成为默认池存储库:http://docs.vmd.citrix.com/XenServer/6.0.0/1.0/en_gb/reference.html#id1002701

现在您可以将进一步的主机添加到池中(请记住上述池兼容性要求)

nova aggregate-add-host <aggregate_id> my_slave_host_1
nova aggregate-add-host <aggregate_id> my_slave_host_2


您现在应该看到这些服务器关闭您的 nova compute VM,加入您的池,然后重新启动 nova compute VM。

注意:在某些版本的 XenServer 中,您现在可能需要重新配置 nova compute VM 上的 eth0,然后 VM 才能启动。这应该在未来版本的 XenServer 中得到修复。

要尝试此功能,请启动一个 VM,您应该看到它使用共享存储。

要实时迁移 VM,您可以使用通常的 nova cli 命令

nova live-migration <instance_uuid> <destination_hostname>

实时迁移 RPC 调用

让我们考虑名为

  • src(inst 运行的地方)
  • dest

用户调用映射到

  • scheduler rpc: live_migration(block_migration, disk_over_commit, instance_id, dest)

调度器驱动程序执行以下操作

  • 检查实例是否存在
  • 检查源是否存活
  • 检查目标是否存活,以及是否有足够的内存
  • 检查源 + 目标 hypervisor 类型是否匹配,并且目标版本与源相同或更高
  • compute: check_can_live_migrate_on_dest (在 dest 上) *TODO*
  • 更新实例数据库条目为“migrating”
  • compute: live_migration (在 src 上)

Compute:check_can_live_migrate_on_destination 执行以下操作 (在 dest 上): *TODO*

  • 调用 compute_driver check_can_live_migration_on_dest
  • 可以调用委托,该委托调用 check_can_live_migrate_on_src

Compute:check_can_live_migrate_on_src 执行以下操作 (在 src 上): *TODO*

  • 从 dest 获取一个字典
  • 如果存在问题,可能会引发异常

Compute: live_migration 执行以下操作 (在 src 上)

  • 使用 volume 检查导出
  • 在 dest 上调用 pre_live_migration
  • 在发生异常时进行回滚
  • 调用驱动程序

Compute_driver: live_migration (在 src 上)

  • 成功后调用 manager 的 post_live_migration
  • 失败后调用 manager 的 rollback_live_migration

Compute: post_live_migration (在 src 上)

  • 更新浮动 IP
  • 删除旧的镜像痕迹
  • 在 dest 上调用 post_live_migration_at_destination

Compute: rollback_live_migration (在 src 上)

  • 更新数据库
  • 整理 volume 和网络
  • 在块迁移时,在 dest 上调用 rollback_live_migration_at_destination

Compute: post_live_migration_at_destination (在 dest 上)

  • 设置网络
  • 将任务设置为完成

Compute: rollback_live_migration_at_destination (在 dest 上)

  • 进行一些清理