虚拟机HA原理及问题定位

  1. 虚拟机高可用(HA)

在FusionSphere解决方案中,虚拟机高可用特性指虚拟机在其运行的主机发生故障(比如异常掉电),或者虚拟机状态异常(比如虚拟机状态变为ERROR)时,在其他可用主机上重建新的虚拟机,并保留原来虚拟机的网络、存储。

  1. 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与异地重建的关系如下图所示

 

  1. 不会触发HA的约束条件

当全局HA启用,虚拟机处于故障场景下,会有一部分虚拟机因下述条件,不触发HA

1) 任务状态为Rebuilding,此时虚拟机正在HA或者卡在了中间态(会被定时审计恢复)

2) 虚拟机关闭了HA功能(参考虚拟机HA功能接口说明)

3) 为指定主机创建的虚拟机

4) 虚拟机处于Deleting任务状态

5) ERROR状态为虚拟机创建失败导致

6) 虚拟机使用本地系统盘,而本地系统盘虚拟机HA开关被关闭时

7) 虚拟机使用了直通本地硬盘,或者直通PCI网卡,或者直通GPU,或者直通FPGA卡

8) 虚拟机被管理员锁住(Lock)

9) 虚拟机系统卷被卸载

  1. 探测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。

  1. 管理面防脑裂(libvirt)

5.1 配置

在虚拟机所在物理主机的openstack环境的cps-web上配置项为配置->openstack ->nova,修改管理面防脑裂开关

对应后台为nova-compute 的配置项autorecovery_mgmt_protect

5.2 原理

通过管理面与源主机的libvirt建立连接,查看虚拟机的状态是否为shutdown或者active,这两种状态认为虚拟机还活着,HA终止

  1. 存储面防脑裂

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>

  1. 开关配置

目前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触发告警。

  1. 代码位置

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. 问题定位

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日志定位 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值