【单台服务器】基于docker容器的RabbitMQ镜像集群部署(待完善)

  • Post author:
  • Post category:其他

RabbitMQ集群由是三个单台的RabbitMQ构成


前言

RabbitMQ集群有那些模式?

  1. 普通模式:默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于 Queue 来说,消息实体只存在于其中一个节点 rabbit01(或者 rabbit02),rabbit01 和 rabbit02 两个节点仅有相同的元数据,即队列的结构。当消息进入 rabbit01 节点的 Queue 后,consumer 从 rabbit02 节点消费时,RabbitMQ 会临时在 rabbit01、rabbit02 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer。所以 consumer 应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理 Queue。否则无论 consumer 连 rabbit01 或 rabbit02,出口总在 rabbit01,会产生瓶颈。当 rabbit01 节点故障后,rabbit02 节点无法取到 rabbit01 节点中还未消费的消息实体。如果做了消息持久化,那么得等 rabbit01 节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
  2. 镜像模式:把需要的队列做成镜像队列,存在与多个节点属于 RabbitMQ 的 HA 方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。

一、准备工作

  • 服务器一台,我的系统版本是: CentOS Linux release 7.9.2009 (Core)
  • 服务器安装docker,可自行查找安装资料。Docker官网安装教程:Docker官网安装教程
    我的docker版本是:Docker version 1.13.1, build 7d71120/1.13.1
    使用docker pull指令拉取镜像: docker pull rabbitmq:management
    镜像中-management代表直接开启图形化界面,alpine表示最小安装,一般在正式环境中使用
    若想指定版本可以在冒号后添加相应版本号。
    例如:docker pull rabbitmq:3.7-management

二、创建镜像并启动

在服务器上面使用rabbitmq:3.7-management镜像安装rabbitmq,
创建三个rabbitmq容器并运行。

2.1执行容器rabbitmq01命令

docker run -d --hostname rabbitmq01 --name gd_mq_rabbitmq_1 -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management

2.2执行容器rabbitmq02命令

docker run -d --hostname rabbitmq02 --name gd_mq_rabbitmq_2 -p 15674:15672 -p 5674:5672 --link gd_mq_rabbitmq_1:rabbitmq01 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management

2.3执行容器rabbitmq03命令

docker run -d --hostname rabbitmq03 --name gd_mq_rabbitmq_3 -p 15675:15672 -p 5675:5672 --link gd_mq_rabbitmq_1:rabbitmq01 --link gd_mq_rabbitmq_2:rabbitmq02 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management

在这里插入图片描述


三、查看容器启动状态

在Linux服务器上使用 docker ps 命令查看三个容器是否启动成功

在这里插入图片描述
启动容器后,访问
http://服务器ip:15673
http://服务器ip:15674
http://服务器ip:15675
查看单个容器是否启动成功。
账号/密码:guest / guest。
在这里插入图片描述


四、 配置RabbitMQ集群

4.1进入第一个rabbitmq节点容器

docker exec -it gd_mq_rabbitmq_1 bash

进入容器后,依次执行如下命令:

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit

在这里插入图片描述

4.2 进入第二个rabbitmq节点容器

docker exec -it gd_mq_rabbitmq_2 bash

进入容器后,依次执行如下命令:

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

在这里插入图片描述

4.3进入第三个rabbitmq节点容器

docker exec -it gd_mq_rabbitmq_3 bash

进入容器后,依次执行如下命令:

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

在这里插入图片描述

配置完成后的效果:
在这里插入图片描述


五、实现镜像模式集群

5.1设置镜像队列策略

进入任意容器执行如下
进入容器

docker exec -it gd_mq_rabbitmq_1 bash

执行如下命令(该命令可以在任意一个节点执行)

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

说明:
在cluster中任意节点启用策略,策略会自动同步到集群节点
rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”}’
策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为 “^” 表示匹配所有队列名称。

配置策略前:
在这里插入图片描述

配置策略后:
在这里插入图片描述


总结

本篇文章只是简单描述RabbitMQ的镜像集搭建流程,后期将实现Haproxy负载均衡。。。


版权声明:本文为weixin_44304847原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。