0%

RabbitMQ集群相关

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)实现队列备份。

  1. 队列元数据:并不同步队列本身以及队列中的消息
  2. 交换机元数据
  3. 绑定元数据
  4. vhost元数据

配置RabbitMQ集群

采用docker镜像的形式,在一台机器上运行三个RabbitMQ,实现模拟集群配置效果。

  1. 首先下载带有管理界面的rabbitmq镜像

  2. 运行起来三个rabbitmq容器(rabbit1rabbit2rabbit3)

    • 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
  3. 进入rabbit2rabbit3依次加入集群

    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.
  4. 进入任意管理页面,可以看到集群配置成功

测试在集群上进行操作:

  1. 生产者在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引入了两种特殊的队列结构

  1. 镜像队列

    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.

  2. quorum 队列(3.8版本引入,替代镜像队列的版本)

  3. 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同步。

下面演示镜像队列的使用

  1. 通过policy设置以mirror开头的队列的镜像规则

  2. 创建mirror_test队列,发现备份成功

  3. 关闭rabbit2后,查看队列状态

​ 4. 连接rabbit1,消费消息

Quorum 队列

官方文档对于Quorum队列特性总结的比较好,不再进行赘述。对应中文版本为:RabbitMQ 3.8 Feature Focus - Quorum Queues