Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

15.5. 使用 virsh 进行实时 KVM 迁移

可以使用 virsh 命令将客户机虚拟机迁移到另一台主机物理计算机。migrate 命令接受以下格式的参数:
# virsh migrate --live GuestName DestinationURL
请注意,不需要实时迁移时可以消除 --live 选项。其它选项在 第 15.5.2 节 “virsh migrate 命令的附加选项” 中列出。
GuestName 参数表示您要迁移的客户机虚拟机的名称。
DestinationURL 参数是目标主机物理机器的连接 URL。目标系统必须运行相同的 Red Hat Enterprise Linux 版本,它们使用相同的管理程序,并且运行 libvirt
注意
常规迁移的 DestinationURL 参数和 peer2peer 迁移有不同的语义:
  • 正常迁移: DestinationURL 是目标主机物理机器的 URL,如源客户机虚拟机所示。
  • peer2peer 迁移:DestinationURL 是目标主机物理计算机的 URL,如源主机物理计算机所示。
输入命令后,系统将提示您输入目标系统的 root 密码。
重要
名称解析必须同时处理(源和目标),才能成功迁移。每个产品都必须能够找到其他内容。请确定您可以 ping 一边,以检查名称解析是否正常工作。

示例:使用 virsh 实时迁移

这个示例从 host1.example.com 迁移到 host2.example.com。更改您的环境的主机物理机器名称。本例迁移了一个名为 guest1-rhel6-64 的虚拟机。

这个示例假设您已经完全配置了共享存储,并满足所有先决条件(以下列出: 迁移要求)。
  1. 验证客户机虚拟机正在运行

    在源系统中 host1.example.com,验证 guest1-rhel6-64 正在运行:
    [root@host1 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel6-64     running
    
  2. 迁移客户端虚拟机

    执行以下命令,将 guest 虚拟机实时迁移到目标 host2.example.com。在目标 URL 的末尾附加 /system 以便告知 libvirt 您需要完全访问。
    # virsh migrate --live guest1-rhel7-64 qemu+ssh://host2.example.com/system
    输入命令后,系统将提示您输入目标系统的 root 密码。
  3. Wait

    根据负载和客户机虚拟机大小,迁移可能需要一些时间。virsh 只报告错误。客户机虚拟机继续在源主机物理机器中运行,直到完全迁移为止。
  4. 验证客户机虚拟机已到达目标主机

    从目标系统 host2.example.com,验证 guest1-rhel7-64 正在运行:
    [root@host2 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel7-64     running
    
实时迁移现已完成。
注意
libvirt 支持各种网络方法,包括 TLS/SSL、UNIX 套接字、SSH 和未加密 TCP。有关使用其它方法的详情请参考 第 18 章 客户机的远程管理
注意
使用以下命令可迁移非运行的客户机虚拟机:
# virsh migrate --offline --persistent 

15.5.1. 使用 virsh 迁移的附加提示

在单独的命令 shell 中运行每个迁移,可以执行多个并发实时迁移。但是,这应该非常谨慎,并应该涉及计算每个迁移实例每个端的 MAX_CLIENT(源和目标)。由于默认设置是 20,因此只需更改设置即可运行 10 个实例。如果您需要更改设置,请查看 过程 15.1, “配置 libvirtd.conf” 过程。
  1. 打开 libvirtd.conf 文件,如 过程 15.1, “配置 libvirtd.conf” 所述。
  2. 查找处理控制部分。
    #################################################################
    #
    # Processing controls
    #
    
    # The maximum number of concurrent client connections to allow
    # over all sockets combined.
    #max_clients = 5000
    
    # The maximum length of queue of connections waiting to be
    # accepted by the daemon. Note, that some protocols supporting
    # retransmission may obey this so that a later reattempt at
    # connection succeeds.
    #max_queued_clients = 1000
    
    # The minimum limit sets the number of workers to start up
    # initially. If the number of active clients exceeds this,
    # then more threads are spawned, upto max_workers limit.
    # Typically you'd want max_workers to equal maximum number
    # of clients allowed
    #min_workers = 5
    #max_workers = 20
    
    
    # The number of priority workers. If all workers from above
    # pool will stuck, some calls marked as high priority
    # (notably domainDestroy) can be executed in this pool.
    #prio_workers = 5
    
    # Total global limit on concurrent RPC calls. Should be
    # at least as large as max_workers. Beyond this, RPC requests
    # will be read into memory and queued. This directly impact
    # memory usage, currently each request requires 256 KB of
    # memory. So by default upto 5 MB of memory is used
    #
    # XXX this isn't actually enforced yet, only the per-client
    # limit is used so far
    #max_requests = 20
    
    # Limit on concurrent requests from a single client
    # connection. To avoid one client monopolizing the server
    # this should be a small fraction of the global max_requests
    # and max_workers parameter
    #max_client_requests = 5
    
    #################################################################
    
  3. 更改 max_clientsmax_workers 参数设置。建议两个参数中的数字都相同。max_clients 每次迁移过程中将使用 2 个客户端(每个迁移一个),max_workers 则在执行阶段,目标上的 1 个 worker 使用 1 个 worker,并在完成阶段在目标 1 个 worker 上使用 1 个 worker。
    重要
    max_clientsmax_workers 参数设置会受到连接到 libvirtd 服务的所有客户机虚拟机连接的影响。这意味着,任何正在使用同一客户机虚拟机并同时执行迁移的用户也会遵循 max_clientsmax_workers 参数设置的限制。这就是为什么在执行并发实时迁移之前,需要仔细考虑最大值的原因。
    重要
    max_clients 参数控制允许多少个客户端连接到 libvirt。当同时启动大量容器时,可轻松达到和超过这一限制。max_clients 参数的值可以增加以避免这种情况,但这样做会使系统更易受到攻击,从而防止系统遭到拒绝服务(DoS)攻击。要解决这个问题,Red Hat Enterprise Linux 7.0 中引入了一个新的 max_anonymous_clients 设置,用于指定接受但尚未通过身份验证的连接的限制。您可以实施 max_clientsmax_anonymous_clients 的组合来适合您的工作负载。
  4. 保存文件并重启该服务。
    注意
    有些情况下,迁移连接会下降,因为已启动但尚未通过身份验证的 ssh 会话太多。默认情况下,sshd 只允许 10 会话随时处于 "pre-authenticated state"。此设置由 sshd 配置文件中的 MaxStartups 参数(位于: /etc/ssh/sshd_config)来控制,可能需要进行一些调整。需要小心调整此参数,因为限制可以防止 DoS 攻击(一般情况下使用资源)。将此值设置为过高,将指示其用途。要更改这个参数,请编辑文件 /etc/ssh/sshd_config,从 MaxStartups 行的开头删除 #,并将 10 (默认值)改为更高数字。记住保存文件并重新启动 sshd 服务。如需更多信息,请参阅 sshd_config man page。