RabbitMQ 单机及集群部署

一、Linux单机部署

 

二、Linux集群部署

  简介:RabbitMQ集群的元数据(队列、交换机、绑定、vhost四种)信息在所有节点上是一致的,而存放消息的队列的完整数据则只会存在与它所创建的那个节点上,其他节点只知道这个队列和元信息及一个指向队列的节点指针,当客户端连接的是非队列数据所在节点,该节点会通过指针进行路由转发。

   1. 注意事项

    A. RabbitMQ节点cookie文件的值必须是一致的,因为节点通过cookie值来确定相互是否可通信,该路径为/var/lib/rabbitmq/.erlang.cookie或者$HOME/.erlang.cookie;

    B. 集群节点最低需要三个,符合奇数点部署,千万不要搭建两个节点的集群,因为两个节点失联时,集群不可用;

    C. 集群加入可以通过rabbitmq.conf配置文件或者rabbitmqctl命令来实现,还有另外服务发现机制实现;

    D. 通过rabbitmqctl stop_app关闭全部节点,第一个启动节点需要是最后一个关闭的节点,其他节点启动都会等待它启动成功,超时会报错;

    E. 集群中至少保证2到3个磁盘节点,其他可以是内存节点,因为磁盘节点挂了将不能添加元数据信息,内存节点可以提供更高的性能,而磁盘节点提供可靠性;

    F. RabbitMQ节点是指RabbitMQ应用程序和其所在的Erlang节点;

    G. 服务器断电关机后,依然需要重启插件,比如MQTT、Prometheus等;

 

三、Docker单机部署

  1. stack.yml配置文件

复制代码
  # rabbitmq消息
    rabbitmq:
        image: rabbitmq:3.8-management
        ports:
            - 4369:4369
            - 5671:5671
            - 25672:25672
            - 5672:5672
            - 15672:15672
        environment:
            TZ: Asia/Shanghai
            RABBITMQ_DEFAULT_USER: guest
            RABBITMQ_DEFAULT_PASS: guest
复制代码

  2. 执行stack.yml文件:docker stack deploy -c stack.yml rabbitmq;

  3. 访问管理界面:打开http://localhost:15672页面,输入正确的用户名和密码也无法登录时,可尝试Ctrl + F5强制刷新一下,因为可能与cookie有关系。

 

四、Linux Docker集群部署

  1. stack.yml配置文件

# RabbitMQ消息队列集群
    rabbitmq-1:
        image: rabbitmq/rabbitmq:3.8-with-plugins-alpine
        hostname: rabbitmq-1
        deploy:
            mode: global
            placement:
                constraints: 
                    - node.labels.rabbitmq-1 == true
        networks:
            - rws-mp
        volumes:
            - /etc/localtime:/etc/localtime
            - rabbitmq:/etc/rabbitmq
            - rabbitmq-1-data:/var/lib/rabbitmq
        environment:
            RABBITMQ_ERLANG_COOKIE: rhxy-rabbitmq
    rabbitmq-2:
        image: rabbitmq/rabbitmq:3.8-with-plugins-alpine
        hostname: rabbitmq-2
        deploy:
            mode: global
            placement:
                constraints: 
                    - node.labels.rabbitmq-2 == true
        networks:
            - rws-mp
        volumes:
            - /etc/localtime:/etc/localtime
            - rabbitmq:/etc/rabbitmq
            - rabbitmq-2-data:/var/lib/rabbitmq
        environment:
            RABBITMQ_ERLANG_COOKIE: rhxy-rabbitmq
    rabbitmq-3:
        image: rabbitmq/rabbitmq:3.8-with-plugins-alpine
        hostname: rabbitmq-3
        deploy:
            mode: global
            placement:
                constraints: 
                    - node.labels.rabbitmq-3 == true
        networks:
            - rws-mp
        volumes:
            - /etc/localtime:/etc/localtime
            - rabbitmq:/etc/rabbitmq
            - rabbitmq-3-data:/var/lib/rabbitmq
        environment:
            RABBITMQ_ERLANG_COOKIE: rhxy-rabbitmq

  2. 启动集群

    节点一:

      A. 进入rabbitmq容器:docker exec -it myrabbit1 bash

      B. rabbitmqctl stop_app

      C. rabbitmqctl reset

      D. rabbitmqctl start_app 

    节点二:

      A. docker exec -it myrabbit2 bash

      B. rabbitmqctl stop_app

      C. rabbitmqctl reset

      D. rabbitmqctl join_cluster --disc rabbit@rabbit1

      E. rabbitmqctl start_app

 

    节点三:

      A. docker exec -it myrabbit2 bash

      B. rabbitmqctl stop_app

      C. rabbitmqctl reset

      D. rabbitmqctl join_cluster --ram rabbit@rabbit1

      E. rabbitmqctl start_app

  集群脑裂导致网络分区问题可参考官网

 

可参考:RabbitMQ集群官网文档

 

posted @ 2021-06-01 17:00  如幻行云  阅读(311)  评论(0编辑  收藏  举报