关于XenServer的高可用,这篇都说清楚了
启迪云-高级开发工程师 杨俊概述随着云计算市场的快速发展,用户对服务的实时性需求越来越高,系统的稳定性和可用性显得尤为重要。高可用性HA(High Availability)可以做到尽量缩短日常计划维护的操作和突发的系统崩溃所导致的停机时间,以提高系统和应用的可用性。所以HA是目前云计算中防止核心计算机系统因故障停机最有效的手段。那么在本文中我们一起探讨一下,高可用性在XenServer中是如何应
启迪云-高级开发工程师 杨俊
概述
随着云计算市场的快速发展,用户对服务的实时性需求越来越高,系统的稳定性和可用性显得尤为重要。高可用性HA(High Availability)可以做到尽量缩短日常计划维护的操作和突发的系统崩溃所导致的停机时间,以提高系统和应用的可用性。所以HA是目前云计算中防止核心计算机系统因故障停机最有效的手段。那么在本文中我们一起探讨一下,高可用性在XenServer中是如何应用的。
高可用集群(HA):
高可用集群在指发生单点故障时,可以从其他正常工作的节点中选出一个节点替换故障节点,继续提供服务,即将有故障节点上的资源和服务转移到工作正常的节点上。保证服务不中断,一直在线,用户对底层的资源切换无任何感知。
XenServer的HA尽量保持VM一直处于运行状态,即使当管理员不在时,发生资源池中的硬件损坏。下图中展示了包含HA的资源池,两个主机之间网络连接出现问题前后的变化。
XenServer在启用HA时,资源池中所有的主机,通过网络定期交换心跳信息,并将心跳信息发送到共享存储设备,不断尝试获取共享存储的“master lock”权限。
XenServer HA旨在发生单点故障后,消除单点故障的影像,尽可能在剩余资源池上运行业务。首先需要找出属于最大全连接组(以下简称“liveset”)的VM,用“master lock”选择一个Master,重启丢失连接的VM。
XenServer HA实现的主要组件有xapi、xen、xhad。
- Xapi用于配置HA策略,即哪些网络存储用于心跳,发生故障之后哪些VM需要重启。配置和管理xhad心跳守护进程。Xapi在本地数据库主要存储了两个设置:1.ha_disable_failover_actions通常设置为false,表示节点可以恢复VMs,在HA禁用过程中设为true,防止仅部分启用HA发生脑裂 2. ha_armed设为true表示xapi在host启动加入liveset时启动xhad
- Xen主要应用于主机被集群部分或完全隔离时,xen的监控程序保证主机的隔离。
- Xhad是集群成员守护进程,通过网络和存储心跳维护集群中的主机。Xhad是通过在每个主机/etc/xensource/xhad.conf中进行配置,高可用集群中,每个主机上该配置文件都必须保持一致,如果不一致将导致HA不可用。Xhad.conf是用XML编写的,包含了资源池范围配置和本地主机配置。资源池范围配置包括集群所有活动的主机及全局超时信息。本地主机配置记录了本地主机的信息及用于本地网络接口和块存储的心跳设备。以下是xhad.conf文件示例:
<?xml version="1.0" encoding="utf-8"?><xhad-config version="1.0"><!--pool-wide configuration--><common-config><GenerationUUID>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</GenerationUUID><UDPport>694</UDPport><!--for each host, specify host UUID, and IP address--><host><HostID>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</HostID><IPaddress>xxx.xxx.xxx.xx1</IPaddress></host> <host><HostID>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</HostID><IPaddress>xxx.xxx.xxx.xx2</IPaddress></host> <host><HostID>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</HostID><IPaddress>xxx.xxx.xxx.xx3</IPaddress></host> <!--optional parameters [sec] --><parameters><HeartbeatInterval>4</HeartbeatInterval><HeartbeatTimeout>30</HeartbeatTimeout><StateFileInterval>4</StateFileInterval><StateFileTimeout>30</StateFileTimeout><HeartbeatWatchdogTimeout>30</HeartbeatWatchdogTimeout><StateFileWatchdogTimeout>45</StateFileWatchdogTimeout><BootJoinTimeout>90</BootJoinTimeout><EnableJoinTimeout>90</EnableJoinTimeout><XapiHealthCheckInterval>60</XapiHealthCheckInterval><XapiHealthCheckTimeout>10</XapiHealthCheckTimeout><XapiRestartAttempts>1</XapiRestartAttempts><XapiRestartTimeout>30</XapiRestartTimeout><XapiLicenseCheckTimeout>30</XapiLicenseCheckTimeout></parameters></common-config> <!--local host configuration--><local-config><localhost><HostID>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx2</HostID><HeartbeatInterface> xapi1</HeartbeatInterface><HeartbeatPhysicalInterface>bond0</HeartbeatPhysicalInterface><StateFile>/dev/statefiledevicename</StateFile></localhost></local-config> </xhad-config>
参数说明:
- GenerationUUID:每次重新配置HA时生成的一个UUID。这个参数可以让Xhad做到通知故障节点,已将它从配置中移走,HA系统重置,UUID已经发生变化。
- UDPort:用于心跳的端口号。需要确保所有的主机上该端口号未被其他进程占用,并且没有被防火墙屏蔽。
- HostID:标识资源池中主机的UUID。
- IPaddress: 远程主机的IP地址,通常配置xapi的管理网。
- HeartbeatTimeout: 设定心跳包接收的超时时间。如果超过这个时间没有收到心跳包,xhad认为心跳失败。用“T”来表示, T必须大于10,通常使用60秒。
- StateFileTimeout:如果在设定的时间内没有得到主机存储的更新,那个xhad认为存储心跳连接异常。一般设置和HeartbeatTimeout相同的时长T。
- HeartbeatInterval: 心跳包发送时长间隔。通常使用2<=t<=6,根据HeartbeatTimeout 的值通过公式t=(T+10)/10计算得出。
- StateFileInterval:存储更新间隔时长,通常跟HeartbeatInterval设置为一样的值。
- HeartbeatWatchdogTimeout:如果主机在设置的时间内没有发送心跳,则主机监视程序开始防护,通常设置为T。
- StateFileWatchdogTimeout:如果主机在设置时间内没有更新文件状态,则主机监视程序开始防护,通常设置为T+15
- BootJoinTimeout:当主机启动并加入集群时,如果超过设置的值,将视为加入失败,通常将该值设置为T+60
- EnableJoinTimeout:当主机首次启动HA时,如果超过该设置时长,则认为加入失败。通常将该值设置为T+60
- XapiHealthCheckInterval:“运行状况检查”的间隔时长,通过运行脚本检查xapi是否响应
- XapiHealthCheckTimeout: 假设xapi死锁之前等待时长
- XapiRestartAttempts:停止未响应的xapi之前,尝试重启xapi的最大次数
- XapiRestartTimeout:重启xapi等待时长
- XapiLicenseCheckTimeout: xhad终止之前等待xapi 许可证检查时长
启用HA
在启用HA之前管理员必须正确配置环境。特别是:
- 用于网络心跳的NIC绑定应该可用;
- 存储心跳配置了multipath;
- 所有主机都在线并完全启动。
XenAPI客户端可以使用特定的共享SR(Storage Repository)用于存储心跳,否则Xapi将使用资源池默认的SR。Xapi将使用VDI_GENERATE_CONFIGAPI确保在加入liveset之前磁盘将自动添加到系统引导。
需要注意的是,为了重用现有心跳VDI,需要一些额外的设置:
- 如果在某些主机脱机的情况下禁用HA,则在重新启动这些主机时,它们更有机会得到格式正确但是无效状态文件。如果在HA禁用时销毁了VDI,则稍后启动的主机将无法连接磁盘,并且难以区分是临时存储故障还是HA被禁用。
- 心跳SR可以在昂贵的低延迟高可靠性存储上创建,并尽可能小(以最小化基础设施成本),HA一旦成功启用,它肯定不会耗尽空间并且之后无法启用。
Xapi到Xapi的通信如下:
Xapi Pool master 同时调用资源池中所有的主机的Host.ha_join_liveset。每个主机都运行ha_start_daemon脚本来启动Xhad。每台主机上的Xhad按照xhad.conf中配置网络和存储交换心跳。
加入LiveSet
xhad实例交换心跳并确定哪些主机在“liveset”中以及哪些主机已从“liveset”中被隔离。
如果“liveset”中的某个主机完全关闭服务,就会打上“excluded”标记,当该主机再次加入“liveset”后,该“excluded”标志会被清除掉。仅在一个主机完全关机又重启才会有该标志。
xapi通过ha_query_liveset命令定期查询xhad的状态。在加入“liveset”前xhad状态一直为“Starting”,直至加入“liveset”后,xhad状态才转变成“Online”。
xapi是否参与主节点的选举,依赖于ha-start-daemon脚本的返回。第一次启用HA时,集群已经有一个master。之后当该master节点异常被隔离之后,剩余的主机会选举它们其中的一个节点作为集群新的master。
关闭一个主机
当关闭一个主机时,可以安全地从池中“排除”它,使得存储心跳的故障不会导致资源池的主机自我隔离。当一个主机有“excluded”标记时,其他主机将不会把它当做master并且不会锁定资源,即不会有VM在其上运行。一个被排除在外的主机永远不会成为“裂脑”的一部分。
一旦某个主机放弃其主角色并关闭虚拟机,就可以使用ha_disarm_fencing禁用防护,用ha_stop_daemon停止xhad进程。守护程序停止后,可以在状态文件中设ha_set_excluded为“excluded”,主机就可以安全地重新启动。
更多推荐
所有评论(0)