Bootstrap

RabbitMQ 集群

在这里插入图片描述

前言

RabbitMQ 作为消息中间件,可以与多个生产者和消费者进行绑定,但是如何只有一台 RabbitMQ 服务的话,那么这个 RabbitMQ 就需要处理很多的请求,如果该 RabbitMQ 节点挂掉了之后,那么所有与之相关的操作都无法进行了。我们可以升级 RabbitMQ 的硬件设施,提升 RabbitMQ 的处理能力,但是硬件的升级成本是很高的,比较好的解决方法就是搭建 RabbitMQ 集群。

单机多节点搭建集群

一般的集群是指在多个不同的主机上搭建,为什么我这里选择单机多节点搭建集群呢?说白了就是我没有那个经济实力,我手上没有那么多的云服务器,但是呢,知道了单机多节点的搭建,那么多机集群的搭建也就很简单了,步骤基本上是相同的。

我们先来看看主机上已经存在的 RabbitMQ 服务rabbimqctl status

在这里插入图片描述
可以看到我当前主机上已经存在一个 RabbitMQ 服务,他绑定的端口是 5672、15672和25672,这里绑定的端口的作用是啥就不具体介绍了,要是不知道的可以看看前面的文章。

创建RabbitMQ节点

然后我们搭建的单机多节点就是一主两从的情况,所以我们需要再启动两个 RabbitMQ 节点:

Node NameAMQP协议端口号Web管理页面端口
rabbit2567315673
rabbit3567415674
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management
listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached

RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management
listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached

RABBITMQ_NODE_PORT 指定启动的 RabbitMQ 的端口,RABBITMQ_SERVER_START_ARGS 是 RabbitMQ 的配置选项,rabbitmq_management listener 指定管理页面绑定的端口,RABBITMQ_NODENAME 是节点的名称。

那么如何检查我们新的 RabbitMQ 启动成功了呢?我们可以打开云服务器的 15673和15674端口,然后看看管理页面是否能打开:

在这里插入图片描述
在这里插入图片描述
这时我们一台主机上就存在三个 RabbitMQ 节点了,接下来我们就将这三个几点加入到一个集群中。

停止服务并重置

在添加集群之前,我们需要停止 RabbitMQ 服务,并对其进行重置:

rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 reset

rabbitmqctl -n rabbit3 stop_app
rabbitmqctl -n rabbit3 reset

在这里插入图片描述

将节点加入到集群中

我们将最先启动的 rabbit 节点作为主节点,然后 rabbit2 和 rabbit3 作为从节点:

rabbitmqctl -n rabbit2 join_cluster rabbit@iZ2ze5bzkbeuwwqowjzo27Z

rabbitmqctl -n rabbit3 join_cluster rabbit@iZ2ze5bzkbeuwwqowjzo27Z

rabbit@iZ2ze5bzkbeuwwqowjzo27Z 是我们主节点的节点名称,可以通过 rabbitmqctl status 查看节点名称:

在这里插入图片描述
我们输入命令的时候可能会出现警告,但是我们现在呢就先不管:

在这里插入图片描述
将节点加入到集群之后呢,我们重新启动 rabbit2 和 rabbit3:

rabbitmqctl -n rabbit2 start_app

rabbitmqctl -n rabbit3 start_app

查看集群状态

RabbitMQ 节点加入集群之后,我们通过 rabbitmqctl cluster_status -n rabbit 来查看集群的状态:

在这里插入图片描述
在这里插入图片描述
然后登录到管理页面也是可以查看集群状态的:

在这里插入图片描述

宕机

我们分别用 rabbit 和 rabbit2 节点来添加两个队列:

在这里插入图片描述
在这里插入图片描述
用一个节点添加的队列,然后观察其他节点可以发现在其他的节点中也存在这些创建的队列:

在这里插入图片描述
然后我们向队列中发送消息:

在这里插入图片描述
然后在其他的节点中也是可以看到这个发送的消息:

在这里插入图片描述
然后我们关闭主节点 rabbit rabbitmqctl -n rabbit stop_app

从其他节点的管理平台可以看到我们的 rabbit 节点是挂掉了。
在这里插入图片描述

并且,我们的 testQueue 是由 rabbit 节点创建的,当 rabbit 节点挂掉之后,testQueue 中的消息在其他节点中也不存在了,而不是由 rabbit 节点创建的队列则还存在:

在这里插入图片描述
也就是说,由哪个节点创建的队列,队列中的消息只会在这个节点中存在,那么如何解决这个问题呢?这就需要引入我们的 “仲裁队列” 了。

结论

感谢各位朋友们能够看到结尾,找不到工作?某直聘已读不回?不妨看看这里超快回复,助力每一位程序员早日找到理想的工作

;