RabbitMQ --- 惰性队列、MQ集群( 三 )


nodes
node names
指定队列创建到哪些节点,如果指定的节点全部不存在,则会出现异常 。如果指定的节点在集群中存在,但是暂时不可用,会创建节点到当前客户端连接到的节点 。
这里我们以命令作为案例来讲解配置语法
模式
rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
all模式
rabbitmqctl set_policy ha-all "^all\." '{"ha-mode":"all"}'
nodes模式
rabbitmqctl set_policy ha-nodes "^nodes\." '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'
测试
我们使用模式的镜像,因为集群节点数量为3,因此镜像数量就设置为2.
运行下面的命令:
docker exec -it mq1 rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
下面,我们创建一个新的队列:
在任意一个mq控制台查看队列:
测试数据共享
给two.queue发送一条消息:
然后在mq1、mq2、mq3的任意控制台查看消息:
测试高可用
现在,我们让two.queue的主节点mq1宕机:
docker stop mq1
查看集群状态:
查看队列状态:
发现依然是健康的!并且其主节点切换到了@mq2上
2.4、仲裁队列 2.4.1、集群特征
仲裁队列:仲裁队列是3.8版本以后才有的新功能,用来替代镜像队列,具备下列特征:
2.4.2、部署
从 3.8版本开始,引入了新的仲裁队列,他具备与镜像队里类似的功能,但使用更加方便 。
添加仲裁队列
在任意控制台添加一个队列,一定要选择队列类型为类型 。
在任意控制台查看队列:
可以看到,仲裁队列的 + 2字样 。代表这个队列有2个镜像节点 。
因为仲裁队列默认的镜像数为5 。如果你的集群有7个节点,那么镜像数肯定是5;而我们集群只有3个节点,因此镜像数量就是3.
2.4.3、Java代码创建仲裁队列
@Beanpublic Queue quorumQueue() {return QueueBuilder.durable("quorum.queue") // 持久化.quorum() // 仲裁队列.build();}
2.4.4、连接MQ集群
注意,这里用来代替host、port方式
spring:rabbitmq:addresses: 192.168.150.105:8071, 192.168.150.105:8072, 192.168.150.105:8073username: mqpassword: 123321virtual-host: /