解决之前先来看一下现在的环境,目前的生产环境是 CloudUltra V4.4(OpenStack底层) 搭配惠普3Par盘阵存储的虚拟化集群。
问题描述:
系统在创建虚拟机时3-7秒左右就提示失败,错误内容为 createVirtualMachine 异步失败。尝试创建云硬盘也会爆出相同的错误。但是此时所有虚拟机运行良好,已创建的硬盘可以挂载并使用。
解决思路:
之前曾经出现过这个问题,当时属于RabbitMQ集群出现异常,但是计划排查时遇到了问题:在之前的情况下,根据失败ID在haihe服务器上查看openstack-gateway.log(/var/log/haihe/openstack-gateway/openstack-gateway.log)日志,可以通过日志中的 OS-EXT-SRV-ATTR:host 参数上确定该虚拟机分配的计算节点,但是这里观看的参数为 null ,代表该虚拟机尚未分配计算节点就进入了异常状态。
此时尝试使用rabbitmq卡顿的方法来解决问题,在所有控制节点上执行了以下命令:
1 2 |
systemctl restart rabbitmq* rabbitmqctl purge_queue notifications.info |
执行后再次尝试创建虚拟机,问题依旧。此时考虑到另一种可能导致异步失败的原因,既然创建云硬盘依旧报警,有一定概率是3par出现问题。登录3par执行命令:
1 |
hp-3par-vm cli% showport |
观察输出,大部分节点均为ready状态,不存在loss_sync。到机房查看光模块也都正常。到这里可以暂时排除硬件问题,继续检查服务状态,还是3par上执行:
1 2 |
hp-3par-vm cli% showwsapisession no WSAPI sessions listed |
这里发现了异常,CU的链接是通过3par的Web Services API的,所以正常情况下不应出现空列表,这个情况代表CU已经无法对3par进行操作,只能使用以前创建的存储了。此时到haihe服务器使用telnet 3par_ip 8008 命令无法正常访问,怀疑是服务出了问题。
1 |
hp-3par-vm cli% showwsapi |
检查3par是否开启了http端口,输出中HTTP_State状态为Enable。怀疑3par服务卡死,重启wsapi。
1 2 3 4 5 6 7 |
hp-3par-vm cli% stopwsapi Are you sure you want to stop the Wab Services API server? select q=quit y=yes n=no: y The Web Services API server stopped successfully hp-3par-vm cli% startwspi The Web Services API server will start shortly. |
启动成功后,再次使用showwsapisession命令,发现连接数依旧是空。此时可以判断是CU底层的cinder出现了问题。在所有的控制节点上执行下列命令重启cinder服务:
1 |
systemctl restart openstack-cinder-volume.service |
重启后,观察日志文件volume.log(/var/log/cinder/volume.log),当出现Driver post PRC initialization completed successfully. 时意味着该服务已经重启成功。重启后在3par上查看wsapisession,发现有haihe节点没有成功的重新连接,此时还需在haihe上执行下列命令以重启haihe的3par agent。
1 |
systemctl restart haihe-monitoring-3parcollector |
重启后,再次创建云主机或硬盘,很快创建成功,问题解决。
结论:
分配计算节点后异步失败,查看计算节点日志和rabbitmq队列是否堆积,大概率是队列卡死导致。(清理队列,重启服务)
没有分配节点,查是否3par连接失败或服务失败。(参考上文重启对应服务)
虚拟机异步失败大部分都是由于存储导致的,切记。