个人名片:
博主:酒徒ᝰ.
个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志:三人行,必有我师焉。
本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看
五、MQ集群
4. 仲裁队列
- 集群特征
仲裁队列:仲裁队列是3.8版本以后才有的新功能,用来替代镜像队列,具备下列特征:
- 与镜像队列一样,都是主从模式,支持主从数据同步
- 使用非常简单,没有复杂的配置
- 主从同步基于Raft协议,强一致
- 添加仲裁队列
在任意控制台添加一个队列,一定要选择队列类型为Quorum类型。
在任意控制台查看队列:
可以看到,仲裁队列的 + 2字样。代表这个队列有2个镜像节点。
因为仲裁队列默认的镜像数为5。如果你的集群有7个节点,那么镜像数肯定是5;而我们集群只有3个节点,因此镜像数量就是3.
- 测试
1)测试数据共享
给mq1发送一条消息:
然后在mq1、mq2、mq3的任意控制台查看消息:
2)测试高可用
现在,我们让two.queue的主节点mq1宕机:
docker stop mq1
查看队列状态:
发现依然是健康的!并且其主节点切换到了rabbit@mq2上
- 集群扩容
1)加入集群
按照下面次序依次执行
①启动一个新的MQ容器:
docker run -d --net mq-net \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq4 \
--hostname mq4 \
-p 8074:15672 \
-p 8084:15672 \
rabbitmq:3.8-management
②进入容器控制台:
docker exec -it mq4 bash
③停止mq进程
rabbitmqctl stop_app
④重置RabbitMQ中的数据:
rabbitmqctl reset
⑤加入mq1:
rabbitmqctl join_cluster rabbit@mq1
⑥再次启动mq进程
rabbitmqctl start_app
查看集群状态:
2)增加仲裁队列副本
我们先查看下quorum.queue这个队列目前的副本情况,进入mq1容器:
docker exec -it mq1 bash
执行命令:
# 查看集群状态
rabbitmq-queues quorum_status "quorum.queue"
将mq4加入:
rabbitmq-queues add_member "quorum.queue" "rabbit@mq4"
查看控制台,发现quorum.queue的镜像数量也从原来的 +2 变成了 +3:
- Java代码创建仲裁队列
@Bean
public Queue quorumQueue() {
return QueueBuilder
.durable("quorum.queue")
.quorum() // 仲裁队列
.build();
}
- SpringAMQP连接MQ集群
注意,这里用address来代替host、port方式
spring:
rabbitmq:
addresses: [虚拟机ip地址]:8071, [虚拟机ip地址]:8072, [虚拟机ip地址]:8073