Docker RabbitMQ 镜像集群
环境搭建:
Docker启动3个RabbitMQ,第一个MQ为主节点,同时指定 RABBITMQ_ERLANG_COOKIE
。
后面两个镜像为第一个MQ的节点,RABBITMQ_ERLANG_COOKIE` 保持一致,通过 --link 指定关联。
链式关联。
docker run -d --hostname mq1 --name mes_queue_1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7.7-management docker run -d --hostname mq2 --name mes_queue_2 -p 5673:5672 --link mes_queue_1:mq1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7.7-management docker run -d --hostname mq3 --name mes_queue_3 -p 5674:5672 --link mes_queue_1:mq1 --link mes_queue_2:mq2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7.7-management
成功启动3个MQ服务,端口从 5672 - 5674。
进入第一个MQ容器:
docker exec -it 4aee53ed687b /bin/bash
执行以下命令:
root@mq1:/# rabbitmqctl stop_app Stopping rabbit application on node rabbit@mq1 ... root@mq1:/# rabbitmqctl reset Resetting node rabbit@mq1 ... root@mq1:/# rabbitmqctl start_app Starting node rabbit@mq1 ... completed with 3 plugins. root@mq1:/#
进入第二个MQ容器:
PS C:\Users\chaojie> docker exec -it cc178e06ac2f /bin/bash root@mq2:/# rabbitmqctl stop_app Stopping rabbit application on node rabbit@mq2 ... root@mq2:/# rabbitmqctl reset Resetting node rabbit@mq2 ... root@mq2:/# rabbitmqctl join_cluster --ram rabbit@mq1 Clustering node rabbit@mq2 with rabbit@mq1 <---- 加入集群 root@mq2:/# rabbitmqctl start_app Starting node rabbit@mq2 ... completed with 3 plugins. root@mq2:/#
进入第三个MQ容器:
PS C:\Users\chaojie> docker exec -it 7cc63aeaf35d /bin/bash root@mq3:/# rabbitmqctl stop_app Stopping rabbit application on node rabbit@mq3 ... root@mq3:/# rabbitmqctl reset Resetting node rabbit@mq3 ... root@mq3:/# rabbitmqctl join_cluster --ram rabbit@mq1 Clustering node rabbit@mq3 with rabbit@mq1 root@mq3:/#
同步消息队列:所以节点数据同步,队列同步。消息消费同步:任意节点执行
root@mq3:/# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
打开MQ管理界面:
三个MQ已经关联了。
数据已同步。
其中第一个节点 info 中的 disc 表示磁盘节点,磁盘节点会将消息持久化到硬盘,另外的节点持久化到内存,当磁盘节点宕机,消息依然可以收发,,但是不能执行创建队列、交换机、绑定关系、用户,以及更改权限、添加或者删除集群节点的操作。
内存节点宕机没事。
测试:
停止主节点。
docker stop e55a0eff0d36
其他节点不受影响。
打开节点,数据已同步。