第十三节 RabbitMQ-rabbitMa的集群搭建

亮子 2024-03-05 01:47:56 18394 0 0 0

第07单元-RabbitMQ-04-rabbitMQ的集群搭建

项目需求:

圈子项目中有很多模块都会用到消息中间件,一旦消息中间件的服务器宕机,很可能导致圈子软件无法使用,需要保障系统的可用性。

需求描述:

消息中间件在软件的很多模块都在使用,如何保障消息的可靠性、可用性,最好能有负载均衡的功能。这样在消息中间件服务器宕机的情况下,系统依然能不受影响,能够正常运行。


RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成

RabbitMQ的5大核心概念:Connection(连接)、Channel(信道)、Exchange(交换机)、Queue(队列)、Virtual host(虚拟主机)。

普通模式的集群

普通模式的集群是不会将创建的队列复制到其他节点,虽然我们在其它节点能够看到这个节点;这是由于其它节点只会保存一份这个队列的元数据,展示给我们看的,真实的队列还是存在创建这个队列的节点中的;如果这个时候我们把创建队列的的节点关闭,那么这个队列其实就不可用了; 为了解决这个问题,rabbitmq还提供了另外一种集群模式:镜像模式

镜像模式

镜像模式是rabbit提供的一种可添加的策略模式,如果创建的队列和创建的策略能够匹配上,则会把队列同步复制到其他节点中,而不再只是复制元数据;

RabbitMQ的镜像集群模式是指在RabbitMQ集群中,可以将队列的数据镜像到多个节点上,以提高消息的可靠性和可用性。当队列被声明为镜像队列后,队列中的消息将被复制到集群中的多个节点上,即使其中一个节点出现故障,消息仍然可以在其他节点上继续被消费。

镜像集群模式的主要作用包括:

  1. 提高可靠性:通过将消息镜像到多个节点上,即使某个节点发生故障,消息仍然可以在其他节点上继续被消费,从而提高了消息的可靠性。

  2. 提高可用性:镜像集群模式可以确保即使部分节点发生故障,队列中的消息仍然可以在其他节点上继续被处理,提高了系统的可用性。

  3. 负载均衡:镜像集群模式还可以实现消息的负载均衡,通过将消息分布到多个节点上,可以减轻单个节点的压力,提高系统的吞吐量。

总之,镜像集群模式可以提高RabbitMQ集群的可靠性、可用性和负载均衡能力,是在构建高可靠消息系统时常用的一种技术手段。

这里使用docker来搭建rabbitmq集群的镜像模式,首先准备好docker环境,下载好镜像

1、创建网卡

docker network create rabbitmq_net

2、安装三个rabbitmq组件,一主两从

docker run -d --name=rabbitmq_master -p 5672:5672 -p 15672:15672 -e RABBITMQ_NODENAME=rabbitmq_master -e RABBITMQ_ERLANG_COOKIE='1111111' -h rabbitmq_master --net=rabbitmq_net -v /data/rabbitmq-1/rabbitmq_master/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=CiA7rk7L_6gIKnaX  rabbitmq:3.8.27-management
docker run -d --name=rabbitmq_slave1 -p 5673:5672 -p 15673:15672 -e RABBITMQ_NODENAME=rabbitmq_slave1 -e RABBITMQ_ERLANG_COOKIE='1111111' -h rabbitmq_slave1 --net=rabbitmq_net -v /data/rabbitmq-1/rabbitmq_slave1/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=CiA7rk7L_6gIKnaX  rabbitmq:3.8.27-management
docker run -d --name=rabbitmq_slave2 -p 5674:5672 -p 15674:15672 -e RABBITMQ_NODENAME=rabbitmq_slave2 -e RABBITMQ_ERLANG_COOKIE='1111111' -h rabbitmq_slave2 --net=rabbitmq_net -v /data/rabbitmq-1/rabbitmq_slave2/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=CiA7rk7L_6gIKnaX  rabbitmq:3.8.27-management

