• Docker RabbitMQ 镜像集群


    环境搭建:

    Docker启动3个RabbitMQ,第一个MQ为主节点,同时指定 RABBITMQ_ERLANG_COOKIE

    后面两个镜像为第一个MQ的节点,RABBITMQ_ERLANG_COOKIE` 保持一致,通过 --link 指定关联。

    链式关联。

    docker run -d --hostname mq1 --name mes_queue_1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7.7-management 
    docker run -d --hostname mq2 --name mes_queue_2 -p 5673:5672 --link mes_queue_1:mq1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7.7-management 
    docker run -d --hostname mq3 --name mes_queue_3 -p 5674:5672 --link mes_queue_1:mq1 --link mes_queue_2:mq2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie'  rabbitmq:3.7.7-management 

    成功启动3个MQ服务,端口从 5672 - 5674。

    进入第一个MQ容器:

    docker exec -it 4aee53ed687b /bin/bash

    执行以下命令:

    root@mq1:/# rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@mq1 ...
    root@mq1:/# rabbitmqctl reset
    Resetting node rabbit@mq1 ...
    root@mq1:/# rabbitmqctl start_app
    Starting node rabbit@mq1 ...
     completed with 3 plugins.
    root@mq1:/#

    进入第二个MQ容器:

    PS C:Userschaojie> docker exec -it cc178e06ac2f /bin/bash
    root@mq2:/# rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@mq2 ...
    root@mq2:/# rabbitmqctl reset
    Resetting node rabbit@mq2 ...
    root@mq2:/# rabbitmqctl join_cluster --ram rabbit@mq1
    Clustering node rabbit@mq2 with rabbit@mq1 <---- 加入集群
    root@mq2:/# rabbitmqctl start_app
    Starting node rabbit@mq2 ...
     completed with 3 plugins.
    root@mq2:/#

    进入第三个MQ容器:

    PS C:Userschaojie> docker exec -it 7cc63aeaf35d /bin/bash
    root@mq3:/# rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@mq3 ...
    root@mq3:/# rabbitmqctl reset
    Resetting node rabbit@mq3 ...
    root@mq3:/# rabbitmqctl join_cluster --ram rabbit@mq1
    Clustering node rabbit@mq3 with rabbit@mq1
    root@mq3:/#

    同步消息队列:所以节点数据同步,队列同步。消息消费同步:任意节点执行

    root@mq3:/# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
    Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

    打开MQ管理界面:

    三个MQ已经关联了。

    数据已同步。

    其中第一个节点 info 中的 disc 表示磁盘节点,磁盘节点会将消息持久化到硬盘,另外的节点持久化到内存,当磁盘节点宕机,消息依然可以收发,,但是不能执行创建队列、交换机、绑定关系、用户,以及更改权限、添加或者删除集群节点的操作。

    内存节点宕机没事。

    测试:

    停止主节点。

    docker stop e55a0eff0d36

    其他节点不受影响。

    打开节点,数据已同步。

  • 相关阅读:
    http和https的区别与联系
    HTTP请求/响应报文结构
    Java并发包中Lock的实现原理
    Java多线程基础——Lock类
    深入理解Java并发之synchronized实现原理
    ConcurrentHashMap 的实现原理
    【Java集合学习】HashMap源码之“拉链法”散列冲突的解决
    趣谈Java变量的可见性问题
    Java中CAS详解
    LockSupport的park和unpark的基本使用,以及对线程中断的响应性
  • 原文地址:https://www.cnblogs.com/yangchaojie/p/13654992.html
Copyright © 2020-2023  润新知