Rabbitmq集群修复
背景
在实际运维过程中,可能会出现因rabbitmq数据文件异常(损坏或丢失)导致rabbitmq服务无法启动,rabbitmq集群就此少了一个节点运行着。如果rabbitmq服务数据无法修复,由于使用的vhost是设置了镜像复制模式,其他节点数据仍然存在,所以不用太关心故障节点的数据(一般消息组件也都会有消息补偿机制)。此时可以清理故障节点,并重新加入集群。
Rabbitmq集群修复过程
首先通过rabbitmqctl cluster_status命令判断故障节点是否为集群主节点(集群名节点)
情况1、故障节点不是集群主节点(集群名节点)
下面查看日志说明:故障节点是集群主节点(集群名节点)
故障节点是ierp03,运行中的节点是ierp01、ierp02,集群名节点是rabbit@ierp01。
[root@ierp02 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@ierp02 ...
[{nodes,[{disc,[rabbit@ierp01,rabbit@ierp02]}]},
{running_nodes,[rabbit@ierp01,rabbit@ierp02]},
{cluster_name,<<"rabbit@ierp01">>},
{partitions,[]},
{alarms,[{rabbit@ierp03,[]},{rabbit@ierp02,[]}]}]
修复过程:
1、 挪走故障节点 /var/lib/rabbitmq/mnesia 数据
[root@ierp03 ~]# mv /var/lib/rabbitmq/mnesia /var/lib/rabbitmq/mnesia.bak
2、 确认 /var/lib/rabbitmq/.erlang.cookie 文件与其他节点权限和内容一致
[root@ierp03 ~]# ls -la /var/lib/rabbitmq/.erlang.cookie
3、 启动故障节点
[root@ierp03 ~]# systemctl start rabbitmq-server
4、 停止故障节点的mq app:
[root@ierp03 ~]# rabbitmqctl stop_app
5、 在集群节点中将故障节点剔除:
[root@ierp02 ~]# rabbitmqctl forget_cluster_node rabbit@ierp03 (故障节点是ierp03,集群名称是rabbit@ierp01)
6、 故障节点重新加入集群:
[root@ierp03 ~]# rabbitmqctl join_cluster rabbit@ierp01
7、 启动故障节点app:
[root@ierp03 ~]# systemctl start_app
查看集群状态
[root@ierp03 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@ierp03 ...
[{nodes,[{disc,[rabbit@ierp01,rabbit@ierp02,rabbit@ierp03]}]},
{running_nodes,[rabbit@ierp02,rabbit@ierp03,rabbit@ierp01]},
{cluster_name,<<"rabbit@ierp01">>},
{partitions,[]},
{alarms,[{rabbit@ierp02,[]},{rabbit@ierp03,[]},{rabbit@ierp01,[]}]}]
8、 设置vhosts为镜像复制模式
[root@ierp03 ~]# rabbitmqctl set_policy -p mc ha-allqueue "^" '{"ha-mode":"all"}'
[root@ierp03 ~]# rabbitmqctl set_policy -p ierp ha-allqueue "^" '{"ha-mode":"all"}'
情况2、故障节点是集群主节点(集群名节点)
下面查看日志说明:故障节点是集群主节点(集群名节点)
故障节点是ierp01,运行中的节点是ierp02、ierp03,集群名节点是rabbit@ierp01。
[root@ierp02 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@ierp02 ...
[{nodes,[{disc,[rabbit@ierp02,rabbit@ierp03]}]},
{running_nodes,[rabbit@ierp03,rabbit@ierp02]},
{cluster_name,<<"rabbit@ierp01">>},
{partitions,[]},
{alarms,[{rabbit@ierp03,[]},{rabbit@ierp02,[]}]}]
修复过程:
1、 挪走故障节点 /var/lib/rabbitmq/mnesia 数据
[root@ierp01 ~]# mv /var/lib/rabbitmq/mnesia /var/lib/rabbitmq/mnesia.bak
2、 确认 /var/lib/rabbitmq/.erlang.cookie 文件与其他节点权限和内容一致
[root@ierp01 ~]# ls -la /var/lib/rabbitmq/.erlang.cookie
3、 启动故障节点
[root@ierp01 ~]# systemctl start rabbitmq-server
4、 停止故障节点的mq app:
[root@ierp01 ~]# rabbitmqctl stop_app
5、 在集群节点中将故障节点剔除:
[root@ierp02 ~]# rabbitmqctl forget_cluster_node rabbit@ierp01 (故障节点是ierp01,集群名称是rabbit@ierp01)
6、 将集群节点名称改名(存活的节点名):
[root@ierp02 ~]# rabbitmqctl set_cluster_name rabbit@ierp02 (故障节点是ierp01,集群名称是rabbit@ierp01)
[root@ierp02 ~]# rabbitmqctl set_cluster_name rabbit@ierp02
Cluster status of node rabbit@ierp02 ...
[{nodes,[{disc,[rabbit@ierp02,rabbit@ierp03]}]},
{running_nodes,[rabbit@ierp02,rabbit@ierp03]},
{cluster_name,<<"rabbit@ierp02">>},
{partitions,[]},
{alarms,[{rabbit@ierp02,[]},{rabbit@ierp03,[]}]}]
7、 故障节点重新加入到集群(新集群名):
[root@ierp01 ~]# rabbitmqctl join_cluster rabbit@ierp02
8、 启动故障节点app:
[root@ierp01 ~]# systemctl start_app
查看集群状态
[root@ierp01 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@ierp01 ...
[{nodes,[{disc,[rabbit@ierp01,rabbit@ierp02,rabbit@ierp03]}]},
{running_nodes,[rabbit@ierp02,rabbit@ierp03,rabbit@ierp01]},
{cluster_name,<<"rabbit@ierp02">>},
{partitions,[]},
{alarms,[{rabbit@ierp02,[]},{rabbit@ierp03,[]},{rabbit@ierp01,[]}]}]
9、 设置vhosts为镜像复制模式
[root@ierp01 ~]# rabbitmqctl set_policy -p mc ha-allqueue "^" '{"ha-mode":"all"}'
[root@ierp01 ~]# rabbitmqctl set_policy -p ierp ha-allqueue "^" '{"ha-mode":"all"}'
Rabbitmq集群修复
本文2024-09-23 01:13:59发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144630.html