`

Rabbitmq集群故障队列恢复

 
阅读更多
出自网络,也不知道谁原创,在此做个记录,以备学习,同时加入自己的理解和补充。


                                Rabbitmq集群故障队列恢复

RabbitMQ的mirror queue(镜像队列)机制是最简单的队列HA方案,它通过在cluster的基础上增加ha-mode、ha-param等policy选项,可以根据 需求将cluster中的队列镜像到多个节点上,从而实现高可用,消除cluster模式中队列内容单点带来的风险。

在使用镜像队列之前,有几点注意事项必须熟记于心(下文中将混用主节点和master,从节点和slave):

1. 镜像队列不能作为负载均衡使用,因为每个操作在所有节点都要做一遍。

2. ha-mode参数和durable declare对exclusive队列都不生效,因为exclusive队列是连接独占的,当连接断开,队列自动删除。所以实际上这两个参数对exclusive队列没有意义。

3. 将新节点加入已存在的镜像队列时,默认情况下ha-sync-mode=manual,镜像队列中的消息不会主动同步到新节点,除非显式调用同步命令。当 调用同步命令(via rabbitmqctl or web-based ui)后,队列开始阻塞,无法对其进行操作,直到同步完毕。当ha-sync-mode=automatic时,新加入节点时会默认同步已知的镜像队列。 由于同步过程的限制,所以不建议在生产环境的active队列(有生产消费消息)中操作。

4. 每当一个节点加入或者重新加入(例如从网络分区中恢复回来)镜像队列,之前保存的队列内容会被清空。

5. 镜像队列有主从之分,一个主节点(master),0个或多个从节点(slave)。当master宕掉后,会在slave中选举新的master。选举算法为最早启动的节点。

6. 当所有slave都处在(与master)未同步状态时,并且ha-promote-on-shutdown policy设置为when-syned(默认)时,如果master因为主动的原因停掉,比如是通过rabbitmqctl stop命令停止或者优雅关闭OS,那么slave不会接管master,也就是说此时镜像队列不可用;但是如果master因为被动原因停掉,比如VM 或者OS crash了,那么slave会接管master。这个配置项隐含的价值取向是优先保证消息可靠不丢失,放弃可用性。如果ha-promote-on- shutdown policy设置为alway,那么不论master因为何种原因停止,slave都会接管master,优先保证可用性。

7. 镜像队列中最后一个停止的节点会是master,启动顺序必须是master先起,如果slave先起,它会有30秒的等待时间,等待master启动, 然后加入cluster。当所有节点因故(断电等)同时离线时,每个节点都认为自己不是最后一个停止的节点。要恢复镜像队列,可以尝试在30秒之内同时启 动所有节点。

8. 对于镜像队列,客户端basic.publish操作会同步到所有节点;而其他操作则是通过master中转,再由master将操作作用于salve。 比如一个basic.get操作,假如客户端与slave建立了TCP连接,首先是slave将basic.get请求发送至master,由 master备好数据,返回至slave,投递给消费者。

9. 由8可知,当slave宕掉时,除了与slave相连的客户端连接全部断开之外,没有其他影响。当master宕掉时,会有以下连锁反应:1)与 master相连的客户端连接全部断开。2)选举最老的slave为master。若此时所有slave处于未同步状态,则未同步部分消息丢失。3)新的 master节点requeue所有unack消息,因为这个新节点无法区分这些unack消息是否已经到达客户端,亦或是ack消息丢失在到老 master的通路上,亦或是丢在老master组播ack消息到所有slave的通路上。所以处于消息可靠性的考虑,requeue所有unack的消 息。此时客户端可能受到重复消息。4)如果客户端连着slave,并且basic.consume消息时指定了x-cancel-on-ha- failover参数,那么客户端会收到一个Consumer Cancellation Notification通知,Java SDK中会回调Consumer接口的handleCancel()方法,故需覆盖此方法。如果不指定x-cancel-on-ha-failover参 数,那么消费者就无法感知master宕机,会一直等待下去。

上面列出的注意事项整理自官方的HA文档。

下面的镜像队列恢复才是本文重点:

* 前提:两个节点(A和B)组成一个镜像队列。

* 场景1:A先停,B后停。

该场景下B是master,只要先启动B,再启动A即可。或者先启动A,再在30秒之内启动B即可恢复镜像队列。

* 场景2: A, B同时停。

该场景可能是由掉电等原因造成,只需在30秒之内连续启动A和B即可恢复镜像队列。

* 场景3:A先停,B后停,且A无法恢复。

该场景是场景1的加强版,因为B是master,所以等B起来后,在B节点上调用rabbitmqctl forget_cluster_node A,解除与A的cluster关系,再将新的slave节点加入B即可重新恢复镜像队列。

* 场景4:A先停,B后停,且B无法恢复。

该场景是场景3的加强版,比较难处理,早在3.1.x时代之前貌似都没什么好的解决方法,可能是我不知道,但是现在已经有解决方法了,在3.4.2 版本亲测有效。因为B是master,所以直接启动A是不行的,当A无法启动时,也就没办法在A节点上调用rabbitmqctl forget_cluster_node B了。新版本中,forget_cluster_node支 持–offline参数,offline参数允许rabbitmqctl在离线节点上执行forget_cluster_node命令,迫使 RabbitMQ在未启动的slave节点中选择一个作为master。当在A节点执行rabbitmqctl forget_cluster_node –offline B时,RabbitMQ会mock一个节点代表A,执行forget_cluster_node命令将B剔出cluster,然后A就能正常启动了。最后 将新的slave节点加入A即可重新恢复镜像队列。

* 场景5: A先停,B后停,且A、B均无法恢复,但是能得到A或B的磁盘文件。

该场景是场景4的加强版,更加难处理。将A或B的数据库文件(默认在$RABBIT_HOME/var/lib目录中)拷贝至新节点C的目录下,再 将C的hostname改成A或B的hostname。如果拷过来的是A节点磁盘文件,按场景4处理方式;如果拷过来的是B节点磁盘文件,按场景3处理方 式。最后将新的slave节点加入C即可重新恢复镜像队列。

* 场景6:A先停,B后停,且A、B均无法恢复,且无法得到A或B的磁盘文件。

该场景下已无法恢复A、B队列中的内容了。
分享到:
评论

相关推荐

    RabbitMQ集群环境生产实例部署

    创建RabbitMQ集群的目的是为了提供冗余,防止单点故障,同时通过分散负载来提高处理能力。 部署RabbitMQ集群的步骤通常包括以下几个关键环节: 1. **环境准备**:确保所有节点都运行相同版本的RabbitMQ和Erlang。...

    RabbitMQ集群-ActiveMQ集群集合

    首先,我们来看RabbitMQ集群。RabbitMQ是一款基于AMQP协议的开源消息中间件,由Erlang编程语言实现,以其稳定性和灵活性受到广泛欢迎。在生产环境中,为了提高RabbitMQ的服务可用性和性能,通常会构建RabbitMQ集群。...

    rabbitmq集群测试资源

    综上所述,“rabbitmq集群测试资源”可能包含了创建、配置、监控和故障恢复RabbitMQ集群所需的各种工具和信息,这对于理解和优化RabbitMQ集群的性能和可靠性至关重要。在实际操作中,应根据具体需求和环境调整集群...

    消息中简介Rabbitmq集群搭建

    2. **自动故障恢复**:RabbitMQ 支持自动故障检测和恢复,当节点故障时,其上的队列会被自动迁移到其他节点。 3. **公平分发**:RabbitMQ 提供了公平分发策略,确保消息均匀地发送到消费者。 4. **管理界面**:...

    RabbitMQ高可用集群部署1

    RabbitMQ集群的建立得益于Erlang的分布式特性,通过同步各个节点间的“magic cookie”来实现节点间的通信和认证。集群的主要目标是提供高可用性,当一个节点故障时,其他节点可以接管服务,确保业务连续性。此外,...

    RabbitMQ集群原理介绍.docx

    在RabbitMQ集群中,客户端可以直接连接到包含目标队列的节点进行消息的发布和订阅。如果客户端连接到非目标队列所在的节点,那么该节点会将请求转发给实际的队列节点。 例如,假设客户端连接到节点N2,而目标队列Q...

    RabbitMQ集群 所需的erlang和rabbitmq的rpm包

    标题提到的"RabbitMQ集群 所需的erlang和rabbitmq的rpm包",指的是在构建RabbitMQ集群时,需要先安装Erlang环境,因为RabbitMQ是用Erlang编程语言编写的。Erlang是一种为并发、容错和实时系统设计的编程语言,其强大...

    RabbitMQ系统镜像队列原理和源代码分析1

    RabbitMQ系统镜像队列是一种高可用性的队列配置,旨在确保消息在集群中的多个节点之间冗余存储,以防止单点故障。通过镜像队列,即使某个节点出现问题,其他节点也能继续提供服务,从而保持数据和服务的连续性。 ...

    RabbitMQ (5) rabbitmq集群

    创建一个RabbitMQ集群通常涉及以下步骤: 1. **启动节点**: 在创建集群时,首先需要启动至少三个节点。在示例中,我们看到使用了三个不同端口(5672, 5673, 5674)来区分不同的节点,分别为`rabbit`, `rabbit_1`,...

    shell脚本监控rabbitmq异常发送邮件通知.rar

    Shell脚本将与RabbitMQ的管理命令相结合,通过检查节点状态、队列长度、内存使用情况等关键指标来判断RabbitMQ集群是否正常运行。 从压缩包内的文件名“shell脚本监控rabbitmq异常发送邮件通知”来看,脚本可能包含...

    kubernetes-rabbitmq-cluster:适用于kubernetes的可部署的Rabbitmq集群

    通过这个项目,开发者可以利用Kubernetes的特性,如自动故障恢复、负载均衡和资源调度,来确保RabbitMQ服务的稳定性和可靠性。 在Kubernetes中,RabbitMQ通常会以StatefulSet的形式运行,因为StatefulSet保证了Pods...

    RabbitMQ实战 高效部署分布式消息队列 带目录 高清版 PDF

    同时,会涉及集群(Cluster)和高可用性(High Availability)的设置,通过创建RabbitMQ集群,可以实现多节点之间的数据同步,确保服务的连续性。 此外,结合Java开发,书里将展示如何使用RabbitMQ的Java客户端库...

    消息队列+RabbitMQ3.12.10和Erlang安装包

    - 镜像队列功能可以保证队列的数据在集群中的多个节点间同步,确保故障切换时无数据丢失。 综上所述,通过下载并安装提供的Erlang和RabbitMQ安装包,你可以构建一个稳定的消息队列系统,利用其优势来优化你的应用...

    RabbitMQ实战 高效部署分布式消息队列 PDF下载

    6. **高可用性**:RabbitMQ支持集群模式,允许多个节点组成一个集群,提供故障转移和负载均衡能力。此外,通过镜像队列,可以实现队列级别的数据冗余和高可用。 7. **持久化与可靠性**:RabbitMQ支持消息和队列的...

    RabbitMQ实战高效部署分布式消息队列.pdf+rabbitmq学习手册.pdf

    在本文中,我们将深入探讨RabbitMQ的核心概念、功能特性、部署策略以及如何通过实战来高效地部署分布式消息队列。 1. **RabbitMQ核心概念** - **Broker**: RabbitMQ服务器本身就是一个消息broker,它负责接收、...

    RabbitMQ 高效部署分布式消息队列.zip

    这包括设置节点之间的信任关系,同步磁盘数据,以及配置自动故障恢复机制。同时,了解网络分区(Network Partitions)对RabbitMQ的影响及其处理策略也是十分必要的。 消息队列的高效利用涉及到消息的持久化策略。...

    HA+keepalived+rabbitMq镜像集群安装手册软件

    标题中的“HA+keepalived+rabbitMq镜像集群安装手册软件”指的是构建高可用(High Availability, HA)的rabbitMQ集群,并通过keepalived实现负载均衡的一种方案。在这个配置中,HAProxy将作为前端负载均衡器,而...

    RabbitMQ实战:高效部署分布式消息队列

    5. **消息持久化与高可用**:如何确保消息在系统故障后不丢失以及如何构建高可用的RabbitMQ集群,这些都是实践中的重要问题。书中会提供解决方案和最佳实践。 6. **实战应用**:通过实际案例,如Web应用集成、日志...

    RabbitMQ实战 高效部署分布式消息队列

    - Federation和Shovel:跨集群的解决方案,用于消息在不同RabbitMQ集群间传输。 5. **最佳实践** - 消息确认:启用消息确认机制,确保消息已被正确处理,防止消息丢失。 - 消费者确认:消费者确认模式可以保证...

Global site tag (gtag.js) - Google Analytics