👉 这是一个或许对你有用的社群
🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:
《项目实战(视频)》:从书中学,往事中“练”
《互联网高频面试题》:面朝简历学习,春暖花开
《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题
《精进 Java 学习指南》:系统学习,互联网主流技术栈
《必读 Java 源码专栏》:知其然,知其所以然
👉这是一个或许对你有用的开源项目
国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。
功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:
Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud
视频教程:https://doc.iocoder.cn
来源:blog.csdn.net/yi_qingjun
/article/details/128390877
前面介绍了 RabbitMQ 重试机制、队列与消息过期、持久化、存储机制与内存管理、流控、镜像队列、网络分区等相关的知识点,今天我将详细的为大家介绍 RabbitMQ 单机多节点、多机集群部署 相关知识,希望大家能够从中收获多多!如有帮助,请点在看 、转发 支持一波!!!
一机多实例集群
一机多实例,顾名思义就是在一台机器上面部署多个rabbitmq服务组成集群。RabbitMQ的单机多节点配置大多用于实验性论证,安全性和高可用性太低。
需要注意,每个rabbitmq节点名称、内部端口、插件端口等信息不能冲突。
三机启动
参照前面章节,先部署erlang环境、安装rabbitmq服务,再开始做以下步骤。
启动第一个节点,第一个节点名称为rabbitmq_1,监听端口为5672,web页面的端口默认为15672,节点内部通信的端口为25672就不需要使用指定参数多此一举了。
[root@node1 ~]# RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbitmq_1 rabbitmq-server start

查看第一个节点进程
启动第二个节点,第二个节点名称为rabbitmq_2,监听端口为5673,web页面的端口默认为15673,节点内部通信的端口为25673。
[root@node1 rabbitmq_2]# RABBITMQ_NODE_PORT=5673 RABBITMQ_DIST_PORT=25673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbitmq_2 rabbitmq-server start

查看第二个节点进程。

启动第三个节点,第三个节点名称为rabbitmq_3,监听端口为5674,web页面的端口默认为15674,节点内部通信的端口为25674。
[root@node1 ~]# RABBITMQ_NODE_PORT=5674 RABBITMQ_DIST_PORT=25674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbitmq_3 rabbitmq-server start

查看第三个节点进程。

立主纳从
假设把rabbitmq_1当作主节点,rabbitmq_2和rabbitmq_3当作从节点。
设置rabbitmq_1为主节点
#停止rabbitmq_1节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 stop_app
#将rabbitmq_1重置还原到最初状态,包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据、配置的用户、vhost 等,以及删除所有的持久化消息。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 reset
#启动rabbitmq_1节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 start_app

将rabbitmq_2、rabbitmq_3加入到主节点。
#停止rabbitmq_2节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 stop_app
#将rabbitmq_2节点加入到主节点(rabbitmq_1),“node1”为服务器主机名。
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 join_cluster rabbitmq_1@node1
#启动rabbitmq_2节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 start_app
#停止rabbitmq_3节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 stop_app
#将rabbitmq_3节点加入到主节点(rabbitmq_1),“node1”为服务器主机名。
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 join_cluster rabbitmq_1@node1
#启动rabbitmq_3节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 start_app

查看集群状态
[root@node1 ~]# rabbitmqctl cluster_status -n rabbitmq_1

