rabbitmq 集群docker玩法

发布时间 2024-01-05 10:11:53作者: 荣锋亮

属于一个简单测试玩的,rabbitmq 实际最近几年变化还是挺大的(主要是一些新特性,核心amqp 是一致的)

环境准备

测试一个基于raft 选举的rabbitmq 集群队列

  • docker-compose
version: "3"
services:
  mq:
     build: ./
     container_name: rabbitmq
     environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin
      - RABBITMQ_NODENAME=rabbitmq
     hostname: rabbitmq
     ports:
       - "5672:5672"
       - "15672:15672"
       - "25672:25672"
       - "14369:4369"
       - "5671:5671"
     depends_on:
        - mqv2
  mqv2:
     build: ./
     container_name: rabbitmqv2
     hostname: rabbitmqv2
     environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin
      - RABBITMQ_NODENAME=rabbitmqv2
     ports:
       - "5673:5672"
       - "15673:15672"
       - "25673:25672"
       - "14370:4369"
       - "5674:5671"
  mqv3:
     build: ./
     container_name: rabbitmqv3
     hostname: rabbitmqv3
     environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin
      - RABBITMQ_NODENAME=rabbitmqv3
     ports:
       - "5675:5672"
       - "15674:15672"
       - "25674:25672"
       - "14371:4369"
       - "5675:5671"
  • 集群玩法
    具体的加入集群操作与以前的玩法是一样的,核心还是erlang 那套玩法(cookie 一致,基于erlang 的cluster 方式加入集群)
    参考操作
 
// add  rabbitmqv2 node 在rabbitmqv2 操作
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbitmq@rabbitmq
rabbitmqctl start_app
// view cluster info in  rabbitmq or rabbitmqv2
rabbitmqctl cluster_status
// add rabbitmqv3 node 在rabbitmqv3 操作
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbitmqv2@rabbitmqv2
rabbitmqctl start_app
// view cluster info  in  rabbitmq or rabbitmqv2  or rabbitmqv3
rabbitmqctl cluster_status
// change cluster name
rabbitmqctl set_cluster_name  mymq_cluster

效果

测试quorum queues

主要基于web 页面操作,比较简单
效果,会看到默认就是持久化的,同时包很了leader 以及follower


通过cli 查看

 
rabbitmq-queues  quorum_status mydemo

代码调用

这个很简单,会发现我们重启任何节点对于业务的影响比较小(为了测试使用了独立节点的ip)

var q = 'mydemo';
var open = require('amqplib').connect('amqp://admin:admin@127.0.0.1:5672/'); // 实际可以用lb 地址
open.then(function(conn) {
  return conn.createChannel();
}).then(function(ch) {
    return ch.consume(q, function(msg) {
      if (msg !== null) {
        console.log(msg.content.toString());
        ch.ack(msg);
      }
  });
}).catch(console.warn);

说明

quorum-queues 是官方目前推荐的玩法,以前为了高可用的镜像队列玩法,会逐步被淘汰的,当然因为quorum-queues 默认就是持久化的
依赖磁盘的写入操作性能是会有一些影响的,官方提供了一个性能优化指导,目前官方也提供了一种stream 的模式队列,以上是一个简单的
测试,实际使用还有不少需要优化的,但是quorum-queues 队列的确方便了不少,维护以及管理上很方便了

参考资料

https://rabbitmq-website.pages.dev/docs/clustering
https://rabbitmq-website.pages.dev/docs/quorum-queues
https://rabbitmq-website.pages.dev/docs/quorum-queues#performance-tuning