16-微服务技术栈(高级):Docker集群部署RabbitMQ

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 在RabbitMQ的官方文档中,讲述了两种集群的配置方式:● 普通模式:普通模式集群不进行数据同步,每个MQ都有自己的队列、数据信息(其它元数据信息如交换机等会同步)。例如我们有2个MQ:mq1,和mq2,如果你的消息在mq1,而你连接到了mq2,那么mq2会去mq1拉取消息,然后返回给你。如果mq1宕机,消息就会丢失。● 镜像模式:与普通模式不同,队列会在各个mq的镜像节点之间同步,因此你连接到任何一个镜像节点,均可获取到消息。而且如果一个节点宕机,并不会导致数据丢失。不过,这种方式增加了数据同步的带宽消耗。

集群部署

1.集群分类

在RabbitMQ的官方文档中,讲述了两种集群的配置方式:

  • 普通模式:普通模式集群不进行数据同步,每个MQ都有自己的队列、数据信息(其它元数据信息如交换机等会同步)。例如我们有2个MQ:mq1,和mq2,如果你的消息在mq1,而你连接到了mq2,那么mq2会去mq1拉取消息,然后返回给你。如果mq1宕机,消息就会丢失。
  • 镜像模式:与普通模式不同,队列会在各个mq的镜像节点之间同步,因此你连接到任何一个镜像节点,均可获取到消息。而且如果一个节点宕机,并不会导致数据丢失。不过,这种方式增加了数据同步的带宽消耗。

我们先来看普通模式集群,我们的计划部署3节点的mq集群:

主机名

控制台端口

amqp通信端口

mq1

8081 ---> 15672

8071 ---> 5672

mq2

8082 ---> 15672

8072 ---> 5672

mq3

8083 ---> 15672

8073  ---> 5672

集群中的节点标示默认都是:rabbit@[hostname],因此以上三个节点的名称分别为:

2.获取cookie

RabbitMQ底层依赖于Erlang,而Erlang虚拟机就是一个面向分布式的语言,默认就支持集群模式。集群模式中的每个RabbitMQ 节点使用 cookie 来确定它们是否被允许相互通信。要使两个节点能够通信,它们必须具有相同的共享秘密,称为Erlang cookie。cookie 只是一串最多 255 个字符的字母数字字符。

每个集群节点必须具有相同的 cookie。实例之间也需要它来相互通信。我们先在之前启动的mq容器中获取一个cookie值,作为集群的cookie。执行下面的命令:

docker exec -it mq cat /var/lib/rabbitmq/.erlang.cookie

可以看到cookie值如下:

PQJERKAZREMMJWYYWWVD


也可到指定容器下去查找,路径:/var/lib/docker/volumes/最新数据/_data/.erlang.cookie


接下来,停止并删除当前的mq容器,我们重新搭建集群。

docker rm -f mq

3.准备集群配置

在/tmp目录新建一个配置文件 rabbitmq.conf:

cd /tmp

# 创建文件

touch rabbitmq.conf

文件内容如下:

loopback_users.guest = false

listeners.tcp.default = 5672

cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config

cluster_formation.classic_config.nodes.1 = rabbit@mq1

cluster_formation.classic_config.nodes.2 = rabbit@mq2

cluster_formation.classic_config.nodes.3 = rabbit@mq3

再创建一个文件,记录cookie

cd /tmp

# 创建cookie文件

touch .erlang.cookie

# 写入cookie

echo "PQJERKAZREMMJWYYWWVD" > .erlang.cookie

# 修改cookie文件的权限

chmod 600 .erlang.cookie

准备三个目录,mq1、mq2、mq3:

cd /tmp

# 创建目录

mkdir mq1 mq2 mq3

然后拷贝rabbitmq.conf、cookie文件到mq1、mq2、mq3:

# 进入/tmp

cd /tmp

# 拷贝

cp rabbitmq.conf mq1

cp rabbitmq.conf mq2

cp rabbitmq.conf mq3

cp .erlang.cookie mq1

cp .erlang.cookie mq2

cp .erlang.cookie mq3

4.启动集群

创建一个网络,用作集群间通信:

docker network create mq-net

运行命令

docker run -d --net mq-net \

-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \

-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \

-e RABBITMQ_DEFAULT_USER=itcast \

-e RABBITMQ_DEFAULT_PASS=123321 \

--name mq1 \

--hostname mq1 \

-p 8071:5672 \

-p 8081:15672 \

rabbitmq:3.8-management


docker run -d --net mq-net \

-v ${PWD}/mq2/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \

-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \

-e RABBITMQ_DEFAULT_USER=itcast \

-e RABBITMQ_DEFAULT_PASS=123321 \

--name mq2 \

--hostname mq2 \

-p 8072:5672 \

-p 8082:15672 \

rabbitmq:3.8-management


docker run -d --net mq-net \

-v ${PWD}/mq3/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \

-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \

-e RABBITMQ_DEFAULT_USER=itcast \

-e RABBITMQ_DEFAULT_PASS=123321 \

--name mq3 \

--hostname mq3 \

-p 8073:5672 \

-p 8083:15672 \

rabbitmq:3.8-management

5.测试

在mq1这个节点上添加一个队列:

如图,在mq2和mq3两个控制台也都能看到:

5.1.数据共享测试

点击这个队列,进入管理页面:

然后利用控制台发送一条消息到这个队列:

结果在mq2、mq3上都能看到这条消息:

5.2.可用性测试

我们让其中一台节点mq1宕机:

docker stop mq1

然后登录mq2或mq3的控制台,发现simple.queue也不可用了:

说明数据并没有拷贝到mq2、mq3。显然在生产环境下是不可以的,那么如何更好的做集群设计和优化呢?我们将在下一节为大家介绍RabbitMQ的另一种架构:镜像模式

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
打赏
0
1
0
0
403
分享
相关文章
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
214 91
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
358 60
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
187 24
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
223 6
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
微服务架构和 Docker 容器化部署的优点是什么?
微服务架构和 Docker 容器化部署的优点是什么?
使用Docker Compose实现微服务架构的快速部署
使用Docker Compose实现微服务架构的快速部署
124 1
【Docker项目实战】Docker部署RabbitMQ消息中间件
【10月更文挑战第8天】Docker部署RabbitMQ消息中间件
186 1
【Docker项目实战】Docker部署RabbitMQ消息中间件
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
110 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等