对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
rabbit元数据
rabbit会保存四种元数据:
1)队列元数据:队列名称、属性、是否是持久化队列等
2)交换器元数据:交换器名称、属性、是否被持久化等
3)绑定元数据:队列与交换器的对应关系
4)vhost元数据:命名空间管理等
单节点下行为
上图是单节点的情况下,交换器和队列信息被保存在内存中,如果是持久化的队列和交换器则被保存在硬盘上,当节点关闭,会丢失未持久化的交换器和队列。
集群下的行为
1)每个节点会保存交换器、队列、绑定等数据
2)消费者可以通过连接任何节点来定位到需要的队列获取数据
3)默认情况下,队列的完整信息(含内容)不会在集群下所有的节点中保存,而是只存在于一个节点中
4)当保存队列完整信息的节点崩溃,消费者不能从集群中获得这个队列的消息,生产者不能推送消息到队列中
5)为了保证集群的高可用,可以在创建队列时声明为镜像队列,即所有节点都保存队列的完整信息,其中有一个主队列,其他都是从队列,当主队列所在的节点崩溃,集群在从队列中选举出一个队列成为主队列