集群分类
RabbitMq是天然支持集群模式。rabbitmq的集群有两种模式:
- 普通模式: 是一种分布式集群,将队列分散到集群各个节点,从而提供整个集群的并发能力。可用性不高。因为一个节点宕机,这个节点上的数据将不可用。
- 镜像集群:是一种主从集群,普通集群的基础上,添加了主从备份功能,提供集群的数据可用性。
镜像集群虽然支持主从,但主从同步并不是强一致性的,某些情况下可能有数据丢失的风险。因此在RabbitMq的3.8版本以后退出了新的功能:仲裁队列来替代镜像集群。底层采用Raft协议确保主从的数据一致性。
普通集群
普通集群,或者叫标准集群(classic cluster),具备下列特征:
- 会在集群各个节点间共享数据部分,包括交换机,队列元信息(队列的名字,队列的地址)。但是不包含队列的信息
- 当访问集群某节点时,如果队列不再该节点,会在数据所在节点传递到当前节点并返回(因为共享队列的元信息)
- 队列所在节点宕机,队列中消息将会丢失。
镜像集群
镜像集群: 本质是主从模式,具备下面的特征:
- 交换机,队列,队列中消息会在各个mq的镜像节点之间同步备份。
- 创建队列的节点被称为队列的主节点,备份到其他节点叫做该队列的镜像节点。
- 一个队列的主节点可能是另一个队列的镜像节点
- 所有操作都是主节点完成,然后同步给镜像节点
- 主节点宕机后,镜像节点会成为主节点
仲裁队列
是用来替换镜像队列的
- 与镜像集群一样,都是主从模式,支持主从数据同步
- 使用简单,没有复杂的配置 (默认值为5,就是 1主 4镜像)
- 主从同步基于Raft 协议,强一致
优势
- 客户端不需要改变它们生产和订阅的方法,无需考虑队列类型。
唯一的区别就是在客户端定义队列的时候需要定义成仲裁队列(代码中添加相关属性) - 被解决当节点重新上线时,不会丢数据(解决了镜像队列同步的问题)
主副本会直接从从副本中断的地方开始复制消息。复制的过程是非阻塞的,所以整个队列不会因为新的副本加入而收到影响。唯一的影响是网络使用率。 - 没有了同步问题,不仅让仲裁队列比镜像队列更可靠,同时,因为写入必须被超过半数的副本接受,所以不会因为脑裂而丢数据。
4.Raft 协议比镜像队列的算法更有效率,可以提供更好的消息吞吐量