- 虚拟机高可用(HA)
在FusionSphere解决方案中,虚拟机高可用特性指虚拟机在其运行的主机发生故障(比如异常掉电),或者虚拟机状态异常(比如虚拟机状态变为ERROR)时,在其他可用主机上重建新的虚拟机,并保留原来虚拟机的网络、存储。
- HA的条件
2.1 主机故障触发虚拟机HA
管理节点与计算节点之间有管理面心跳检测,当此心跳检测超时中断时,判定计算节点为故障状态(CPS组件将节点标记为Fault)。主机变为fault目前是触发主机上的虚拟机HA的唯一条件。
但是,触发虚拟机HA流程,不代表虚拟机应该执行HA,因为导致主机变为Fault的可能原因有:主机管理网络断连,主机下电或者是主机重启,或者是心跳检测进程故障。其中只有主机下电或者重启才需要执行虚拟机HA。因此需要通过探测vlan和存储面防脑裂等机制来阻止HA的发生。
2.2 虚拟机状态异常触发HA
当系统侦测到处于ERROR状态(对应vm_state字段,虚拟机状态)的虚拟机时,触发该虚拟机HA。虚拟机变为ERROR的原因,一定是发生了业务操作与异常;或者ACTIVE状态+SHUTDOWN电源状态(对应power_state字段),触发虚拟机HA。
2.3 触发HA与异地重建(真正执行HA)
触发HA指:通过执行nova instance-action-list vm_id命令存在reschedule操作记录
异地重建只通过防脑裂探测真正去执行HA,正常情况虚拟机应该能够变为active
触发HA与异地重建的关系如下图所示
- 不会触发HA的约束条件
当全局HA启用,虚拟机处于故障场景下,会有一部分虚拟机因下述条件,不触发HA:
1) 任务状态为Rebuilding,此时虚拟机正在HA或者卡在了中间态(会被定时审计恢复)
2) 虚拟机关闭了HA功能(参考虚拟机HA功能接口说明)
3) 为指定主机创建的虚拟机
4) 虚拟机处于Deleting任务状态
5) ERROR状态为虚拟机创建失败导致
6) 虚拟机使用本地系统盘,而本地系统盘虚拟机HA开关被关闭时
7) 虚拟机使用了直通本地硬盘,或者直通PCI网卡,或者直通GPU,或者直通FPGA卡
8) 虚拟机被管理员锁住(Lock)
9) 虚拟机系统卷被卸载
- 探测vlan(业务面防脑裂)
4.1 配置
Nova侧默认配置项为autorecovery_vlan_detect=True,默认打开。在开启虚拟机HA开关前要确保所有物理网络都已经预留了探测vlan
4.2 原理
从预判方面看,主机fault告警的含义是主机在管理平面不可感知(管理网络断连、主机重启或下电),如果直接执行虚拟机HA,新旧虚拟机并存则脑裂。针对此种情况5.1版本引入了对虚拟机使用业务平面的vlan检测,从业务面检测源端VM电源状态。但其劣势,首要的是不能完全正确反应业务状态,反而可能出现业务已断,检测通过的情况,阻碍HA执行。二,在于是基于时间点的检查,会受网络闪断或一些特殊的网络故障影响。
用户在cps上配置物理平面的探测VLAN,系统会在物理平面对应的网桥上创建om-xxx的探测端口。oam-network-agent会对这些探测端口进行监听,同时对外提供provider_ping的探测接口。nova-compute在HA的时候会调用provider_ping指定物理平面进行探测。oam-network-agent根据调用的参数发送探测请求广播报文,对端的oam-network-agent接收到探测报文之后会查询虚拟机状态,然后构建返回探测响应报文。
如何测试探测vlan是否生效?
如果vm1在节点Compute1上,可以在节点Compute2上执行探测脚本:
python /etc/fusionnetwork/oam-network-agent/provider_ping.py '{"provider_name": ["physnet2"], "vm_uuid": "0e1c002a-986f-4bfb-b5a4-882069a2189e"}';physnet2是配置了探测vlan的物理网络平面名称,vm_uuid是虚拟机uuid。
- 管理面防脑裂(libvirt)
5.1 配置
在虚拟机所在物理主机的openstack环境的cps-web上配置项为配置->openstack ->nova,修改管理面防脑裂开关
对应后台为nova-compute 的配置项autorecovery_mgmt_protect
5.2 原理
通过管理面与源主机的libvirt建立连接,查看虚拟机的状态是否为shutdown或者active,这两种状态认为虚拟机还活着,HA终止
- 存储面防脑裂
6.1 配置
在虚拟机所在物理主机的openstack环境的cps-web上配置项为配置->openstack ->nova,修改存储面防脑裂开关。
cps template-params-update --service nova nova-compute --parameter autorecovery_had_protect=True
cps template-params-update --service nova autorecovery-had --parameter autorecovery_had_protect=True
6.2 原理
当打开防脑裂开关,会自动对该主机上的所有虚拟机的系统卷进行加锁,关闭存储防脑裂会释放锁。虚拟机更换主机会将源主机锁释放,在目的主机创建新锁。
机制:业界处理集群I/O fencing通常是采用存储面scsi3协议支持的persistent reservation机制(简称scsi3锁),基于该机制可以建立挑战形式的存储锁方式:源端主机管理程序注册并预留虚拟机的系统卷scsi3锁,然后持续检查锁的注册信息,如果他人的注册信息有就立刻清除。当源端存活时,他人是无法抢占锁的注册信息的,经过多次尝试后,他人就知道源端主机存活着,即挑战失败。反之为挑战成功。
说明:挑战的系统盘列表由nova-compute维护,had进程持久化,不再调用libvirt接口获取
保护阶段:had通过libvirt事件和周期性检查,生成VM保护列表,进行锁周期性保护,保护周期未6s。
- 如果SCSI 3锁没有任何节点注册信息,将本节点注册上
- 如果SCSI 3锁包含本节点注册信息,将其他节点注册信息清楚
- 如果SCSI 3锁不包含本节点注册信息,进入挑战模式
自动恢复挑战:VM自动恢复任务生成后,当任务调度到目标主机后,nova-compute调用had接口进行挑战。had挂载volume到主机,并生成挑战任务列表,进入挑战模式。
挑战模式:had周期检查或者自动恢复任务触发的时候,如果本节点的volume不包含本节点的注册信息,但是包含其他节点的注册信息,进入挑战模式。
- 将本节点信息注册到SCSI 3锁
- 等待30s,观察锁是否被擦除
- 如果被擦除,说明其他节点存活,挑战失败
如果挑战失败,进行如下处理:
- 将挑战任务设置为失败,供nova-compute查询
如果挑战成功,进行如下处理;
- 将挑战任务设置为失败,供nova-compute查询
- 将volume的SCSI 3锁修改为本主机
6.3 常用命令
6.3.1 查看该主机上某个虚拟机nova侧是否预留锁
cat /etc/autorecovery/had_devices.json | grep vm_id
cat /etc/autorecovery/had_devices.json | grep 64ddb925-6df8-448c-87a4-5a3998b680d3
{"31d48ee9-7da0-4129-80b4-c114de16ad0c": {"instance_uuid": "64ddb925-6df8-448c-87a4-5a3998b680d3", "host_path": "/dev/disk/by-id/wwn-0x604b0e7100a8593211c48cb500000bbd", "volume_uuid": "31d48ee9-7da0-4129-80b4-c114de16ad0c", "status": "reserved", "request_id": "req-0fe02f80-1d34-4f83-9261-5023de9717a9"},
6.3.2 读取锁注册信息:sg_persist -n -i -k -d /dev/xx(设备路径也可查询虚拟机的xml文件),每条多路径都有锁注册信息
6.3.3 读取锁预留信息:sg_persist -n -i -r -d "/dev/disk/by-id/wwn-0x604b0e7100a8593211c48cb500000bbd", 一个设备只有一个
6.3.4 清除锁
sg_persist -n -o -C -K <key> -d <device>
- 开关配置
目前fusioncloud2.0.6.1(SPC550以上)和fusioncloud6.1版本允许打开HA开关,之前的版本HA不商用交付。
在FusionSphere WebUI上提供全局虚拟机HA功能开关,可以在全局范围内启用或关闭虚拟机HA功能。本地虚拟机HA开关建议关闭。
单个虚拟机可以启用或关闭自身的HA功能,使用虚拟机metadata参数控制。虚拟机默认启用HA功能:nova meta vm-id set _ha_policy_type=close
虚拟机启用HA功能,保证虚拟机或虚拟机所在主机故障时,及时在其他主机重建虚拟机,保证虚拟机可靠性。如果开启了虚拟机HA功能开关,为了防止HA后虚拟机脑裂,建议打开以下配置:
1),请确保所有物理网络已经预留了探测VLAN,具体参考配置网络中的物理网络配置 章节。
2),存储面防脑裂开关,存储面防脑裂目前支持对接V3、FusionStorage场景,具体配置步骤参见配置虚拟机HA存储面防脑裂功能,此开关默认为关闭。如果要关闭虚拟机HA功能开关,则必须把存储面防脑裂开关也关闭掉。管理面防脑裂开关,具体配置步骤参见配置虚拟机HA管理面防脑裂功能,此开关默认为关闭。
3),为了避免主机大规模故障(如大规模掉电等场景)时同时触发过多的HA任务,可以配置限制规则,参考以下配置流控策略:
- 主机级别控流,具体配置步骤请参见配置限制虚拟机群体HA规则。
- 全局HA任务流控,具体配置步骤请参见配置全局HA任务最大个数。
4),建议将HA延时时间设置为300秒。具体操作请参见配置HA功能默认延时。
5),开启虚拟机HA功能开关之后,还可以设置虚拟机发生HA后上报告警功能。具体的配置步骤请参见配置虚拟机发生HA上报告警功能,此开关默认为关闭。开启虚拟机发生HA后上报告警,虚拟机发生HA后,立即上报HA触发告警。
- 代码位置
8.1 nova-api定时任务检查是否HA nova.nova_extension.instanceha.manager.InstanceHAManager#_start_main_worker_threads
8.2 nova-compute HA实现nova.huawei.compute.manager.HuaweiComputeManager#_do_reschedule_instance
8.3 防脑裂检查autorecovery.had.manager.HadManager#init_host
- 问题定位
1),确认是否触发ha:nova instance-ha-events vmid (101表示虚拟机状态异常触发ha,102表示主机fault触发ha)
2),若在触发虚拟机ha的场景下,虚拟机没有生成ha事件,则是防群体策略限制
主机级别控流,具体配置步骤请参见配置限制虚拟机群体HA规则,默认两个小时内只有两个主机的虚拟机能够发生HA。
全局HA任务流控,具体配置步骤请参见配置全局HA任务最大个数,默认最大任务数为60。
3)查看ha的req-id:nova instance-action-list vmid,然后到nova-scheduler日志中搜索日志,确认选到的目的主机,再到源节点和目的节点的nova-compute日志中搜索日志,确认故障原因;
也可以使用:nova migration-list |grep vmid,查看ha的源和目的节点,该命令会返回所有迁移的记录,其中rechedule类型的表示ha的记录。
3). 探测vlan防脑裂拦住在目的主机日志为:
Result为ok代表源端虚拟机还活着,本地HA任务退出;result为bad,则继续执行HA。
4)管理面防脑裂拦住在目的主机日志为:
Had_res中的状态不为success,则源端虚拟机还活着,HA终止。
Had_res中的状态为success,则HA任务继续。
5)存储面防脑裂拦住在目的主机日志为:
6)后续走入创建虚拟机流程,根据具体error日志定位