如果这篇文章对您有些用处,请点赞告诉我O(∩_∩)O
序
本系列分三章探索实际应用中的RabbitMQ:
【困敦】探索RabbitMQ(一)--搭建高可用集群(HA)
【困敦】探索RabbitMQ(二)--实战rabbitmq.client
【困敦】探索RabbitMQ(三)--实战spring.amqp
本章需要提前在虚拟机中安装docker,具体参考《VirtualBox安装CentOS及Docker》。
这里分三个阶段介绍如何搭建rabbitmq高可用(HA)集群:
第一阶段-搭建rabbitmq镜像集群
第二阶段-nginx + rabbitmq镜像集群
第三阶段-nginx集群 + keepalived + rabbitmq镜像集群
每个阶段有对应的客户端可用性测试,不需要的同学可以跳过。
一、搭建rabbitmq镜像集群
1、拉取rabbitmq镜像并启动三个节点容器
docker pull rabbitmq:3.8.15-management
docker run -d --name rabbitmq1 --hostname rabbitmq_host1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.8.15-management
docker run -d --name rabbitmq2 --hostname rabbitmq_host2 -p 15673:15672 -p 5673:5672 --link rabbitmq1:rabbitmq_host1 rabbitmq:3.8.15-management
docker run -d --name rabbitmq3 --hostname rabbitmq_host3 -p 15674:15672 -p 5674:5672 --link rabbitmq1:rabbitmq_host1 --link rabbitmq2:rabbitmq_host2 rabbitmq:3.8.15-management
注意:
a、可以在docker仓库中选择其他版本,https://hub.docker.com/_/rabbitmq?tab=tags&page=1&ordering=last_updated
b、--link 的作用是使两个节点间可以相互通信(网络),此时还没有组成集群。
2、配置.erlang.cookie
每个节点/var/lib/rabbitmq目录下都有一个隐藏文件.erlang.cookie,其值需要在rabbitmq集群中保持统一。
有两种方式设置:
(1)在docker启动时可以添加参数:-e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie'。设置简单但后面操作中会出现警告:
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version。
(2)启动容器后,在每个容器目录中手动设置。
a、docker宿主机器中,准备一个 .erlang.cookie文件,内容为rabbitmq_cookie,并修改权限为读写,不改权限报错erlang.cookie must be accessible by owner only
chmod 600 .erlang.cookie
b、拷贝到所有容器
docker cp .erlang.cookie rabbitmq1:/var/lib/rabbitmq
docker cp .erlang.cookie rabbitmq2:/var/lib/rabbitmq
docker cp .erlang.cookie rabbitmq3:/var/lib/rabbitmq
c、重启容器
docker restart rabbitmq1
docker restart rabbitmq2
docker restart rabbitmq3
3、将节点加入集群
docker exec -it rabbitmq1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
docker exec -it rabbitmq2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq_host1
rabbitmqctl start_app
exit
docker exec -it rabbitmq3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq_host1
rabbitmqctl start_app
exit
docker exec -it rabbitmq1 bash
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
4、配置镜像集群
docker exec -it rabbitmq1 bash
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
注意:
(1)如果不配置镜像,则为普通集群,每个节点都有元数据,但只有master节点有队列数据,如果访问到slave节点,则从master节点拉数据返回。一旦master节点宕机,选择一个slave节点变为master节点,不阻碍新消息产生和消费,但之前的队列消息会丢失,直至节点恢复。
(2)如果配置镜像集群,与普通集群不同的是,每个节点上都有队列数据,当master节点队列数据发生变化时会主动推送到slave节点,以防止任一节点宕机情况下,已有队列消息丢失,缺点是镜像节点越多,同步消耗越大,性能越低。
5、编写客户端代码
public class RabbitMQHelper {
public static final String QU

本文详细介绍了如何使用Docker搭建RabbitMQ高可用集群,从基础集群到结合nginx进行负载均衡,再到使用keepalived实现nginx集群的高可用。内容涵盖集群搭建、镜像配置、erlang.cookie同步、集群测试及nginx和keepalived的集成。
最低0.47元/天 解锁文章
563





