CentOS7中使用Docker简单搭建RabbitMQ集群

RabbitMQ提供了两种常用的集群模式
1.普通集群模式
2.镜像集群模式

普通集群模式只能同步主节点上的交换机和队列信息,但对于队列中的消息不做同步,主节点宕机也不能进行切换(故障转移)。

镜像集群模式在普通集群模式的基础上配置,可以使子节点备份master队列中的消息,也可以在master宕机时进行故障转移,切换至子节点提供服务。

由于镜像集群模式基于普通集群模式上进行配置,所以直接搭建普通集群模式。

普通集群搭建

首先要确保已经安装docker,从中央仓库拉取rabbitmq镜像

docker pull rabbitmq:management

注:不指定版本号为拉取最新版,这里:management表示拉取带有web管理页面插件的镜像

在拉取镜像的时候闲着没事干,可以先创建目录后续用做挂载容器目录,这里我放在/tmp/下

mkdir /tmp/rabbitmqcluster
cd /tmp/rabbitmqcluster
mkdir rabbitmq01 rabbitmq02 rabbitmq03

运行rabbitmq镜像,需要多少个节点就启动多少个容器

##主节点
docker run -d --hostname rabbitmq01 --name rabbitmqCluster01 -v /tmp/rabbitmqcluster/rabbitmq01:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' rabbitmq:management 

##子节点
docker run -d --hostname rabbitmq02 --name rabbitmqCluster02 -v /tmp/rabbitmqcluster/rabbitmq02:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie'  --link rabbitmqCluster01:rabbitmq01 rabbitmq:management


##子节点
docker run -d --hostname rabbitmq03 --name rabbitmqCluster03 -v /tmp/rabbitmqcluster/rabbitmq03:/var/lib/rabbitmq -p 15674:15672 -p 5674:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie'  --link rabbitmqCluster01:rabbitmq01 --link rabbitmqCluster02:rabbitmq02  rabbitmq:management

–hostsname 容器中的主机名,便于区分

–name 容器名

-v 挂载Linux的目录到容器内目录

-p 映射Linux系统的端口与容器内端口,注意要使用未被占用的端口,每个容器都有两个端口,15672为web页面的访问端口,5672为服务端口

-e 容器环境变量, RABBITMQ_ERLANG_COOKIE 是rabbitmq节点加入集群必须的认证手段

-link 使容器间可以通信

放行CentOS7虚拟机的端口

firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=15673/tcp --permanent
firewall-cmd --zone=public --add-port=15674/tcp --permanent
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=5673/tcp --permanent
firewall-cmd --zone=public --add-port=5674/tcp --permanent
firewall-cmd --reload

启动后尝试访问web管理页面是否成功

我的CentOS虚拟机ip为192.168.1.223

访问,并使用默认的guest账号登录(username:guest,password:guest)

http://192.168.1.223:15672

http://192.168.1.223:15673

http://192.168.1.223:15674

正常,继续下一步

使用docker exec进入主节点所在容器的主机

docker exec -it rabbitmqCluster01 /bin/bash

关闭rabbitmq应用,并重置节点数据,再重新启动应用

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit

进入子节点所在rabbitmq02主机

docker exec -it rabbitmqCluster02 /bin/bash

同样关闭应用,并重置节点数据,然后使用rabbitmqctl join_cluster指令加入主节点所在集群,完成后启动服务

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

然后进另一个子节点的主机,如法炮制

docker exec -it rabbitmqCluster03 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

此时可以在web界面的总览面板看到三个节点信息

在这里插入图片描述

此时搭建普通集群已完成

镜像集群配置

进入主节点所在容器主机

docker exec -it rabbitmqCluster01 /bin/bash

设置镜像集群策略(注意,策略可以在队列产生前设置,也可以在队列产生后设置)

rabbitmqctl set_policy --vhost "/MyVirtualHost" ha-all "^hello" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

–vhost 需要使用镜像集群的虚拟主机(Virtual Host)也可不指定,不指定则视为"/"主机,这里我指定测试用的/MyVirtualHost

ha-all 是我指定的策略名

“^hello” 通配符匹配,这里指定队列名以hello开头的队列,如果需要指定所有队列使用 “^”

‘{“ha-mode”:“all”,“ha-sync-mode”:“automatic”}’ json格式的参数,其中ha-mode为镜像队列的模式,这里设置all,集群内所有节点都备份镜像;ha-sync-mode是消息队列同步方式,automatic自动同步

设置后在web界面可以看到队列的状态变化

在这里插入图片描述

往队列中发送了一条消息
在这里插入图片描述

子节点备份到了hello队列的消息
在这里插入图片描述

我让主节点宕机

在这里插入图片描述

会发现,此时的主节点从01切换到了03,而且hello队列中的消息也在

在这里插入图片描述

更改项目配置,尝试从03节点消费这条消息

在这里插入图片描述

消费成功

在这里插入图片描述

删除策略,使用rabbitmqctl clear_policy --vhost 指令,name为你要删除的策略名,可选参数–vhost指定虚拟主机名,如果不指定默认为删除"/"的策略。这里因为我的策略是加在/MyVirtualHost这个虚拟主机上的,所以需要指定。

rabbitmqctl clear_policy ha-all --vhost "/MyVirtualHost"

clear成功
在这里插入图片描述

队列恢复到了普通集群状态
在这里插入图片描述

参考:
https://www.bilibili.com/video/BV1dE411K7MG
https://blog.csdn.net/belonghuang157405/article/details/83540148

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值