我是靠谱客的博主 稳重画板,最近开发中收集的这篇文章主要介绍RabbitMQ镜像队列,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

镜像队列的介绍

RabbitMQ 中队列的内容是保存在单个节点本地的(声明队列的节点)。跟交换器和绑定不同,它 们是对于集群中所有节点的。如此,则队列内容存在单点故障,解决方式之一就是使用镜像队列。在多 个节点上拷贝队列的副本。

每个镜像队列包含一个 master,若干个镜像。 master 存在于称为 master 的节点上。 所有的操作都是首先对 master 执行,之后广播到镜像。 这涉及排队发布,向消费者传递消息,跟踪来自消费者的确认等。 镜像意味着集群,不应该 WAN 使用。

发布到队列的消息会拷贝到该队列所有的镜像。消费者连接到 master,当消费者对消息确认之后, 镜像删除 master 确认的消息。

队列的镜像提供了高可用,但是没有负载均衡。 HTTP API 和 CLI 工具中队列对象的字段原来使用的是 slave 代表 secondaries,现在盖字段的存在仅 是为了向后兼容,后续版本会移除。

可以使用策略随时更改队列的类型,可以首先创建一个非镜像队列,然后使用策略将其配置为镜像 队列或者反过来。非镜像队列没有额外的基础设施,因此可以提供更高的吞吐率。

镜像队列 Master 选举

master 选举策略:

  1. **最长的运行镜像升级为主镜像,前提是假定它与主镜像完全同步。**如果没有与主服务器同步的 镜像,则仅存在于主服务器上的消息将丢失。
  2. 镜像认为所有以前的消费者都已突然断开连接。它重新排队已传递给客户端但正在等待确认的 所有消息。这包括客户端已为其发出确认的消息,例如,确认是在到达节点托管队列主节点之 前在线路上丢失了,还是在从主节点广播到镜像时丢失了。在这两种情况下,新的主服务器都 别无选择,只能重新排队它尚未收到确认的所有消息。
  3. 队列故障转移时请求通知的消费者将收到取消通知。当镜像队列发生了 master 的故障转移, 系统就不知道向哪些消费者发送了哪些消息。已经发送的等待确认的消息会重新排队
  4. 重新排队的结果是,从队列重新使用的客户端必须意识到,他们很可能随后会收到已经收到的 消息。
  5. 当所选镜像成为主镜像时,在此期间发布到镜像队列的消息将不会丢失(除非在提升的节点上 发生后续故障)。发布到承载队列镜像的节点的消息将路由到队列主服务器,然后复制到所有 镜像。如果主服务器发生故障,则消息将继续发送到镜像,并在完成向主服务器的镜像升级后 将其添加到队列中。
  6. 即使主服务器(或任何镜像)在正在发布的消息与发布者收到的确认之间失败,由客户端使用 发布者确认发布的消息仍将得到确认。从发布者的角度来看,发布到镜像队列与发布到非镜像 队列没有什么不同。

镜像队列的类型

ha- modeha- params结果
exactlycount设置集群中队列副本的个数(镜像 +master)。1 表示一个副本;也就 是 master。如果 master 不可用,行为依赖于队列的持久化机制。2 表示 1 个 master 和 1 个镜像。如果 master 不可用,则根据镜像推举策略从镜 像中选出一个做 master。如果节点数量比镜像副本个数少,则镜像覆盖 到所有节点。如果 count 个数少于集群节点个数,则在一个镜像宕机 后,会在其他节点创建出来一个镜像。将“exactly”模式与“ha-promote- on-shutdown”: “ always”一起使用可能很危险,因为队列可以在整个集 群中迁移并在关闭时变得不同步。
all(none)镜像覆盖到集群中的所有节点。当添加一个新的节点,队列就会复制过 去。这个配置很保守。一般推荐 N/2+1 个节点。在集群所有节点拷贝镜 像会给集群所有节点施加额外的负载,包括网络 IO,磁盘 IO 和磁盘空间 使用。
nodesnode names在指定 node name 的节点上复制镜像。node name 就是在 rabbitmqctl cluster_status 命令输出中的 node name。如果有不属于集群的节点名 称,它不报错。如果指定的节点都不在线,则仅在客户端连接到的声明 镜像的节点上创建镜像。

镜像队列具体设置

镜像队列就是对于把 Master 的消息数据同步到 Slave 中一份,保证高可用,操作依然是由 Master 处理

镜像队列类型 ha-mode 选择节点类型,ha-params 选择节点个数

exactly 就是确认几个节点 比如集群 5 台机器,count=3 代表 1 更 M 2 个 S 剩下两机器备用就是 MS 挂了之后补上

all 不需要配置节点个数 比如集群 5 台机器,则一台 Master 其他 4 台 Slave

nodes 则是根据配置的 node name 来作为副本镜像 slave

官方文档

https://www.rabbitmq.com/ha.html

配置设置

在{{RabbitMQ 集群部署}} 的基础上进行配置镜像队列

 # rabbitmqctl set_policy 命令
 # myhalf 设置 策略名称
 # "^queue.*3$"设置正则匹配队列名称
 # {"ha-mode":exactly","ha-params":2} exactly模式 count为2代表1主1从
 rabbitmqctl set_policy myhalf "^queue.*3$" '{"ha-mode":"exactly","ha-params":2}' 
#取消该镜像队列的设置
 rabbitmqctl set_policy myhalf "^queue.*3$" '{"ha-mode":"exactly","ha-params":1}'

其他配置

# 对/节点配置镜像队列,使用全局复制 
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
# 指定优先级,数字越大,优先级越高
rabbitmqctl set_policy --priority 1 ha-all "^" '{"ha-mode":"all"}'

测试

创建一个队列名称 queue.mirror3

image.png

设置策略查看具体信息 node3 为 master node1 为 slave

image.png

发送消息

image.png

image.png

关闭 mirror Node1

rabbitmqctl stop_app

mirro 变成了 node2,未同步,点击 synchronized 进行同步

image.png

启动 node1 ,mirror 不会再改变成 node1 了

取消该镜像队列的设置

 rabbitmqctl set_policy myhalf "^queue.*3$" '{"ha-mode":"exactly","ha-params":1}'

最后

以上就是稳重画板为你收集整理的RabbitMQ镜像队列的全部内容,希望文章能够帮你解决RabbitMQ镜像队列所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部