👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

8bd2b0e28b31b22a5efee007b6b3cbcd.gif

👉这是一个或许对你有用的开源项目

国产 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

778b2cf069f87a3bffa5664ee5f8c40b.jpeg


前面介绍了 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
06e5ba9cf954103f7cdba85c7c8a1037.png

查看第一个节点进程722a95a8a56eb2b9f191188ddf13fc24.png

启动第二个节点,第二个节点名称为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
77c69ab8511ddb1c8c2bb35eb81be142.png

查看第二个节点进程。

0dd012ae097567aa728e6ea007ac63ca.png

启动第三个节点,第三个节点名称为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
55f0558549adf12a8693319624c0154b.png

查看第三个节点进程。

ab05227d25f31ad5fdd0f6c4e85010c7.png

立主纳从

假设把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
4febdf95fed685549e94f457c1b1690a.png

将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
1c2798a7c9066f166f7982ebf61b4d12.png

查看集群状态

[root@node1 ~]# rabbitmqctl cluster_status -n rabbitmq_1
a01ea77ec4d2b1b931efc263d9912d64.png

web监控

1.开启web插件

[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management

2.此时用15672、15673、15674三个端口都可以访问到web界面。

14ebe94d958e6f40e3f0b8ce4b460274.png a206c9d958d6e2f7e964ae5a558990af.png 9e9cf8e394bf328dd3dff5210d45ff29.png

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 ".*" ".*" ".*"
00fa286e85a72186fcba31e6f2d5333e.png

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

cfcae10462ff66d6e221ddcd5189b89c.png

测试

数据同步

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

6b713fbb366b877692ed5d50e5559271.png 2c531d78cbb4b56e4ee1af8b369e4f39.png

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

32985739baffe34963fa9037d9a43716.png
一从死,主仍战

其中一个从节点宕机后,不影响主节点的写入,也不营销那个其余存活的从节点数据同步。

1.将rabbitmq_2从节点停掉。

[root@node1 mnesia]# rabbitmqctl -n rabbitmq_2 stop_app
178d368c106bd1a7710639629c9cb159.png

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

27308d48662a9a302f1bc2289dcf112a.png 1e1e975a323db6c033b894130736b4e3.png
从复活,死亡期间数据同步

1.将rabbitmq_2从节点启动。

[root@node1 mnesia]# rabbitmqctl -n rabbitmq_2 start_app
        Starting node rabbitmq_2@node1 ...

2.IP:15673恢复访问,死掉期间主节点写入的“beijing”数据依然可以读出来。

58fc9bf43af760cfc7c7757110bf36ed.png
主死,从活但不可用

1.停止rabbitmq_1主节点

[root@node1 mnesia]# rabbitmqctl -n rabbitmq_1 stop_app
        Stopping rabbit application on node rabbitmq_1@node1 ...

2.rabbitmq_2等从节点已让可以访问,但是无法数据写入。

b66327f4f3cc14a3842ac1d84010c41e.png 0d200d7f0c8d59223156bbfdcdf0441e.png 7c4c2f82b4f0dcb1372eeac592210c03.png

确定主机名

准备三台服务器,并修改主机名,最好是能一眼看出哪个节点的。

  • 192.168.130.129为第一个节点,主机名为node1;

  • 192.168.130.130为第二个节点,主机名为node2;

  • 192.168.130.131为第三个节点,主机名为node3。

    e14c6df3c09197f5b749002db91fc6c3.png1.编辑各节点的/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
2e60756b924f70f2d71c1cda8f175cbb.png

三机部署rabbitmq

第一步 ,分别在三台机器上部署rabbitmq服务,怎么来部署可以参考第二章节,这里我就提前部署好了。各节点的erlang和rabbitmq版本需一致。可以设置rabbitmq-enc.conf变量文件来定义我们想要的信息。

  • 第一个节点信息。

    57321413173d5a18ff6bffef6b60b666.png
  • 第二个节点信息。

    bf504d6719be64dc29ca9bf40e70f497.png
  • 第三个节点信息

    9f9b148bce26e71b342855ba2cdce451.png
  • 各节点启动正常,可以直接后台运行:rabbitmq-server -detached。

    4f3570c05f2a8c0a11adbd99b6073a6b.png

第二步 ,把所有节点的rabbitmq停掉,将node1节点的cookie文件内容复制替换node2、node3节点上的cookie文件,以确保各个节点的 cookie 文件使用的是同一个值。

  • cookie文件默认路径为/var/lib/rabbitmq/.erlang.cookie ,或者在$HOME/.erlang.cookie。

  • 二进制安装的rabbitmq服务,.erlang.cookie文件在/root/目录下面,是个隐藏文件。

  • cookie文件权限必须是400,不然启动时会报错。

  • 第一个节点

    7040ea15e5999e0b1022e7432b1c3e63.png
  • 第二个节点

    b5bfbfacc9ee4839c5f2ef47523b2013.png
  • 第三个节点

    770d929f7612bbfba4a0e9ba2f6df743.png

第三步 ,三节点的.erlang.cookie文件内容替换统一后,依次启动各节点rabbitmq服务,必须保证每个节点的rabbitmq服务运行正常。

  • 如果遇到启动异常,应该是在第一步先启动了未停止好,导致有端口占用,可以用 lsof -i:25672命令查看进程,将其杀掉,再重新启动就可以了。

问题:
eb092fb4a891924255a32b7a0bce8bea.png
解决:
58059bfe5fec2ae06a36560df3ec1789.png

查看各节点运行状态。

  • 第一个节点运行正常

    11257823fe3fb319edceb15de9cac041.png
  • 第二个节点运行正常

    dd04d5d53cc7951a2b0155177be7bcf6.png
  • 第三个节点运行正常

    5695a64b11a666cfc18f59fedfcb59fe.png

查看各节点集群信息

  • node1节点。

    941e730dc9c5ebcd173c8aec8cdcec07.png
  • node2节点

    dbece4924d6e71b2a373f0d94ba7eb63.png
  • node3节点

    dc165c670cb66901eae7326929e3c68c.png

设主纳从

这里把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
720973b207b3c3e17ab2d1217e870f2c.png

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

e5af189e4ecd27086634d67a9cf0029d.png

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
2b74597fef9f919538688e768dd317dd.png

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

58f30cd05ba27e786b961852be00cfca.png

开启web插件

每个节点上都需要开启。

[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management

        [root@node2 ~]# rabbitmq-plugins enable rabbitmq_management

        [root@node3 ~]# rabbitmq-plugins enable rabbitmq_management
1bac60a963827a8f08cc5f418adae7ed.png

新建用户,赋权限

只需要在主节点执行就可以了。

#创建一个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 ".*" ".*" ".*"
539503b3a1299c5fe800bcce6d471b0b.png

web监控

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

126dc0e4154d9e4bc0d1d183d5efce3c.png

测试

正常关闭时,最后关闭的节点需要第一个启动
  • 如果关闭了集群中的所有节点,则需要确保在启动的时候最后关闭的那个节点是第一个启动的。如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的节点启动。

  • 比如,现在依次关闭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节点启动。

feb61fea5df496c983ebe73bf0bf64ae.png

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

f12925bf4a33a2842e8aaa85844715e6.png 4f1d47eb5c0e4dbb93952c1e7c0d7a04.png

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

d47e34e06ecf33b90a6e8b513e9eb6e4.png
异常断电
  • 如果集群中的所有节点由于某些非正常因素,比如断电而关闭,那么集群中的节点都会认为还有其他节点在它后面关闭,此时需要调用 rabbitmgctl force_boot 命令来启动一个节点,之后集群才能正常启动。

  • 我这里是在虚拟机运行正常的情况下突然关掉电脑来模拟此种情况。

1.电脑关机前,所有节点运行正常。

10bb21a88d8459c954092184d40fa9bf.png

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

ca487c2f77f6490c7a241d6507376bb6.png 55d7e412f7ed2cdf2e8c84b114bda880.png

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

0ec3975a144c0f9959d5d03d95e16a87.png 6712e746a609609e7e4644df782bfdc2.png

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

bbeb4bf03df54ea5ed82240a14ec2e14.png ac43e0ae399d22083ff1eb4f06f23b7a.png

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

9b9ad067f0e3f5ec8dda9e4d5b280346.png 23e37bfd722d5ad81fdc0e118bd55ac1.png

欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

b4727346a456f866a3fa1d7aa4a870df.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

3fd4fa7bb618465a3172b87a58fbfd6b.png

52ef5951c411679e6484c9d47d684b0a.png9decc1578f2018835d8cc44c3d3e5579.png97e226ebabc39591893ad743fc55e403.pnga341237682be7bbdf05a9f04fb3a3254.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
Logo

数据库是今天社会发展不可缺少的重要技术,它可以把大量的信息进行有序的存储和管理,为企业的数据处理提供了强大的保障。

更多推荐