RabbitMQ 高可用机制

普通集群

普通集群,或者叫标准集群( classic cluster ),具备下列特征:
  • 会在集群的各个节点间共享部分数据,包括:交换机、队列元信息。不包含队列中的消息。
  • 当访问集群某节点时,如果队列不在该节点,会从数据所在节点传递到当前节点并返回。

这种方式并没有做到所谓消息的高可用,就是个普通的集群,这样还会导致要么消费者每次随机连接一个实例然后拉取数据,这样的话在实例之间会产生网络传输,增加系统开销,要么固定连接那个queue所在的实例消费,这样会导致单实例的性能瓶颈。而且如果那个方 queue 的实例宕机了,会导致接下来其他实例都无法拉取数据;如果没有开启消息的持久化会丢失消息;就算开启了消息的持久化,消息不一定会丢,但是也要等这个实例恢复了,才可以继续拉取数据。所以这个并没有提供高可用,这种方案只是提高了吞吐量 ,也就是让集群中多个节点来服务某个queue 的读写操作。

镜像集群

镜像集群:本质是 主从模式 ,具备下面的特征:
  • 交换机、队列、队列中的消息会在各个mq的镜像节点之间同步备份。
  • 创建队列的节点被称为该队列的主节点,备份到的其它节点叫做该队列的镜像节点
  • 一个队列的主节点可能是另一个队列的镜像节点
  • 所有操作都是主节点完成,然后同步给镜像节点
  • 主节点宕机后,镜像节点会替代成新的主节点

 

这种模式,才是 rabbitmq 提供是真正的高可用模式,跟普通集群不一样的是,你创建的 queue ,无论元数据还是queue 里面是消息数据都存在多个实例当中,然后每次写消息到 queue 的时候,都会自动把消息到多个queue 里进行消息同步。
缺点:
1. 性能消耗太大,所有机器都要进行消息的同步,导致网络压力和消耗很大。
2. 没有扩展性可言,如果有一个 queue 负载很重,就算加了机器,新增的机器还是包含了个queue的所有数据,并没有办法扩展 queue

仲裁队列集群 

仲裁队列:仲裁队列是 3.8 版本以后才有的新功能,用来替代镜像队列,具备下列特征:
  • 与镜像队列一样,都是主从模式,支持主从数据同步
  • 主从同步基于Raft协议,强一致
为了实现数据同步和决策的一致性,仲裁队列的每个副本都有一个仲裁节点( quorumnode)。仲裁节点是一个由 RabbitMQ 内部管理的专门节点,它负责副本间的数据同步和 leader的选举过程。仲裁节点具有更高的决策权,比如在 leader 不可用时,它可以帮助集群协商选举新的 leader 。仲裁队列使用 Raft 一致性算法来实现副本之间的数据同步。 Raft 算法确保了数据的一致性和持久性。当客户端发送消息时,leader 将消息写入自己的副本,并异步推送给 follower 。follower 在确认接收到数据后,将会通知 leader 。在 leader 更新了指定数量的 followers 后,消息被认为是已提交,客户端才接收到确认。
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值