2.安装DelayExchange插件( 三 )


总结如下:
4.2.镜像模式的配置
镜像模式的配置有3种模式:
ha--效果
准确模式
队列的副本量count
集群中队列副本(主服务器和镜像服务器之和)的数量 。count如果为1意味着单个副本:即队列主节点 。count值为2表示2个副本:1个队列主和1个队列镜像 。换句话说:count = 镜像数量 + 1 。如果群集中的节点数少于count,则该队列将镜像到所有节点 。如果有集群总数大于count+1,并且包含镜像的节点出现故障,则将在另一个节点上创建一个新的镜像 。
all
(none)
队列在群集中的所有节点之间进行镜像 。队列将镜像到任何新加入的节点 。镜像到所有节点将对所有群集节点施加额外的压力,包括网络I / O,磁盘I / O和磁盘空间使用情况 。推荐使用,设置副本数为(N / 2 +1) 。
nodes
node names
指定队列创建到哪些节点,如果指定的节点全部不存在,则会出现异常 。如果指定的节点在集群中存在,但是暂时不可用,会创建节点到当前客户端连接到的节点 。
这里我们以命令作为案例来讲解配置语法 。
语法示例:

2.安装DelayExchange插件

文章插图
4.2.1.模式
rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
4.2.2.all模式
rabbitmqctl set_policy ha-all "^all\." '{"ha-mode":"all"}'
4.2.3.nodes模式
rabbitmqctl set_policy ha-nodes "^nodes\." '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'
4.3.测试
我们使用模式的镜像,因为集群节点数量为3,因此镜像数量就设置为2.
运行下面的命令:
docker exec -it mq1 rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
下面,我们创建一个新的队列:
在任意一个mq控制台查看队列:
4.3.1.测试数据共享
给two.queue发送一条消息:
然后在mq1、mq2、mq3的任意控制台查看消息:
4.3.2.测试高可用
现在,我们让two.queue的主节点mq1宕机:
docker stop mq1
查看集群状态:
查看队列状态:
发现依然是健康的!并且其主节点切换到了@mq2上
5.仲裁队列
从 3.8版本开始,引入了新的仲裁队列,他具备与镜像队里类似的功能,但使用更加方便 。
5.1.添加仲裁队列
在任意控制台添加一个队列,一定要选择队列类型为类型 。
在任意控制台查看队列:
可以看到,仲裁队列的 + 2字样 。代表这个队列有2个镜像节点 。
因为仲裁队列默认的镜像数为5 。如果你的集群有7个节点,那么镜像数肯定是5;而我们集群只有3个节点,因此镜像数量就是3.
5.2.测试
可以参考对镜像集群的测试,效果是一样的 。
5.3.集群扩容 5.3.1.加入集群
1)启动一个新的MQ容器:
docker run -d --net mq-net \-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \-e RABBITMQ_DEFAULT_USER=root \-e RABBITMQ_DEFAULT_PASS=1234 \--name mq4 \--hostname mq5 \-p 8074:15672 \-p 8084:15672 \rabbitmq:3.8-management
2)进入容器控制台:
docker exec -it mq4 bash
3)停止mq进程
rabbitmqctl stop_app
4)重置中的数据:
rabbitmqctl reset