Rabbitmq普通集群模式,是将交换机、绑定、队列的元数据复制到集群里的任何一个节点,但队列内容只存在于特定的节点中,客户端通过连接集群中任意一个节点,即可以生产和消费集群中的任何队列内容(因为每个节点都有集群中所有队列的元数据信息,如果队列内容不在本节点,则本节点会从远程节点获取内容,然后提供给消费者消费)。
从该模式不难看出,普通集群可以让不同的繁忙队列从属于不同的节点,这样可以减轻单节点的压力,提升吞吐量,但是普通集群不能保证队列的高可用性,因为一旦队列所在节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。
rabbitmq镜像集群依赖于普通集群,所以需要先搭建rabbitmq普通集群。
- 环境
操作系统:centos7
docker版本:1.13.1
- 搭建rabbitmq普通集群
docker拉取带management tag的最新版本,我这里最新版本是3.8.7
docker pull rabbitmq:management
启动三个同样cookie的rabbitmq实例(同样的cookie才能加入集群)
- docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management
- docker run -d --hostname rabbit2 --name myrabbit2 -p 15673:15672 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management
- docker run -d --hostname rabbit3 --name myrabbit3 -p 15674:15672 -p 5674:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management
这里注意使用--link将容器实例之前网络联系起来
设置第二和第三个实例,使他们加入集群
- docker exec -it myrabbit1 bash
- rabbitmqctl stop_app
- rabbitmqctl reset
- rabbitmqctl start_app
- exit
- docker exec -it myrabbit2 bash
- rabbitmqctl stop_app
- rabbitmqctl reset
- rabbitmqctl join_cluster rabbit@rabbit1
- rabbitmqctl start_app
- exit
- docker exec -it myrabbit3 bash
- rabbitmqctl stop_app
- rabbitmqctl reset
- rabbitmqctl join_cluster rabbit@rabbit1
- rabbitmqctl start_app
- exit
进入控制台web界面查看http://ip:15672, 可以发现普通集群搭建成功
- 搭建rabbitmq镜像集群
搭建镜像集群是在web控制台完成的,主要操作就是在Admin界面添加一个Policy. 具体参数如下图所示:
参数含义:
pattern: 队列名字的通配符
ha-mode:镜像队列提供了三种模式:
all:全部的节点队列都做镜像;
exactly:指定镜像队列的节点最高镜像数量;
nodes:只为指定具体节点配置镜像队列;
ha-sync-mode :节点之前的同步模式。有自动和手动两种,默认是手动,这里设置为自动。
设置完成并添加了这个策略后,新建的和已存在的队列默认会支持此策略。
至此,rabbitmq镜像集群已搭建成功。