对RabbitMQ集群的理解

上一篇文章讲了RabbitMQ中几个核心组件是如何配合工作的,现在来分析一下集群中的行为

Rabbit节点

1)RabbitMQ是使用Erlang语言编写的,当我们执行  ./rabbitmq-server start  后,一个Erlang虚拟机实例启动

2)区别于Java虚拟机一个程序对应一个虚拟机实例,Erlang虚拟机上可以运行多个程序(通常和Rabbit一起启动的有,Mnesia数据库和Rabbit admin插件),为了方便描述,以下将Erlang虚拟机实例称为Rabbit节点。

3)Rabbit节点需要有相同的凭证才能找到对方,这个凭证就是   .erlang.cookie文件

     Windows下的位置:C:\Users\%USERNAME%\.erlang.cookie

     CentOS7下的位置:/root/.erlang.cookie

对RabbitMQ集群的理解

rabbit元数据

rabbit会保存四种元数据:

1)队列元数据:队列名称、属性、是否是持久化队列等

2)交换器元数据:交换器名称、属性、是否被持久化等

3)绑定元数据:队列与交换器的对应关系

4)vhost元数据:命名空间管理等

单节点下行为

对RabbitMQ集群的理解

上图是单节点的情况下,交换器和队列信息被保存在内存中,如果是持久化的队列和交换器则被保存在硬盘上,当节点关闭,会丢失未持久化的交换器和队列。

集群下的行为

对RabbitMQ集群的理解

1)每个节点会保存交换器、队列、绑定等数据

2)消费者可以通过连接任何节点来定位到需要的队列获取数据

3)默认情况下,队列的完整信息(含内容)不会在集群下所有的节点中保存,而是只存在于一个节点中

4)当保存队列完整信息的节点崩溃,消费者不能从集群中获得这个队列的消息,生产者不能推送消息到队列中

5)为了保证集群的高可用,可以在创建队列时声明为镜像队列,即所有节点都保存队列的完整信息,其中有一个主队列,其他都是从队列,当主队列所在的节点崩溃,集群在从队列中选举出一个队列成为主队列