RabbitMQ集群相关
Clustering is meant to be used across LAN. It is not recommended to run clusters that span WAN.
似乎所有的中间件框架最后都要走到集群配置这一步,RabbitMQ通过集群配置实现数据和服务的可要行,官网推荐在局域网中使用RabbitMQ集群,跨网络间的同步建议通过 Shovel or Federation等插件实现。
RabbitMQ集群主要解决服务器崩溃导致的服务不可用以及数据丢失问题,集群中节点同步备份所有的元数据,由于集群本身并不执行队列的备份,通过特殊类型的队列(镜像和quorum)实现队列备份。
- 队列元数据:并不同步队列本身以及队列中的消息
- 交换机元数据
- 绑定元数据
- vhost元数据
配置RabbitMQ集群
采用docker镜像的形式,在一台机器上运行三个RabbitMQ,实现模拟集群配置效果。
首先下载带有管理界面的rabbitmq镜像
运行起来三个rabbitmq容器(
rabbit1
、rabbit2
、rabbit3
)RABBITMQ_ERLANG_COOKIE='cluster_cookie'
:设置相同的erlang cookie--link 容器名
:解决同一台主机上不同容器通信问题
1
docker run -d --hostname rabbit3 --name instance3 -p 15674:15672 -p 5674:5672 --link instance1 --link instance2 -e RABBITMQ_ERLANG_COOKIE='cluster_cookie' rabbitmq:management
进入
rabbit2
、rabbit3
依次加入集群1
2
3
4
5
6
7
8
9
10
11进入容器内部
docker exec -it instance2 /bin/bash
on rabbit2
rabbitmqctl stop_app
=> Stopping node rabbit@rabbit2 ...done.
rabbitmqctl reset
=> Resetting node rabbit@rabbit2 ...
rabbitmqctl join_cluster rabbit@rabbit1
=> Clustering node rabbit@rabbit2 with [rabbit@rabbit1] ...done.
rabbitmqctl start_app
=> Starting node rabbit@rabbit2 ...done.进入任意管理页面,可以看到集群配置成功
测试在集群上进行操作:
生产者在
rabbit2
上创建队列,消费者在rabbit1
上消费对应队列接收者同样能够收到消息
符合官方文档中的对于队列消息同步的描述,即消息在所有节点上均可达
An exception to this are message queues, which by default reside on one node, though they are visible and reachable from all nodes.
队列备份
从上述集群操作中,可以看出虽然引入了集群,队列还是单机存储,其他节点也需要从当前队列节点上获取消息返回给消费者,因此RabbitMQ引入了两种特殊的队列结构
镜像队列
Important: mirroring of classic queues will be removed in a future version of RabbitMQ. Consider using quorum queues or a non-replicated classic queue instead.
quorum 队列(3.8版本引入,替代镜像队列的版本)
RabbitMQ自3.9.0版本开始引入的Stream队列类型(未深入了解):消息以append-only的方式持久化到日志文件中,然后通过调整每个消费者的消费进度offset,来实现消息的多次分发
镜像队列
镜像队列类似于Mysql的主从同步,由一个leader replica(主副本)和多个mirrors(从副本)组成,对于发布消息,传递消息到消费者以及跟踪消息ACK等队列操作,由leader replica首先应用后,再将操作同步到mirrors。
只能提供队列备份功能,只能提升数据的可靠性,无法实现性能的横向扩展。
Consumers are connected to the leader regardless of which node they connect to, with mirrors dropping messages that have been acknowledged at the leader.
当leader replica失效时,同步时间最长的mirrors会成为新的leader replica,无论其是否已经与leader replica同步。
下面演示镜像队列的使用
通过
policy
设置以mirror
开头的队列的镜像规则创建
mirror_test
队列,发现备份成功关闭rabbit2后,查看队列状态
4. 连接rabbit1,消费消息
Quorum 队列
官方文档对于Quorum队列特性总结的比较好,不再进行赘述。对应中文版本为:RabbitMQ 3.8 Feature Focus - Quorum Queues