【问题描述】
OpenStack云平台上1个控制节点因未知原因重启,导致Rabbitmq消息队列积压。OpenStack是K版本,Rabbitmq是3.3.5版本。
【问题分析】
由于OpenStack控制节点未知原因导致重启,致使Rabbitmq队列消息积压。可以通过登录Rabbitmq管理页面针对存在消息积压的队列进行Purge清除;若是不行,还可以通过执行的方式对消息队列进行清楚;最后若是前二者没有起到作用的话,可以重启3个控制节点的rabbitmq-server服务来清除积压的消息。
队列有消息积压时,首先要查看Rabbitmq集群是否正常,然后再观察队列消息是否持续积压增长,排除隐患
【处理方法】
先查看集群状态,正常
rabbitmqctl cluster_status
结果:Nodes、running_nodes 个数都是3个,{partitions,[]},partitions为空值,说明为出现脑裂
1、页面检查,清楚积压的消息,Queues-->点击进去积压的队列-->Purge
登录Rabbitmq页面
点击Queues ,进入Queues管理页面,点击 Ready 倒序排列
观察页面消息队列积压情况,目前积压的消息没有继续增长的现象
1)点击Queues进入消息队列页面
2)选择一个有消息积压的队列,点击进入队列详情
3)点击队列详情页面,右下角“Purge”对该队列积压的消息进行清除
正常效果:页面过一小段时间会自动清除积压的消息队列,ready的数量应该很小或者为0
异常情况:页面弹框“多个页面无响应”,页面卡顿,清除操作无效果
2、在部署机上,执行指令进行销毁
先找一个消息积压的队列,获取到队列的名称
rabbitmqctl purge_queue
执行命令,执行完后在页面查看这个队列堆积的消息是否清除
若是上面指令不对,可以使用这个指令mq版本3.3.5:
rabbitmqctl -q purge_queue
rabbitmqctl -n <主机名> -q purge_queue
3、页面清除和指令清除积压的消息队列都没有效果,建议同时重启三台控制节点的rabbitmq-server ,然后重启所有计算节点的:openstack-nova-compute.service 服务和所有计算和控制节点的: neutron-openvswitch-agent.service 服务
核实确认目前,队列积压消息没有新增,操作过程需要重启neutron服务,会对业务有1-2秒的网络中断影响(若是重启neutron-ovs-cleanup.service调度服务网络可能会有1ms的中断可能会丢1-2个包,但是本次操作不需要重启neutron-ovs-cleanup.service服务;对于重启neutron-openvswitch-agent.service服务对整个云平台本身是没有实质性影响的;为了规避操作风险,对外口径统一为对云平台网络会有1-2s的网络影响)。3个控制节点上同样也有neutron-openvswitch-agent.service操作过程中也需要重启
准备阶段:
整理编辑ansible操作的hosts文件
/etc/ansible/hosts
openstack-controller 为 OpenStack控制节点模块
openstack-compute 为 OpenStack计算节点模块
hosts内容如下:
[all:vars]
ansible_ssh_user=root
ansible_ssh_pass=XX@xxoo
[openstack-controller]
Ip1
Ip2
Ip3
[openstack-compute]
nodeip1
nodeip2
......
1)登录openstack控制节点,检查集群状态以及rabbitmq-server状态
rabbitmqctl cluster_status
ansible -i /etc/ansible/hosts openstack-controller -m shell -a 'systemctl status rabbitmq-server'
2)检查所有控制节点和计算节点相应的服务状态
ansible -i /etc/ansible/hosts openstack-compute -m shell -a 'systemctl status openstack-nova-compute.service'
ansible -i /etc/ansible/hosts openstack-controller -m shell -a 'systemctl status neutron-openvswitch-agent.service'
ansible -i /etc/ansible/hosts openstack-compute -m shell -a 'systemctl status neutron-openvswitch-agent.service'
实施阶段:
1)登录openstack控制节点,批量重启rabbitmq-server服务,并检查rabbitmq-server服务的状态,以及Rabbitmq集群状态
ansible -i /etc/ansible/hosts openstack-controller -m shell -a 'systemctl restart rabbitmq-server'
ansible -i /etc/ansible/hosts openstack-controller -m shell -a 'systemctl status rabbitmq-server'
rabbitmqctl cluster_status
2)重启所有计算节点相应的服务openstack-nova-compute.service、neutron-openvswitch-agent.service 状态并检查服务状态,重启所以控制节点nova、neutron-openvswitch-agent.service服务并检查服务状态
ansible -i /etc/ansible/hosts openstack-controller -m shell -a 'openstack-service restart nova '
ansible -i /etc/ansible/hosts openstack-controller -m shell -a 'openstack-service status nova '
ansible -i /etc/ansible/hosts openstack-compute -m shell -a ' systemctl restart openstack-nova-compute.service'
ansible -i /etc/ansible/hosts openstack-compute -m shell -a ' systemctl status openstack-nova-compute.service'
ansible -i /etc/ansible/hosts openstack-controller -m shell -a 'systemctl restart neutron-openvswitch-agent.service'
ansible -i /etc/ansible/hosts openstack-controller -m shell -a 'systemctl status neutron-openvswitch-agent.service'
ansible -i /etc/ansible/hosts openstack-compute -m shell -a 'systemctl restart neutron-openvswitch-agent.service'
ansible -i /etc/ansible/hosts openstack-compute -m shell -a 'systemctl status neutron-openvswitch-agent.service'
验证阶段:
1)登录openstack控制节点检查集群状态
rabbitmqctl cluster_status
nodes、running_nodes分别为3个节点,partitions为空值,表明Rabbitmq未出现脑裂现象
2)登录openstack基础云Rabbitmq页面,检查是否有消息积压
Queues对应Ready列ready的数量应该很小或者为0
3)所有计算节点的nova-compute服务状态
nova service-list
对应的State值为up,Status为enabled
【附带问题】
操作完之后,发现OpenStack云平台的云主机网络都出现了中断,此时需要重启OpenStack控制节点上的 neutron服务,重启完 neutron服务后,OpenStack云平台云主机的网络便自动恢复正常
ansible -i /etc/ansible/hosts openstack-controller -m shell -a 'openstack-service restart neutron '
ansible -i /etc/ansible/hosts openstack-controller -m shell -a 'openstack-service status neutron '
写在最后:
你每天学习一点点,每天只进步1%,一年以后你的水平值是多少呢?
37.78(1.01×365=37.78)
相信概率,不要相信运气,在过程中提升概率
详情请见,微信公众号



