⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/yi_qingjun/article/details/128390877 「百慕卿君」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

前面介绍了 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节点加进来。

# 把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。

# 把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.最后再把第三个节点正常启动起来,恢复集群。

文章目录
  1. 1. 一机多实例集群
    1. 1.1. 三机启动
    2. 1.2. 立主纳从
    3. 1.3. 查看集群状态
    4. 1.4. web监控
    5. 1.5. 测试
      1. 1.5.0.1. 数据同步
      2. 1.5.0.2. 一从死,主仍战
      3. 1.5.0.3. 从复活,死亡期间数据同步
      4. 1.5.0.4. 主死,从活但不可用
  2. 1.6. 确定主机名
  3. 1.7. 三机部署rabbitmq
    1. 1.7.0.1. 问题:
    2. 1.7.0.2. 解决:
  • 1.8. 查看各节点运行状态。
  • 1.9. 查看各节点集群信息
  • 1.10. 设主纳从
  • 1.11. 开启web插件
  • 1.12. 新建用户,赋权限
  • 1.13. web监控
  • 1.14. 测试
    1. 1.14.0.1. 正常关闭时,最后关闭的节点需要第一个启动
    2. 1.14.0.2. 异常断电