rabbitMQ集群有两种模式:
第一种 普通模式:对于Queue来说,消息实体只存在于其中的一个节点,A/B两个节点仅有相同的元数据(队列结构)。也就是说数据存在于集群中某个节点,我们从另一个节点获取的时候是该节点和存储数据的节点临时进行传输。可以理解为A/B,搭建集群,数据存到A,我们从节点B可以获取到是B节点临时和A节点建立了数据通道从A获取数据,假设A节点宕机,则数据丢失。这种模式的话没有实现高可用。
第二种 镜像模式:也称为HA高可用模式,与普通集群模式区别 主要是消息实体会主动在镜像节点间同步数据,而不是只存储数据元信息。这种模式保证了HA,但是降低了系统性能,如果镜像队列过多,在消息大量进来的情况下,集群内部的网络带宽会被这种内部同步消耗掉,这种适用于可靠性要求较高的场景中。
下面研究镜像集群模式的搭建,还是以docker的形式进行搭建。
1.拉取镜像
docker pull hub.c.163.com/library/rabbitmq:management
2.创建容器,启动两个mq进程
1.容器1
$ docker run -d --hostname rabbitmq01 --name rabbitmqCluster01 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' hub.c.163.com/library/rabbitmq:management df45f88945b572ed8b23c8998db8819e7c7826ded2058ea235c2f04f775f4a2c
2.容器2
$ docker run -d --hostname rabbitmq02 --name rabbitmqCluster02 -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' --link rabbitmqCluster01:rabbitmq01 hub.c.163.com/library/rabbitmq:management 1f18cbceb309d9ac3f723563151d81f18955b1e5534f23222b3e92cba57dbb86
参数解释:
-d: 后台运行容器,并返回容器ID; --hostname rabbitmq02 指定容器的hostname --name="rabbitmqCluster02": 为容器指定一个名称; -p 外部端口:内部端口,是将端口做映射。15672是管理界面端口,5672是客户端通讯接口 -e 设置环境变量 --link=[]: 添加链接到另一个容器;也就是使得两个容器可以通信
这里解释下。-e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' 是设置环境变量。ErlangCookie是保证不同节点间可以互相通信的密钥,要保证不同节点间可以互相通信必须保证共享相同的Erlang Cookie,在容器内部的话是放在/var/lib/rabbitmq/.erlang.cookie
进入容器内部查看:
root@rabbitmq02:/# cat /var/lib/rabbitmq/.erlang.cookie rabbitmqCookie
3.启动后应该通过15672端口和15673端口都可以访问到management控制台
4.容器节点加入集群
1.对节点1设置
(1)进入容器1,也就是rabbitmq01
$ docker exec -it df bash
(2) 停止服务、清数据、重启
root@rabbitmq01:/# rabbitmqctl stop_app #停服务 Stopping rabbit application on node rabbit@rabbitmq01 root@rabbitmq01:/# rabbitmqctl reset #清掉数据 Resetting node rabbit@rabbitmq01 root@rabbitmq01:/# rabbitmqctl start_app 重启 Starting node rabbit@rabbitmq01
2.对节点2设置
(1)进入容器
$ docker exec -it 1f /bin/bash
(2)加入集群
root@rabbitmq02:/# rabbitmqctl stop_app Stopping rabbit application on node rabbit@rabbitmq02 root@rabbitmq02:/# rabbitmqctl reset Resetting node rabbit@rabbitmq02 root@rabbitmq02:/# rabbitmqctl join_cluster --ram rabbit@rabbitmq01 Clustering node rabbit@rabbitmq02 with rabbit@rabbitmq01 root@rabbitmq02:/# rabbitmqctl start_app Starting node rabbit@rabbitmq02
rabbitmqctl join_cluster --ram rabbit@rabbitmq01 是加入集群,rabbitmq01 是另一个节点的hostname。
补充:如果还有第三个节点加入集群,也是用上面的方式加入集群
5.到管理端查看,可以看到节点信息
6. 增加一个策略,设置集群镜像模式
可以到控制台设置,也可以到界面设置。这里在控制台设置:
root@rabbitmq01:/# rabbitmqctl set_policy ha "^" '{"ha-mode":"all"}' Setting policy "ha" for pattern "^" to "{"ha-mode":"all"}" with priority "0"
到界面查看:
到此集群搭建完成。
7.Springboot连接集群
只需要修改连接地址就可以了,如下:
#cluster spring.rabbitmq.addresses=192.168.99.100:5672,192.168.99.100:5673 spring.rabbitmq.username=guest spring.rabbitmq.password=guest