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
的虚拟机。
这个示例假设您已经完全配置了共享存储,并满足所有先决条件(以下列出: 迁移要求)。
验证客户机虚拟机正在运行
在源系统中host1.example.com
,验证guest1-rhel6-64
正在运行:[root@host1 ~]# virsh list Id Name State ---------------------------------- 10 guest1-rhel6-64 running
迁移客户端虚拟机
执行以下命令,将 guest 虚拟机实时迁移到目标host2.example.com
。在目标 URL 的末尾附加/system
以便告知 libvirt 您需要完全访问。# virsh migrate --live
guest1-rhel7-64 qemu+ssh://host2.example.com/system
输入命令后,系统将提示您输入目标系统的 root 密码。Wait
根据负载和客户机虚拟机大小,迁移可能需要一些时间。virsh 只报告错误。客户机虚拟机继续在源主机物理机器中运行,直到完全迁移为止。验证客户机虚拟机已到达目标主机
从目标系统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” 过程。
- 打开 libvirtd.conf 文件,如 过程 15.1, “配置 libvirtd.conf” 所述。
- 查找处理控制部分。
################################################################# # # 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 #################################################################
- 更改
max_clients
和max_workers
参数设置。建议两个参数中的数字都相同。max_clients
每次迁移过程中将使用 2 个客户端(每个迁移一个),max_workers
则在执行阶段,目标上的 1 个 worker 使用 1 个 worker,并在完成阶段在目标 1 个 worker 上使用 1 个 worker。重要max_clients
和max_workers
参数设置会受到连接到 libvirtd 服务的所有客户机虚拟机连接的影响。这意味着,任何正在使用同一客户机虚拟机并同时执行迁移的用户也会遵循max_clients
和max_workers
参数设置的限制。这就是为什么在执行并发实时迁移之前,需要仔细考虑最大值的原因。重要max_clients
参数控制允许多少个客户端连接到 libvirt。当同时启动大量容器时,可轻松达到和超过这一限制。max_clients
参数的值可以增加以避免这种情况,但这样做会使系统更易受到攻击,从而防止系统遭到拒绝服务(DoS)攻击。要解决这个问题,Red Hat Enterprise Linux 7.0 中引入了一个新的max_anonymous_clients
设置,用于指定接受但尚未通过身份验证的连接的限制。您可以实施max_clients
和max_anonymous_clients
的组合来适合您的工作负载。 - 保存文件并重启该服务。注意有些情况下,迁移连接会下降,因为已启动但尚未通过身份验证的 ssh 会话太多。默认情况下,
sshd
只允许 10 会话随时处于 "pre-authenticated state"。此设置由 sshd 配置文件中的MaxStartups
参数(位于:/etc/ssh/sshd_config
)来控制,可能需要进行一些调整。需要小心调整此参数,因为限制可以防止 DoS 攻击(一般情况下使用资源)。将此值设置为过高,将指示其用途。要更改这个参数,请编辑文件/etc/ssh/sshd_config
,从 MaxStartups 行的开头删除 #,并将10
(默认值)改为更高数字。记住保存文件并重新启动sshd
服务。如需更多信息,请参阅sshd_config
man page。