RabbitMQ的集群方案有以下几种:
1.普通的集群
exchange,buindling再所有的节点上都会保存一份,但是queue只会存储在其中的一个节点上,但是所有的节点都会存储一份queue的meta信息。因为这样有两个好处:
1)存储空间。如果每一个节点上都有全部的消息,有多少个节点就会有多少个消息总量的copy。加入一个队列的消息占用的空间是1G,那么三个节点就是3G
2) 性能。消息需要在节点之间传输会有很大的网络开销。如果消息设置了durable即持久化,还会增加很大的磁盘负载
队列存储的节点取决于,创建队列的客户端当时所连接的节点。如果生产者连接的是另外一个节点,将会把消息转发到存储该队列的节点上。如果消费者连接了非存储队列的节点取数据,者从存储消息的节点拉去数据。所以:
1)创建队列都连到了一个节点上,所有的队列都存储在一个节点上。
2)存消息的节点挂掉了,consumer只能等到节点恢复后才能读到消息。
3)设A,B节点,queue数据在A上:可以向A或B生产或消费消息。但是一旦往B生产消息时A挂了,client是不会收到任何错误信息的并可以继续发送,而实际上消息是被丢弃了。一旦此时client挂了后在连接B会报节点A不存在而失败。在B读也是类似的,在client批量取到的数据读完之前是不会感知A有没有挂掉,等到读取下一批数据时一旦A挂掉会报错。
所以这种集群方法的特点是:
1) 高吞吐量
2)非高可用
2.镜像模式
镜像模式和普通模式的区别就是,队列的数据都镜像了一份到所有的节点上。这样任何一个节点失效,不会影响整个集群的使用。
在实现上,mirror queue内部有一套选举算法,会选出一个master,和若干个slaver。master和slaver 通过相互间不断发送心跳来检查是否连接断开。可以通过指定net_ticktime来控制心跳检查频率。注意一个单位时间net_ticktime实际上做了4次交互,故当超过net_ticktime (± 25%) 秒没有响应的话则认为节点挂掉。另外注意修改net_ticktime时需要所有节点都一致。
配置举例:
[
{rabbit, [{tcp_listeners, [5672]}]},
{kernel, [{net_ticktime, 120}]}
].
consumer,任意连接一个节点,若连上的不是master,请求会转发给master,为了保证消息的可靠性,consumer回复ack给master后,master删除消息并广播所有的slaver去删除。
publisher ,任意连接一个节点,若连上的不是master,则转发给master,由master存储并转发给其他的slaver存储。
如果master挂掉,则从slaver中选择消息队列最长的为master,在这种情况下可以存在消息未同步给ack消息未同步的情况,会造成消息重发(默认是异步同步的)。总共有以下几件事情发生:
1)1个最老的(队列最长的)的slaver提升为master,如果没有一个slaver是和master同步的则会造成消息丢失。
2) 要提升为master的slaver会认为以前所有连接挂掉的master的消费者都断开了连接。那么存在clinet发送了ack的消息单还在路上是master挂掉的情况,或者master收到了ack但是在广播给slaver的时候master挂掉的情况,所以新的master别无选择,只能认为消息没有被确认。他会requeue他认为没有ack的消息。那么client可能就收到了重复的消息,并要再次发送ack。
3)从镜像队列中消费的client支持了consumer Cancellation通知的,将收到通知并订阅的mirrored-queue被取消了,这是因为该mirrored-queue 升级成了master,这是client需要重现去找mirrored-queue上消费,这样就避免了client继续发送ack到老的挂掉的master上。避免收到新的master发送的相同的消息。
4)如果noAck=true,且在mirrored-queue上消费,那么在切换时由于服务器是先ack然后发送到noAck=true的消费者,这时连接断开可能导致该数据丢失
如果slaver挂掉,则集群的节点状态没有任何变化。只要client没有连到这个节点上,也不会给client发送失败的通知。在检测到slaver挂掉的期间publish消息会有延迟。如果配置了高可用策略是自动同步,当slaver起来后,队列中有大量的消息需要同步,将会整个集群阻塞长时间的不能读写直到同步结束。
这两个挂掉的情况都需要客户端镜像容错,比如在连接断开的时候进行重连(官方的Java和.net 客户端提供了callback方法在监听到链接失败的时候调用。Java在Connection和channel类中提供了ShutdownListener 的callback方法,.net client在IConnecton中提供了ConnectionShuedown在Imodel中提供了ImodelShutdown事件供调用) 。也可以在client和server之间加入LoadBalancer.比如haproxy做负载均衡。
指定mirror策略:
有三种策略:
all:队列将mirrored到所有集群中的节点中,当新节点添加进来时也会mirrored到新的节点
exactly(需指定count):如果节点数小于count数,则队列将mirrored到所有的节点。如果节点数大于count,新的节点将不再创建队列的mirror(即使原来已创建mirror的节点挂掉也不会创建)
nodes:对指定的节点进行mirror。如果没有一个指定的节点在运行中,那么只有client连接的那个节点才会声明queue(这里有个迁移策略:假如queue是在[A,B]上且A为master,若给定的新的策略为nodes[C,D],那么为了防止数据丢失,在迁移中会同时存在[A,C,D]直到C,D已经同步好以后,A才会关闭)
配置举例:
设置queue的名称为ha.的为高可用:
linux:rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'
win:rabbitmqctl set_policy ha-all "^ha\." "{""ha-mode"":""all""}"
http api:PUT /api/policies/%2f/ha-all {"pattern":"^ha\.", "definition":{"ha-mode":"all"}}
web ui:
1:Navigate to Admin > Policies > Add / update a policy.
2:Enter "ha-all" next to Name, "^ha\." next to Pattern, and "ha-mode" = "all" in the first line next to Policy.
3:Click Add policy.
举例2:
rabbitmqctl set_policy ha-two "^two\." \
'{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
自动或手动同步:
你可以查看哪些slave已经同步好了:
rabbitmqctl list_queues name slave_pids synchronised_slave_pids
你可以手动同步(默认手动同步):
rabbitmqctl sync_queue name
你可以取消自动同步:
rabbitmqctl cancel_sync_queue name
一个没有同步的mirror,它仍然会同步后续插入队列的数据,但是队列前面的数据却没有。但是随着队列的不断消费,导致空缺的部分的消息被消费掉了,此时mirror也可以是同步了的。
3.主备集群
主备方式(active,passive)只有一个节点处于服务状态,可以结合pacemaker和ARBD,
shovel简单从一个broker的一个队列中消费消息,且转发该消息到另一个broker的交换机。
这种方式用的比较少,这里就不做介绍了。详见http://www.rabbitmq.com/pacemaker.html
分享到:
相关推荐
#### 方案二:高可用性方案 **问题分析** RabbitMQ提供了队列镜像的功能,用于增强系统的可靠性和容错能力。然而,这种方式会因冗余数据而带来一定的性能损耗,特别是在需要同步更新所有镜像队列的情况下。 **...
RabbitMQ支持集群模式,可以将多个节点连接起来,形成一个高可用、高性能的解决方案。集群中的节点间通过网络通信,共享队列和数据,从而实现冗余和故障转移。 总结来说,RabbitMQ自动安装脚本是高效部署RabbitMQ的...
RabbitMQ由Erlang语言编写,具有高可用性、稳定性和可扩展性。 **RabbitMQ.Client库** `RabbitMQ.Client`是.NET平台上用于与RabbitMQ服务器通信的官方客户端库。这个库提供了丰富的API,允许开发者创建、发送、...
RabbitMQ支持多种高可用性策略,如镜像队列、网络分区容忍和HAProxy集成,确保服务的连续性。 总结,RabbitMQ 3.10.1作为一个强大的消息中间件,为企业级应用提供了一种高效、可靠的消息传递解决方案。了解并熟练...
1. Erlang:Erlang是一种并发、分布式、热代码升级的语言,特别适合构建高可用性、容错性强的系统。RabbitMQ选择了Erlang作为其开发语言,因为它提供了轻量级进程、内置的分布式能力和强大的故障恢复机制。在安装...
### RabbitMQ 技术帮助文档知识点详解 #### 一、RabbitMQ 概述 RabbitMQ 是一种基于 AMQP(高级消息队列协议)的消息...对于想要实现高性能、高可用性的消息系统的开发人员来说,RabbitMQ 是一个非常不错的选择。
总结来说,RabbitMQ作为消息中间件,通过提供高效、可靠的消息传递服务,帮助企业构建高可用、可扩展的分布式系统。在实践中,我们需要熟练掌握其核心概念、工作流程以及最佳实践,以便在项目中发挥RabbitMQ的最大...
RabbitMQ是由Erlang编程语言开发的,Erlang因其强大的并发能力和容错性,使得RabbitMQ在高可用性和可扩展性方面表现出色。 在RabbitMQ中,消息是应用之间传递的基本单元,可以是简单的文本字符串,也可以包含复杂的...
- **部署策略**:介绍了部署 RabbitMQ 的最佳实践,包括单节点部署、集群部署以及高可用性部署方案。 - **监控与故障排除**:探讨了如何有效地监控 RabbitMQ 的运行状态,并提供了常见的故障排除技巧。 - **性能...
总结来说,RabbitMQ 3.7.14在Linux环境下的应用涵盖了从安装、配置到实际使用的一系列步骤,涉及用户管理、插件、消息模型、队列和交换机以及高可用性设置等多个方面。理解并掌握这些知识点,有助于我们在实际项目中...
总结来说,RabbitMQ 提供了一个强大且灵活的消息中间件平台,通过集群和队列镜像保证服务的高可用性。在实际部署中,需要结合 Haproxy 和 Keepalived 确保客户端接入的稳定性,同时根据业务需求利用其丰富的特性和...
总结,RabbitMQ 3.8.9 是一个强大的消息中间件,提供了可靠的消息传递和高可用性的解决方案。通过下载并安装 "rabbitmq-server-3.8.9.zip",用户可以在 Windows 64 位环境下轻松部署和使用这一优秀工具,为分布式...
同时,RabbitMQ还提供了高可用性解决方案,如镜像队列,可以保证即使在节点故障时也能持续服务。 此外,RabbitMQ社区提供丰富的插件和客户端库,支持多种编程语言,如Java、Python、Ruby、JavaScript等,方便开发者...
这包括了如何处理高并发场景下的消息处理,如何实现消息的持久化存储,以及如何设计高可用的RabbitMQ集群。通过对具体案例的分析,帮助读者掌握RabbitMQ在复杂环境下的应用技巧。 ### 五、标签解析:“MQ Socket” ...
它用于接收、存储和转发消息,提供了高可用性、可扩展性和健壮性,广泛应用于分布式系统中。 3. Docker容器:Docker是容器化技术的代表,通过容器来封装应用及其依赖环境,实现轻量级的隔离和部署。在本例中,...
它由Erlang语言开发而成,并运行在开放电信平台框架之上,能够提供高性能、高可用性及易扩展性等特点。RabbitMQ支持多种消息传递模式,如简单队列、工作队列、发布/订阅、路由模式和主题模式等。 #### 二、RabbitMQ...
- **集群与高可用**:通过集群部署实现服务的高可用性和容错能力。 - **性能调优**:包括队列设置、消息持久化策略等多方面优化措施。 #### 四、实践案例分析 **1. 基础示例** - **发送端代码示例**:创建连接、...
Erlang以其轻量级进程、内置并发支持和热代码替换特性,成为了构建高可用性系统的选择。RabbitMQ正是基于Erlang构建的,利用Erlang的这些优势,提供了稳定、高效的消息传递服务。 **RabbitMQ安装** 安装RabbitMQ...
首先,`RabbitMQ 3.8.7`是RabbitMQ服务器的一个稳定版本,它提供了多种特性,包括强大的消息路由、持久化、高可用性集群和安全的网络隔离。3.8系列着重于性能优化、错误修复和新功能的引入,确保了可靠的消息传递和...
在实际应用中,RabbitMQ可以帮助开发者构建解耦、高可用的系统,提高系统的灵活性和可扩展性。通过理解Erlang的安装与配置,以及RabbitMQ的基本工作原理和使用方法,开发者可以更好地利用这个工具来优化他们的应用...