高可用性
XenServer® 高可用性 (HA) 功能可确保您的虚拟机以最少的停机时间持续运行,并且不会发生数据损坏。当发生主机硬件故障和网络中断等问题时,XenServer 池会通过在池中稳定的主机上重新启动受影响的虚拟机来响应。此功能使您能够保持虚拟机运行,直到您能够纠正任何硬件问题。
XenServer 通过以下方式确保虚拟机的高可用性:
- 使用网络心跳来验证池中主机之间的连接。
- 使用存储心跳来验证主机与共享存储之间的连接。
- 检测主机是否发生故障。
- 检测一个或多个主机是否变得不可达。
- 隔离无法与池中最大主机分区通信的主机。被隔离的主机立即重新启动,导致其上运行的所有虚拟机停止。重新启动后,它会尝试重新加入资源池。此预防措施可防止虚拟机同时在两台主机上运行并导致数据损坏的风险。
- 将发生故障、被隔离或不可达的主机标记为不再是池中活动主机集的一部分。
- 将在该主机上运行的任何虚拟机标记为已停止。
- 如果发生故障、被隔离或不可达的主机是池协调器,则将协调器角色重新分配给池中的另一台主机。
- 根据您配置的故障转移计划重新启动任何已停止的虚拟机。
- 监控池配置的任何更改,以检查配置的故障转移计划是否可以执行。
由于 HA 功能会自动在池中的其他主机上重新启动虚拟机,因此 XenServer 必须确保虚拟机的原始(发生故障或不可达的)主机不再运行该虚拟机。同一虚拟机的两个实例同时运行可能会导致虚拟机数据损坏。为了防止这种情况,启用 HA 的池中的 XenServer 主机在可能导致同一虚拟机的两个实例同时运行的情况下会主动进行自我隔离。
HA 功能可让您的关键虚拟机持续运行,直到您解决底层硬件或网络问题。当您意识到发生了 HA 事件时,请调查并解决底层故障,以使您的池恢复到满负荷运行状态。
本文介绍了高可用性概念、要求和预期行为。有关配置和管理高可用性的信息,请参阅配置高可用性。
要求
要使用高可用性功能,您的环境中需要以下各项:
-
XenServer 池:HA 功能在单个资源池中运行。
- 我们建议池是同构的。池中的每个主机都向虚拟机公开相同的 CPU 功能集,这使得虚拟机更容易在池中的任何位置重新启动。
- 为了使心跳机制有效工作,我们建议池中至少有 3 个主机。
- 在启用 HA 之前,请确保池中的所有主机都处于联机状态。
-
池中所有主机的共享存储:为了使池中的任何虚拟机在发生故障后能够在池中的任何主机上重新启动,池中的所有主机都必须能够访问存储虚拟机磁盘的 SR。
-
心跳 SR:此 SR 可以是存储虚拟机磁盘的 SR。池存储的信息使池能够在发生故障时协调故障检测和恢复。
- 心跳 SR 必须位于 iSCSI、NFS 或光纤通道 LUN 上。使用 SMB 或通过 CHAP 身份验证的 iSCSI 附加的存储不能用作心跳 SR。我们建议此 SR 具有高可靠性和低延迟。
-
XenServer 8.4 需要 4 GB 的心跳 SR 空间。
心跳 SR 上存储的信息包括:
- 4 MB 心跳卷:提供存储心跳,用于验证池中的主机是否可以访问存储。
- 元数据卷:存储池协调器元数据,以在池协调器发生故障转移时使用。此卷占用其余所需空间。
-
心跳 SR 的可靠且冗余的存储通信:为了使 HA 功能最准确地了解哪些主机可以访问共享存储,请配置您的环境以确保存储流量可靠。对于 iSCSI 和光纤通道 SR,请配置多路径。对于 NFS SR,请使用弹性绑定网络作为存储网络。
-
所有主机的静态 IP 地址:HA 将主机 IP 地址的更改视为主机失去连接,并假定主机的网络已发生故障。因此,主机可能会被隔离。为避免这种情况,请仅在池中使用静态 IP。
-
管理网络上的专用绑定接口:为了使 HA 功能能够最准确地查看池状态,您需要主机之间可靠且冗余的网络通信。
-
管理网络允许通过端口 694 进行网络心跳 UDP 流量:网络心跳验证池中的主机是否处于活动状态并可以相互联系。
-
所有池主机之间的近距离连接:池中的所有主机必须以小于 5 毫秒的往返延迟和至少 10 Gbps 的网络吞吐量连接。分布在多个数据中心的主机只有在这些数据中心满足近距离定义的情况下才能共享一个池。主机之间的高延迟会增加因心跳丢失而导致虚假隔离的风险。
注意:
HA 不了解数据中心边界。在主机故障后重新启动 VM 时,HA 会根据可用内存将其放置在池中的任何可用主机上,不考虑数据中心亲和性或偏好。如果您将一个池分布在两个近距离数据中心,并且整个数据中心发生故障,HA 将尝试在幸存的主机上重新启动受影响的 VM — 但结果取决于可用容量以及共享存储是否仍可从这些主机访问。这不构成受控的数据中心级别故障转移。为了应对整个数据中心故障,请使用灾难恢复。
为了保护在高可用性池中运行的 VM,请使用以下配置设置您的 VM:
- 将 VM 磁盘存储在池中所有主机都可用的共享存储上。
- 在池范围的网络上设置其虚拟网络接口。
- 确保 VM 可以使用实时迁移。有关更多信息,请参阅迁移兼容性要求。
- 不要将 VM 连接到本地 DVD 驱动器。
满足所有这些条件的 VM 称为敏捷 VM。
使用 NVIDIA vGPU 或 GPU 直通的 VM 无法受到 HA 保护。但是,HA 机制可以尽力尝试重新启动此 VM。
GFS2 集群池的要求
GFS2 集群池的高可用性行为使用不同的底层机制,因此具有一些不同的要求和行为。有关更多信息,请参阅GFS2 集群池。
HA 故障转移计划
HA 机制根据以下标准计算池范围的故障转移计划:
- VM 恢复要求:每个 VM 都可以定义重启优先级和启动顺序。
- 可用池资源:主要考虑的资源是主机内存。
- 可容忍的主机故障数量:在池中启用 HA 后,XenServer 可以计算在受保护的 VM 无法重启之前池中可以发生故障的最大主机数量。您可以将可容忍的主机故障数量设置为小于或等于此值。
如果无法计算出满足这些条件的故障转移计划,则认为池已超额分配。如果受保护的 VM 无法在池中重启,XenServer 会发出系统警报。此警报也会显示在 XenCenter® 的通知面板中。
对于池中的每个 VM,您可以定义其恢复行为。
重启优先级
您可以为 VM 分配以下重启优先级之一:
-
受保护:如果 VM 或其主机意外脱机,HA 会在另一台主机上重启该 VM。只要池未超额分配且 VM 具有灵活性,此重启即可得到保证。如果 VM 重启失败,HA 会在池中有额外容量时尝试启动该 VM。此值在 xe CLI 上为
restart,在 XenCenter 中为重启。 -
尽力而为:如果运行 VM 的主机意外脱机,HA 会尝试在另一台主机上重启该 VM。它仅在所有受保护的 VM 成功重启后才进行此尝试。高可用性仅尝试重启尽力而为的 VM 一次。如果此尝试失败,高可用性将不再尝试重启该 VM。此值在 xe CLI 上为
best-effort,在 XenCenter 中为如果可能则重启。 - 未受保护:如果 VM 或其主机意外脱机,HA 不会尝试重启该 VM。这是默认设置。此值在 xe CLI 上为空字符串,在 XenCenter 中为不重启。
高可用性绝不会停止或迁移正在运行的 VM 以释放资源来重启具有更高重启优先级的 VM。
启动顺序
启动顺序是 XenServer 高可用性在发生故障时尝试重启受保护 VM 的顺序。此值仅用于受保护的 VM。默认值为 0,这是最高优先级。启动顺序值为 0 的受保护 VM 会首先重启。启动顺序值越高,VM 在序列中重启的时间就越晚。
池行为
在 XenServer 池中启用 HA 后,池会表现出以下行为。
设置期间的行为
在池中启用 HA 时,池协调器会执行以下设置:
- 计算初始故障转移计划。
- 配置数据库以将更新写入心跳 SR。此设置可确保在主机发生故障时不会丢失 VM 配置更改。
- 在心跳 SR 上设置池协调器元数据。
所有池成员:
- 相互发送网络心跳。因此,当池中的主机验证它们之间可以通信时,管理网络流量会略有增加。启用 HA 后,此网络流量会持续存在。
正常运行期间的行为
在正常运行期间,HA 池的池协调器会执行以下操作(除了其常规功能之外):
- 动态维护故障转移计划。此计划详细说明了在任何给定时间池中一组主机发生故障时应执行的操作。此计划考虑了可容忍的最大主机故障数量,并确保所有受保护的 VM 都可以重新启动。该计划会根据 VM 生命周期操作和移动进行动态重新计算。如果更改(例如,向池中添加新的 VM)意味着在达到最大主机故障数量后无法再重新启动所有受保护的 VM,则无法计算计划,并且池会处于过载状态。当池处于过载状态时,XenServer 会通过 XenCenter、电子邮件、SNMP 陷阱或 NRPE 警报发出警报。
在正常运行期间,HA 池的每个成员会执行以下操作(除了其常规功能之外):
- 检查池协调器是否处于活动状态。主机通过尝试在共享存储上获取“主锁”来执行此操作。如果池协调器已存在,则此尝试会失败
- 发送网络心跳。此网络心跳通过管理网络上的 UDP 端口 694 发送到池中的所有其他主机。
- 维护池中活动主机集的记录。根据每个独立主机,活动主机集是它认为处于活动状态的其他主机的集合。如果主机在 HA 超时(默认情况下为 60 秒)指定的时间段内未收到来自另一主机的网络心跳,它会与池中的其他主机通信,以确定是否必须更新活动主机集。
- 写入存储心跳卷上的状态文件。此操作验证主机是否仍可访问存储。它还允许主机相互通信其状态(除了与网络心跳的通信之外)。
- 更新心跳 SR 上的数据库。主机记录对其托管的 VM 的 VM 配置的任何更改。
启用 HA 时,某些池操作会被阻止或不建议执行。暂时禁用高可用性以执行这些操作:
- 将主机添加到池中。
- 从池中删除主机。如果此操作可能导致池超额分配,则会被阻止。
- 关闭池中的主机。如果此操作可能导致池超额分配,则会被阻止。
- 更改管理网络。
- 更改附加到池的 SR。
- 启用群集。对于群集池,某些高可用性行为和要求有所不同。有关详细信息,请参阅群集池。
在正常操作期间,在池中执行这些操作不会激活 HA 故障转移计划:
- 从 XenCenter 或 xe CLI 正常关闭 VM。HA 机制不认为此 VM 已失败,也不会尝试重新启动它。有关此操作的详细信息,请参阅 关闭受高可用性保护的 VM
- 从客户机操作系统内部的 VM 崩溃或正常关闭,如果 HA 已配置为在内部关闭时不会自动重新启动 VM。在这种情况下,HA 机制不认为 VM 已失败,也不会尝试重新启动它。有关此设置的详细信息,请参阅 配置内部关闭的 VM 的重新启动行为
- 从 XenCenter 或 xe CLI 正常关闭主机。HA 机制不认为此主机已失败,也不会尝试重新启动其上托管的任何 VM。但是,如果此操作导致池超额分配,则会被 XenServer 阻止。有关此操作的详细信息,请参阅 启用高可用性时关闭主机
硬件故障或基础架构不稳定期间的行为
在此阶段,池中的所有主机负责检测其自身的连接状态,并就池中其他主机的连接状态达成一致。
XenServer HA 检测并处理以下类型的故障:
- 故障主机:在这种情况下,所有剩余主机很快就会发现故障主机已停止更新状态文件,并且不再发送网络心跳。经过适当的延迟后,这些主机将从活动集中移除。
- 网络分区:在这种情况下,一个或多个主机无法与一个或多个其他主机通信。主机发现它在定义的超时时间内未收到来自一个或多个其他主机的网络心跳,并启动故障处理程序。此故障处理程序通过状态文件和正常工作的网络心跳进行通信,并使用该信息来确定存在哪些网络分区(可以相互通信的主机组)。最大分区中的主机是活动集并得以幸存。如果存在大小相等的分区,则包含具有最低主机 UUID 的主机的分区中的主机得以幸存。
- 存储连接失败:在这种情况下,主机发现它无法访问存储,或者其他主机发现其更新未出现在存储上。主机通过网络心跳通信进行通信,以检查其他主机是否已失去存储访问权限:
- 如果所有主机都失去了存储但未失去网络,则这被视为存储的暂时丢失,主机将保持运行以等待存储恢复。任何进一步的故障都会导致池中的所有主机进行隔离。此规则可防止存储成为单点故障。
- 如果只有部分主机失去了存储访问权限,但所有主机仍然具有网络访问权限,则这些主机将从活动集中移除。
如果主机知道它在池中的大多数主机看来将处于故障或不可访问状态,则该主机将进行自我隔离。隔离是一种预期行为,旨在作为 VM 数据的保护措施。它确保 VM 不会同时在两个位置运行。主机使用以下标准来决定是否需要自我隔离:
- 如果主机的工具栈未运行且无法重新启动,则主机将进行自我隔离。
- 如果主机同时失去了网络和存储心跳,则主机认为自己不可访问并进行自我隔离。
- 如果主机失去了存储心跳,但仍在接收网络心跳:
- 如果主机仍然可以联系所有其他池成员,并且所有这些成员也失去了存储心跳,则主机将保持活动状态。这种情况可防止存储成为单点故障并隔离整个池。
- 如果主机无法联系池中的一个或多个其他主机,则它将进行自我隔离。
- 如果主机失去了任何网络心跳,但仍具有存储心跳,则它会确定自己是否在最大的网络分区中。如果不是,则主机将进行自我隔离。
- 存在网络通信故障可能将池分成大小相等的分区的可能性。如果主机使用心跳 SR 上的状态文件中的信息,知道自己处于这样的网络分区中:
- 如果分区包含具有最低 UUID 的主机,则该主机保持活动状态。
- 如果分区不包含具有最低 UUID 的主机,则该主机将自我隔离。
当执行隔离操作时,主机将立即突然重启,导致其上运行的所有虚拟机停止。被隔离的主机进入重启序列,并在重启后尝试重新加入资源池。
恢复期间的行为
如果池协调器是已失败、被隔离或变得不可访问的主机,则其他主机将尝试获取主锁。成功获取锁的主机将成为新的协调器。
已自我隔离的主机将重启并尝试重新加入池。
当主机被标记为死亡且其虚拟机已停止时,池协调器负责以下恢复操作。
- 根据故障转移计划重启所有受保护的虚拟机。
- 如果没有足够的资源来启动所有受保护的虚拟机,池协调器将等待直到资源可用(例如,如果之前被隔离的主机重新加入池),然后尝试启动受保护的虚拟机。
- 在所有受保护的虚拟机成功启动后,池协调器将尝试重启每个尽力而为的虚拟机一次。