web监控
1.开启web插件
[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management
2.此时用15672、15673、15674三个端口都可以访问到web界面。



3.新建用户,设置密码,指定角色,添加权限。
#给主节点添加baimu用户,密码为citms。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 add_user baimu citms
#将主节点的baimu用户设置成administrator角色,拥有最高权限。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 set_user_tags baimu administrator
#给主节点的baimu用户添加权限。可配置、可写、可读。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 set_permissions -p / baimu ".*" ".*" ".*"
同时也给其他两个从节点添加用户,授权,不然15673和15674页面登陆不了。
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 add_user baimu citms
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 set_user_tags baimu administrator
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 set_permissions -p / baimu ".*" ".*" ".*"
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 add_user baimu citms
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 set_user_tags baimu administrator
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 set_permissions -p / baimu ".*" ".*" ".*"

4.使用创建的用户密码分别登录IP:15672、IP:15673、IP:15674。

测试
数据同步
1.主节点创建一个交换器和队列,并绑定,发送消息“武汉”。


2.从节点查看消息“武汉”,主从消息同步。

一从死,主仍战
其中一个从节点宕机后,不影响主节点的写入,也不营销那个其余存活的从节点数据同步。
1.将rabbitmq_2从节点停掉。
[root@node1 mnesia]# rabbitmqctl -n rabbitmq_2 stop_app

2.IP:15673访问不了,但是主节点依然可以写入,rabbitmq_3从节点依然可以消息同步。


从复活,死亡期间数据同步
1.将rabbitmq_2从节点启动。
[root@node1 mnesia]# rabbitmqctl -n rabbitmq_2 start_app
Starting node rabbitmq_2@node1 ...
2.IP:15673恢复访问,死掉期间主节点写入的“beijing”数据依然可以读出来。

主死,从活但不可用
1.停止rabbitmq_1主节点
[root@node1 mnesia]# rabbitmqctl -n rabbitmq_1 stop_app
Stopping rabbit application on node rabbitmq_1@node1 ...
2.rabbitmq_2等从节点已让可以访问,但是无法数据写入。



确定主机名
准备三台服务器,并修改主机名,最好是能一眼看出哪个节点的。
192.168.130.129为第一个节点,主机名为node1;
192.168.130.130为第二个节点,主机名为node2;
192.168.130.131为第三个节点,主机名为node3。
1.编辑各节点的/etc/hosts文件,在其上添加IP 地址与节点名称的映射信息。
[root@node1 ~]# tail -3 /etc/hosts
192.168.130.129 node1
192.168.130.130 node2
192.168.130.131 node3
[root@node2 ~]# tail -3 /etc/hosts
192.168.130.129 node1
192.168.130.130 node2
192.168.130.131 node3
[root@node3 ~]# tail -3 /etc/hosts
192.168.130.129 node1
192.168.130.130 node2
192.168.130.131 node3

三机部署rabbitmq
第一步 ,分别在三台机器上部署rabbitmq服务,怎么来部署可以参考第二章节,这里我就提前部署好了。各节点的erlang和rabbitmq版本需一致。可以设置rabbitmq-enc.conf变量文件来定义我们想要的信息。
第一个节点信息。
第二个节点信息。
第三个节点信息
各节点启动正常,可以直接后台运行:rabbitmq-server -detached。
第二步 ,把所有节点的rabbitmq停掉,将node1节点的cookie文件内容复制替换node2、node3节点上的cookie文件,以确保各个节点的 cookie 文件使用的是同一个值。
cookie文件默认路径为/var/lib/rabbitmq/.erlang.cookie ,或者在$HOME/.erlang.cookie。
二进制安装的rabbitmq服务,.erlang.cookie文件在/root/目录下面,是个隐藏文件。
cookie文件权限必须是400,不然启动时会报错。
第一个节点
第二个节点
第三个节点
第三步 ,三节点的.erlang.cookie文件内容替换统一后,依次启动各节点rabbitmq服务,必须保证每个节点的rabbitmq服务运行正常。
如果遇到启动异常,应该是在第一步先启动了未停止好,导致有端口占用,可以用 lsof -i:25672命令查看进程,将其杀掉,再重新启动就可以了。
问题:

解决:

查看各节点运行状态。
第一个节点运行正常
第二个节点运行正常
第三个节点运行正常
查看各节点集群信息
node1节点。
node2节点
node3节点
设主纳从
这里把node1名为主节点,node2和node3为从节点,操作步骤和前面差不多。
1.主节点不用做任何操作,分别在node2和node3机器上进行加入集群操作,先把node2节点加进来。
> 基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
> * 项目地址:<https://github.com/YunaiV/ruoyi-vue-pro>
> * 视频教程:<https://doc.iocoder.cn/video/>
# 把node2节点加入到node1节点,组成以node1为主、node2为从的集群。
[root@node2 ~]# rabbitmqctl stop_app
[root@node2 ~]# rabbitmqctl reset
[root@node2 ~]# rabbitmqctl join_cluster rabbitmq_1@node1
[root@node2 ~]# rabbitmqctl start_app

2.分别在node1和node2上查看集群状态,此时node1和node2已经组成集群。

3.将node3加入node1。
> 基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
> * 项目地址:<https://github.com/YunaiV/yudao-cloud>
> * 视频教程:<https://doc.iocoder.cn/video/>
# 把node3节点加入到node1节点,组成以node1为主、node3为从的集群。
[root@node3 ~]# rabbitmqctl stop_app
[root@node3 ~]# rabbitmqctl reset
[root@node3 ~]# rabbitmqctl join_cluster rabbitmq_1@node1
[root@node3 ~]# rabbitmqctl start_app

4.分别在node1和node3上查看集群状态,此时node1、node2、node3已经组成集群。

开启web插件
每个节点上都需要开启。
[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management
[root@node2 ~]# rabbitmq-plugins enable rabbitmq_management
[root@node3 ~]# rabbitmq-plugins enable rabbitmq_management

新建用户,赋权限
只需要在主节点执行就可以了。
#创建一个qingjun用户,密码为citms。
[root@node1 ~]# rabbitmqctl add_user qingjun citms
#给qingjun用户设为administrator角色,拥有最高权限。
[root@node1 ~]# rabbitmqctl set_user_tags qingjun administrator
#给qingjun用户授权,可操作、可写、可读。
[root@node1 ~]# rabbitmqctl set_permissions -p / qingjun ".*" ".*" ".*"

web监控
通过web页面可以只管看到集群状态。

测试
正常关闭时,最后关闭的节点需要第一个启动
如果关闭了集群中的所有节点,则需要确保在启动的时候最后关闭的那个节点是第一个启动的。如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的节点启动。
比如,现在依次关闭node1、node2、node3节点,node3节点是最后关闭的,那么启动的时候需要先启动node3节点。若先启动node1或者node2,会一致等待node3节点启动,等待多久有个机制,后面再讲,咱们先来测试下效果。
1.依次关闭node1、node2、node3节点。
[root@node1 rabbitmq]# rabbitmqctl stop
Stopping and halting node rabbitmq_1@node1 ...
[root@node2 ~]# rabbitmqctl stop
Stopping and halting node rabbitmq_2@node2 ...
[root@node3 ~]# rabbitmqctl stop
Stopping and halting node rabbitmq_3@node3 ...
2.此时先启动node1,node1日志显示一直在启动中,这个时候就是在等待node3节点启动。

3.此时启动node3节点,node1会过一段时间更新日志,显示服务启动成功。此时node2节点还是死掉状态,所以监控node2节点是红色。


4.最后我们启动node2节点,集群恢复。

异常断电
如果集群中的所有节点由于某些非正常因素,比如断电而关闭,那么集群中的节点都会认为还有其他节点在它后面关闭,此时需要调用 rabbitmgctl force_boot 命令来启动一个节点,之后集群才能正常启动。
我这里是在虚拟机运行正常的情况下突然关掉电脑来模拟此种情况。
1.电脑关机前,所有节点运行正常。

2.电脑突然关闭后,所有节点全部停止运行,监控页面不能访问。此时随便启动一个节点显示一直启动中。


3.此时执行命令,再次启动node1,就会启动成功,监控页面可以访问。


4.此时再去正常启动第二个节点就会启动成功,无论是node2,还是node3。我这里启动的是node2,192.168.130.130:15672监控页面可以访问。


5.最后再把第三个节点正常启动起来,恢复集群。


欢迎加入我的知识星球,全面提升技术能力。
👉 加入方式,“长按”或“扫描”下方二维码噢:
星球的内容包括:项目实战、面试招聘、源码解析、学习路线。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)