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