1、集群形式
RabbitMQ是用Erlang语言开发的,集群非常方便,因为Erlang天生就是一门分布式语言,但其本身并不支持负载均衡。

RabbitMQ集群中节点包括内存节点(RAM)、磁盘节点(Disk,消息持久化),集群中至少有一个Disk节点。

普通模式(默认)
对于普通模式,集群中各节点有相同的队列结构,但消息只会存在于集群中的一个节点。对于消费者来说,若消息进入A节点的Queue中,当从B节点拉取时,RabbitMQ会将消息从A中取出,并经过B发送给消费者。
应用场景:该模式适合于消息无需持久化的场合,如日志队列。当队列非持久化,且创建该队列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列。若为持久化,只能等故障节点恢复。

镜像模式
与普通模式不同之处是消息实体会主动在镜像节点间同步,而不是在取数据时临时拉取,高可用;该模式下,mirror queue有一套选举算法,即1个master、n个slaver,生产者、消费者的请求都会转至master。
应用场景:可靠性要求较高场合,如下单、库存队列。
缺点:若镜像队列过多,且消息体量大,集群内部网络带宽将会被此种同步通讯所消耗。

(1)镜像集群也是基于普通集群,即只有先搭建普通集群,然后才能设置镜像队列。
(2)若消费过程中,master挂掉,则选举新master,若未来得及确认,则可能会重新消费。

2、搭建集群

1.创建3个节点

mkdir /mydata/rabbitmq
cd rabbitmq/
mkdir rabbitmq01 rabbitmq02 rabbitmq03

docker run -d --hostname rabbitmq01 --name rabbitmq01 --privileged=true \
 -v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 \
 -e RABBITMQ_ERLANG_COOKIE='mischen' rabbitmq:management

docker run -d --hostname rabbitmq02 --name rabbitmq02 --privileged=true \
 -v /mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672 \
 -e RABBITMQ_ERLANG_COOKIE='mischen' --link  rabbitmq01:rabbitmq01 rabbitmq:management
 
docker run -d --hostname rabbitmq03 --name rabbitmq03 --privileged=true \
 -v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq -p 15674:15672 -p 5674:5672 \
 -e RABBITMQ_ERLANG_COOKIE='mischen' --link  rabbitmq01:rabbitmq01 --link  rabbitmq02:rabbitmq02 rabbitmq:management

–hostname 设置容器的主机名
RABBITMQ_ERLANG_COOKIE 节点认证作用,部署集成时,需要同步该值

2.节点加入集群

进入第一个节点:

docker exec -it rabbitmq01 /bin/bash

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

进入第二个节点:

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

进入第三个节点:

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

3、实现镜像集群

进入第一个节点:

docker exec -it rabbitmq01 /bin/bash

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

可以使用 rabbitmqctl list_policies -p /; 查看vhost/下面的所有policy

在cluster中任意节点启动策略,策略会自动同步到集群节点

可以使用rabbitmqctl set_policy-p/ha-all"^" ‘{“ha-mode”:“all”}’

策略模式all即复制到所有节点,包含新增节点,策略正则表达式为"^"表示所有匹配

最后查询节点是否正常启动:

[root@centos3 rabbitmq]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                                                                                         NAMES
424bf5b8a652        rabbitmq:management   "docker-entrypoint..."   About an hour ago   Up About an hour    4369/tcp, 5671/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp, 0.0.0.0:15674->15672/tcp   rabbitmq03
2194a6f0b49b        rabbitmq:management   "docker-entrypoint..."   About an hour ago   Up About an hour    4369/tcp, 5671/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp, 0.0.0.0:15673->15672/tcp   rabbitmq02
2eb8a0f7b790        rabbitmq:management   "docker-entrypoint..."   About an hour ago   Up About an hour    4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   rabbitmq01

通过外网访问端口号,看每个端口是否正常:
http://192.168.0.106:15672/#/ http://192.168.0.106:15673/#/
http://192.168.0.106:15674/#/

截图如下:

docker 搭建rabbitmq集群 docker rabbitmq 集群_bash


说明集群模式配置成功