rabbitmq镜像队列-高可用性

陌路散爱 提交于 2019-12-01 09:48:03

什么是队列镜像

默认情况下,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没有做镜像队列丢失了

 

实际环境,可以选择需要做镜像的队列进行高可用

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!