3、开启三个组件的管理端插件

docker exec -it rabbitmq_master /bin/bash
rabbitmq-plugins enable rabbitmq_management
exit
docker exec -it rabbitmq_slave1 /bin/bash
rabbitmq-plugins enable rabbitmq_management
exit
docker exec -it rabbitmq_slave2 /bin/bash
rabbitmq-plugins enable rabbitmq_management
exit

4、浏览器分别访问以下地址,用户名和密码都是admin

http://localhost:15672/#/
http://localhost:15673/#/
http://localhost:15674/#/

如果成功登入,则代表组件安装成功,但是这时候还不是集群模式,我们需要手动加入到集群

5、salve1加入集群

docker exec -it rabbitmq_slave1 /bin/bash
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbitmq_master@rabbitmq_master
rabbitmqctl start_app
exit

6、salve2加入集群

docker exec -it rabbitmq_slave2 /bin/bash
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbitmq_master@rabbitmq_master
rabbitmqctl start_app
exit

7、开启镜像队列

docker exec -it rabbitmq_slave1 /bin/bash
rabbitmqctl set_policy my_ha "^" '{"ha-mode":"all"}'
exit

到这里,rabbitmq集群镜像模式就安装成功了。

8、docker一键安装rabbitmq集群镜像模式脚本:

  • start_rabbitmq.sh
#!/bin/bash

#创建目录
mkdir -p /data/rabbitmq-1/rabbitmq_master/data
mkdir -p /data/rabbitmq-1/rabbitmq_slave1/data
mkdir -p /data/rabbitmq-1/rabbitmq_slave2/data

#创建网卡
docker network create rabbitmq_net

#安装三个rabbitmq组件,一主两从
docker run -d --name=rabbitmq_master -p 5672:5672 -p 15672:15672 -e RABBITMQ_NODENAME=rabbitmq_master -e RABBITMQ_ERLANG_COOKIE='1111111' -h rabbitmq_master --net=rabbitmq_net -v /data/rabbitmq-1/rabbitmq_master/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin  rabbitmq:3.8-rc-management
docker run -d --name=rabbitmq_slave1 -p 5673:5672 -p 15673:15672 -e RABBITMQ_NODENAME=rabbitmq_slave1 -e RABBITMQ_ERLANG_COOKIE='1111111' -h rabbitmq_slave1 --net=rabbitmq_net -v /data/rabbitmq-1/rabbitmq_slave1/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin  rabbitmq:3.8-rc-management
docker run -d --name=rabbitmq_slave2 -p 5674:5672 -p 15674:15672 -e RABBITMQ_NODENAME=rabbitmq_slave2 -e RABBITMQ_ERLANG_COOKIE='1111111' -h rabbitmq_slave2 --net=rabbitmq_net -v /data/rabbitmq-1/rabbitmq_slave2/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin  rabbitmq:3.8-rc-management

#开启三个组件的管理端插件
docker exec -it rabbitmq_master rabbitmq-plugins enable rabbitmq_management
docker exec -it rabbitmq_slave1 rabbitmq-plugins enable rabbitmq_management
docker exec -it rabbitmq_slave2 rabbitmq-plugins enable rabbitmq_management

#salve1加入集群
docker exec -it rabbitmq_slave1 rabbitmqctl stop_app
docker exec -it rabbitmq_slave1 rabbitmqctl join_cluster rabbitmq_master@rabbitmq_master
docker exec -it rabbitmq_slave1 rabbitmqctl start_app

#salve2加入集群
docker exec -it rabbitmq_slave2 rabbitmqctl stop_app
docker exec -it rabbitmq_slave2 rabbitmqctl join_cluster rabbitmq_master@rabbitmq_master
docker exec -it rabbitmq_slave2 rabbitmqctl start_app

#开启镜像队列
docker exec -it rabbitmq_slave1 rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

9、访问主节点控制台

我这里用的虚拟机,访问地址如下:

http://192.168.80.131:15672/#/

图片alt