rabbitmq在高可用HA方面的方案总结

http://blog.csdn.net/yangbutao/article/details/10982391

为了提高消息传递交付的可用性,rabbitMQ有几种集群的方案,不同的方案有不同的优缺点
1、普通的集群
rabbitMQ中的exchange和queue都包含meta、contents、state等信息,exchange在集群中的每个节点都保存一份数据,
但是queue不一样,queue在集群中对于contents只存储一份,其他节点只存储meta信息
为什么只在一个节点存储queue的contents,官方是这么说的:
a、 Storage space—If every cluster node had a full copy of every queue, adding nodes
wouldn’t give you more storage capacity. For example, if one node could store
1 GB of messages, adding two more nodes would just give you two more copies
of the same 1 GB of messages.
b、 Performance—Publishing messages would require replicating those messages to
every cluster node. For durable messages, that would require triggering disk
activity on all nodes for every message. Your network and disk load would
increase every time you added a node, keeping the performance of the cluster
the same (or possibly worse).

对于publish,客户端任意连接集群的一个节点,转发给创建queue的节点存储消息的所有信息;
对于consumer,客户端任意连接集群中的一个节点,如果数据不在该节点中,则从存储该消息data的节点拉取。
可见当存储有queue内容的节点失效后,只要等待该节点恢复后,queue中存在的消息才可以获取消费的到。
显然增加集群的节点,可以提高整个集群的吞吐量,但是在高可用方面要稍微差一些
 
2、mirror queue
mirror queue是为rabbitMQ高可用的一种方案,相对于普通的集群方案来讲,queue中的消息每个节点都会存在一份copy,
这个在单个节点失效的情况下,整个集群仍旧可以提供服务。但是由于数据需要在多个节点复制,在增加可用性的同时,系统的吞吐量会有所下降。
在实现机制上,mirror queue内部实现了一套选举算法,有一个master和多个slave,queue中的消息以master为主,
对于publish,可以选择任意一个节点进行连接,rabbitmq内部若该节点不是master,则转发给master,master向其他slave节点发送该消息,
后进行消息本地化处理,并组播复制消息到其他节点存储,
对于consumer,可以选择任意一个节点进行连接,消费的请求会转发给master,为保证消息的可靠性,consumer需要进行ack确认,
master收到ack后,才会删除消息,ack消息会同步(默认异步)到其他各个节点,进行slave节点删除消息。
若master节点失效,则mirror queue会自动选举出一个节点(slave中消息队列最长者)作为master,作为消息消费的基准参考;
在这种情况下可能存在ack消息未同步到所有节点的情况(默认异步),
若slave节点失效,mirror queue集群中其他节点的状态无需改变。

 

 

以上两种集群的方案对于客户端来讲,都需要考虑节点的失效。
客户端可以容错性的方式连接rabbitMQ集群,比如失效重连下一个节点等。
也可以在客户端和mq之间加一个LoadBalancer,如HAProxy,做负载均衡,失效转发用。
 
3、当然还有其他的方式,比如active/passive和shovel,
  主备方式(active,passive)只有一个节点处于服务状态,可以结合pacemaker和ARBD,
  shovel简单从一个broker的一个队列中消费消息,且转发该消息到另一个broker的交换机。
  这两种方式用的比较少,这里就不做介绍了。
RabbitMQ 是一款高性能、开源的 AMQP 消息队列系统。RabbitMQ 提供了多种高可用方案,下面介绍两种常用的方案: 1. 镜像队列 镜像队列是 RabbitMQ 自带的一种高可用方案。它的原理是将队列中的消息在多个节点之间进行同步复制,保证了队列中的消息即使在某个节点失效的情况下也能够被其他节点接管。在 RabbitMQ 中创建镜像队列非常简单,只需要在创建队列时指定 `x-ha-policy` 参数即可,例如: ``` # 创建名为 "myqueue" 的镜像队列 $ rabbitmqctl declare queue myqueue --type classic --arguments '{"x-ha-policy":"all"}' ``` 上述命令将创建一个名为 "myqueue" 的镜像队列,`--arguments` 参数用于指定队列的参数,其中 `"x-ha-policy":"all"` 表示将队列复制到所有节点上。 2. RabbitMQ 集群 RabbitMQ 集群是一种更为灵活的高可用方案。它的原理是在多个节点上部署 RabbitMQ,通过节点间的数据同步和负载均衡来实现高可用性。在 RabbitMQ 集群中,每个节点都可以处理客户端的请求,并且具有完整的队列和消息数据。当某个节点失效时,其他节点可以接替其工作,保证整个系统的可用性。 要创建 RabbitMQ 集群,可以按照以下步骤进行: 1. 在每个节点上安装 RabbitMQ。 2. 在每个节点上启动 RabbitMQ,并将节点加入集群。可以使用以下命令将节点加入集群: ``` $ rabbitmqctl stop_app $ rabbitmqctl join_cluster rabbit@node1 $ rabbitmqctl start_app ``` 上述命令将停止 RabbitMQ 应用程序,将该节点加入名为 "rabbit" 的集群中,并重新启动应用程序。 3. 配置镜像队列。使用上述提到的镜像队列方案,将队列中的消息在多个节点之间进行同步复制,保证了队列中的消息即使在某个节点失效的情况下也能够被其他节点接管。 4. 配置负载均衡。为了提高集群的性能和可用性,可以在集群前面添加负载均衡器,以便将客户端的请求均匀地分配到各个节点上。 总的来说,RabbitMQ高可用方案主要包括镜像队列和 RabbitMQ 集群两种,根据实际业务需求和系统复杂度进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值