RabbitMQ 经典镜像队列

本文介绍了RabbitMQ的镜像队列机制,包括队列镜像的作用、配置方式及使用方法。镜像队列增强了可用性,但不提供负载均衡。配置通过策略(policy)实现,ha-mode、ha-params等参数决定镜像行为。当主节点挂载时,最老的镜像节点晋升为主节点。手动或自动同步新加入的节点,并可通过rabbitmqctl set_policy设置镜像策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RabbitMQ 经典镜像队列

1. What’s Queue Mirroring

  • 镜像队列机制可以将队列镜像到集群中的其他Broker节点之上。

  • 一般来说,RabbitMQ中一个队列的内容保存在其声明的节点中。交换器和绑定起保存在所有的节点中。

  • 一个镜像队列由一个主队列和许多镜像队列组成,主队列通常所在的节点通常被认作主节点。每个队列都有自己的主节点。对一个镜像队列的操作会首先作用在其主节点,后传播到其镜像上。

  • 镜像队列只能用于集群的节点之间,不推荐在广域网上使用。

  • 消息会先发送到主队列,之后复制到其他队列上面。消费者无论连接哪一个节点,都会先消费主节点上的消息,镜像队列会丢弃已经被确认的消息。队列镜像机制强化了可用性,但没用在节点间分配负载、没有负载均衡机制。

  • 主队列节点挂掉以后,资历最老的镜像在同步完成后装配提升为主队列,

2. How Mirroring is Configured

  • 镜像队列使用policy进行配置。policy通过正则表达式匹配一个或多个队列,其包含一个可以被加到整个匹配队列属性上的定义。

  • 和操控镜像相关的队列参数

    1. ha-mode

    2. ha-params

    3. ha-sync-mode 可选automatic或mannual

      • 将新节点加入已存在的镜像队列,默认情况下ha-sync-mode的取值为mannual,镜像队列中的消息不会主动同步到新的slave中,除非显示调用同步命令。当调用同步命令后,队列开始阻塞,无法对其进行其他操作,直到同步完成。
      • 当ha-sync-mode设置为automatic时,新加入的slave会默认同步已知的镜像队列。由于同步过程的限制,所以不建议对正在使用的队列进行操作。
    4. ha-promote-on-shutdown 决定未同步的镜像队列是否会接管关闭的主队列

      • 默认为when-synced,在所有slave均未同步的情况下,如果master因为主动原因停止,那么slave不会接管master,也就是此时镜像队列不可用。如果master因为被动原因停止,那么slave会接管master。保证消息可靠不丢失,放弃可用性。
      • 如果设置为always,那么不论master以何种原因停止,slave都会接管master,有限保证可用性,不过消息可能会丢失。
    5. ha-sync-batch-size 镜像同步批处理消息的数量。默认为1 ,一次只同步一条消息,

  • 平时使用rabbitmqctl list_queues只能看到本节点内的队列,当集群内某个节点挂掉时,可以看到该节点的内容。如果开启了镜像模式,则该队列的数据也会同步传送过来。

  • 排他队列不可以创建镜像

3. Using Mirror Queue

  1. 使用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
    
  2. 检测镜像队列状态,不管是否已经同步

    rabbitmqctl list_queues name slave_pids synchronised_slave_pids
    
  3. 手动同步镜像队列

    rabbitmqctl sync_queue {name}
    
  4. 手动取消同步镜像

    rabbitmqctl cancel_sync_queue {name}
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值