RabbitMQ集群模式有两种:普通集群模式和镜像集群模式。

普通模式

RabbitMQ in Kubernetes - (2) RabbitMQ的高可用 - 图1

下图表示在集群配置下的不同节点创建队列的情况

RabbitMQ in Kubernetes - (2) RabbitMQ的高可用 - 图2

下图表示在集群配置下的不同节点创建交换器和队列的绑定的情况

RabbitMQ in Kubernetes - (2) RabbitMQ的高可用 - 图3

缺点

这种方式的缺点很明显,没有做到所谓的分布式、只是一个普通的集群。这种方式在消费数据时要么随机选择一个实例拉去数据、要么固定连接那个queue所在的实例来拉取数据,前者导致一次实例见拉取数据的开销、而后在会导致单实例性能的瓶颈。
而且如果存放数据的queue的实例宕机了、会导致其它实例无法从该实例来拉取数据了,如果你开启了RabbitMQ的持久化功能,消息不一定会丢失,但是得等待这个实例重启后才能继续从该queue拉取数据。

镜像模式


RabbitMQ in Kubernetes - (2) RabbitMQ的高可用 - 图4
RabbitMQ in Kubernetes - (2) RabbitMQ的高可用 - 图5

缺点

1、性能开销太大,消息同步到所有的节点服务器会导致网络带宽压力和消耗很严重。
2、这种模式没有扩展性可言,如果你某个queue的负载很高,你加机器,新增的机器也包含了这个queue的所有数据,并没有办法线性扩展你的queue.

使用

新增策略

UI管理界面的 Admin >> Policies 里新增一个策略,并且在定义配置里设置ha-mode=all
image.png
参数意义:

  • ha-all:为策略名称。
  • ^:为匹配符,只有一个 ^ 代表匹配所有,^ha 为匹配名称为 ha 的 exchanges 或者 queue。
  • ha-mode: 为匹配类型。all 代表所有。
  • ha-sync-mode: 为数据同步模式。 automatic 代表自动同步数据。

image.png
重启node1服务
节点1关闭
image.png
节点1已启动,但不可用。
image.png
节点1可用
image.png
再次查看队列,可以发现,主节点变成的了node2,镜像节点变成了node0和node1。
image.png

参考