RabbitMQ 经典镜像队列
1. What’s Queue Mirroring
-
镜像队列机制可以将队列镜像到集群中的其他Broker节点之上。
-
一般来说,RabbitMQ中一个队列的内容保存在其声明的节点中。交换器和绑定起保存在所有的节点中。
-
一个镜像队列由一个主队列和许多镜像队列组成,主队列通常所在的节点通常被认作主节点。每个队列都有自己的主节点。对一个镜像队列的操作会首先作用在其主节点,后传播到其镜像上。
-
镜像队列只能用于集群的节点之间,不推荐在广域网上使用。
-
消息会先发送到主队列,之后复制到其他队列上面。消费者无论连接哪一个节点,都会先消费主节点上的消息,镜像队列会丢弃已经被确认的消息。队列镜像机制强化了可用性,但没用在节点间分配负载、没有负载均衡机制。
-
主队列节点挂掉以后,资历最老的镜像在同步完成后装配提升为主队列,
2. How Mirroring is Configured
-
镜像队列使用policy进行配置。policy通过正则表达式匹配一个或多个队列,其包含一个可以被加到整个匹配队列属性上的定义。
-
和操控镜像相关的队列参数
-
ha-mode
-
ha-params
-
ha-sync-mode 可选automatic或mannual
- 将新节点加入已存在的镜像队列,默认情况下ha-sync-mode的取值为mannual,镜像队列中的消息不会主动同步到新的slave中,除非显示调用同步命令。当调用同步命令后,队列开始阻塞,无法对其进行其他操作,直到同步完成。
- 当ha-sync-mode设置为automatic时,新加入的slave会默认同步已知的镜像队列。由于同步过程的限制,所以不建议对正在使用的队列进行操作。
-
ha-promote-on-shutdown 决定未同步的镜像队列是否会接管关闭的主队列
- 默认为when-synced,在所有slave均未同步的情况下,如果master因为主动原因停止,那么slave不会接管master,也就是此时镜像队列不可用。如果master因为被动原因停止,那么slave会接管master。保证消息可靠不丢失,放弃可用性。
- 如果设置为always,那么不论master以何种原因停止,slave都会接管master,有限保证可用性,不过消息可能会丢失。
-
ha-sync-batch-size 镜像同步批处理消息的数量。默认为1 ,一次只同步一条消息,
-
-
平时使用rabbitmqctl list_queues只能看到本节点内的队列,当集群内某个节点挂掉时,可以看到该节点的内容。如果开启了镜像模式,则该队列的数据也会同步传送过来。
-
排他队列不可以创建镜像
3. Using Mirror Queue
-
使用rabbitmqctl set_policy --apply-to queues 指令来进行设置
##设置为vhost / 中的node2.queue1队列启用镜像队列,在所有添加进来的节点中为其增加镜像,同步策略为自动同步 rabbitmqctl set_policy --apply-to queues mirrorP2 "node2.queue1" \ > '{ > "ha-mode":"all", > "ha-sync-mode":"automatic"}' Setting policy "mirrorP2" for pattern "node2.queue1" to "{ "ha-mode":"all" ,"ha-sync-mode":"automatic"}" with priority "0" for vhost "/" ...
设置成功后,rabbitmq会在日志中添加
2020-12-22 22:00:10.409 [info] <0.15827.0> Successfully set policy 'mirrorP2' matching queues names in virtual host '/' using pattern 'node2.queue1' 2020-12-22 22:00:10.411 [info] <0.7027.0> Mirrored queue 'node2.queue1' in vhost '/': Adding mirror on node rabbit@node2: <46700.11962.0> 2020-12-22 22:00:10.430 [info] <0.7027.0> Mirrored queue 'node2.queue1' in vhost '/': Synchronising: 0 messages to synchronise 2020-12-22 22:00:10.430 [info] <0.7027.0> Mirrored queue 'node2.queue1' in vhost '/': Synchronising: batch size: 4096 2020-12-22 22:00:10.445 [info] <0.15836.0> Mirrored queue 'node2.queue1' in vhost '/': Synchronising: all mirrors already synced
-
检测镜像队列状态,不管是否已经同步
rabbitmqctl list_queues name slave_pids synchronised_slave_pids
-
手动同步镜像队列
rabbitmqctl sync_queue {name}
-
手动取消同步镜像
rabbitmqctl cancel_sync_queue {name}