RabbitMQ 集群

217 阅读2分钟

RabbitMQ本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的erlang.cookie来实现)因此,RabbitMQ天然支持集群。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力的目的。

RabbitMQ 节点的不完全拷贝特性

RabbitMQ 的集群是由多个节点组成的,每个节点并不是其他节点的拷贝!!! 这样设计有两个原因

  • 存储空间:如果每个节点都拥有所有队列的完全拷贝,这样新增节点不但没有新增存储空间,反而增加了更多的冗余数据
  • 性能:如果消息的发布需安全拷贝到每一个集群节点,那么新增节点对网络和磁盘负载都会有增加,这样违背了建立集群的初衷,新增节点并没有提升处理消息的能力,最多是保持和单节点相同的性能甚至是更糟

因此 RabbitMQ 换了一种方法,节点之间仅拷贝元数据

元数据

元数据指的是 Rabbitmq 中各组件的基础信息

非集群环境下,元数据主要分为

  • Queue 元数据:queue 名字和属性等
  • Exchange 元数据:exchange 名字、类型和属性等
  • Binding 元数据:存放路由关系的查找表
  • Vhost 元数据:vhost 范围内针对前三者的名字空间约束和安全属性设置

在集群环境下,还包括集群中 node 位置信息和 node 关系信息。

元数据按照 erlangnode 的类型确定是仅保存于 RAM 中,还是同时保存在 RAM 和 disk 上。

集群中各节点的关系和内容

RabbitMQ 中各节点之间是相互平等的,每个节点只存储其他节点的元数据

如图,节点2、节点3 都有节点1的元数据。当然节点1也有节点2、节点3的元数据,上图中没有画上去。

RAM node 和 disk node

未完待续