什么是队列镜像
默认情况下,RabbitMQ集群中队列的内容位于单个节点(声明该队列的节点)上。这与交换和绑定相反,交换和绑定始终可以被视为在所有节点上。可以选择使队列跨多个节点进行镜像。
每个镜像队列由一个主服务器和一个或多个镜像组成。主节点托管在一个通常称为主节点的节点上。每个队列都有其自己的主节点。给定队列的所有操作都首先应用于队列的主节点,然后传播到镜像。这涉及排队发布,向消费者传递消息,跟踪 来自消费者的确认等。
队列镜像意味着节点的集群。因此,不建议在WAN中使用它(当然,客户端仍然可以根据需要进行远近连接)。
发布到队列的消息将复制到所有镜像。消费者连接到主服务器,无论他们连接到哪个节点,镜像都会丢弃已在主服务器上确认的消息。因此,队列镜像可提高可用性,但不会在节点之间分配负载(所有参与节点均完成所有工作)。
如果承载队列主服务器的节点发生故障,则最早的镜像将在同步后提升为新的主服务器。 根据队列镜像参数,也可以升级不同步的镜像。
通常有多个术语用于标识分布式系统中的主副本和辅助副本。本指南通常使用“主”来指代队列的主副本,并使用“镜像”来指代辅助副本。但是,RabbitMQ CLI工具在历史上一直使用术语“从属”来引用次级。因此,该术语仍显示在CLI工具的列名中,以实现向后兼容,但最终将被替换。
镜像的配置方式
使用策略配置镜像参数。一个策略按名称(使用正则表达式模式)匹配一个或多个队列,并包含一个定义(可选参数的映射),该定义被添加到匹配队列的全部属性中。
关键策略属性是
- 名称:可以是任何东西,但建议使用不带空格的基于ASCII的名称
- 模式:与一个或多个队列(交换)名称匹配的正则表达式。可以使用任何正则表达式。
- 定义:一组键/值对(例如JSON文档),将被插入匹配队列和交换的可选参数映射中
- 优先级:请参见下文
rabbitmqctl set_policy federate-me "^amq\." '{"federation-upstream-set":"all"}' --priority 1 --apply-to exchanges
rabbitmqctl set_policy 设置策略的命令
federate-me 策略名称
"^amq\." 正则表达式
'{"federation-upstream-set":"all"}' 定义的参数
--priority 1 优先级
--apply-to exchanges 应用到交换中(还没弄清!😄)
说实话,光看官方文档,有点云里雾里,还是直接操作
$ rabbitmqctl set_policy testpolicy "mq$" '{"ha-mode":"all"}' --priority 1 --apply-to exchanges 策略应用到交换机
$ rabbitmqctl set_policy testpolicy "mq$" '{"ha-mode":"all"}' --priority 1 --apply-to queues 策略应用到队列
应用到队列执行后,可以从web端看到策略已经匹配
还可以使用 --apply-to all,应用到所有
说明一下测试的情况
node1建立的testQueue队列,node2建立了testmq队列,testmq做了镜像队列
现在去node2 停掉mq, $ rabbitmq stop_app
去node1的web界面看一下,testmq队列没有丢失
相反,我们把node2启动,停掉node1的mq
再去node2的web界面看一下,发现只有testmq,在node1建立的testQueue没有做镜像队列丢失了
实际环境,可以选择需要做镜像的队列进行高可用