docker搭建RabbitMQ集群

目录

简介

普通集群模式

镜像集群模式

普通集群模操作

拉取镜像

启动三个容器

进入不同的容器进行配置连接

镜像集群模式介绍和操作(官网推荐)

简介        

策略policy概念

A方案操作

B方案操作

项目代码从单机配置转集群配置


简介

        单机模式,普通集群模式,镜像集群模式。单机模式即单独运行一个 rabbitmq 实例,而集群模式需要创建多个 rabbitmq实例。

普通集群模式

        rabbitmq集群与其他集群有些不同,rabbitmq集群同步指的是复制队列,元数据信息的同步,即同步的是数据存储信息;消息的存放只会存储在创建该消息队列的那个节点上。并非在节点上都存储一个完整的数据。在通过非数据所在节点获取数据时,通过元数据信息,路由转发到存储数据节点上,从而得到数据 。

镜像集群模式

        与普通集群模式区别 主要是消息实体会主动在镜像节点间同步数据,而不是只存储数据元信息。 故普通集群模式 但凡数据节点挂了,容易造成数据丢失但镜像集群模式可以保证集群只要不全部挂掉,数据就不会丢失,当相对于性能来说,镜像集群模式会比普通集群模式多出消耗数据的传输。故取决于业务场景进行取舍。

普通集群模操作

拉取镜像

        根据项目要求看是否需要特定版本,则在最后加上版本号。

docker pull rabbitmq

启动三个容器

        此处我是为了避免单机启动的mq,所以端口号都是从5673和15673开始后延。

docker run -d --hostname rabbitmq03 --name rabbitmqCluster03 -p 15673:15672 -p 5673:5672 -p 1883:1883 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' rabbitmq
docker run -d --hostname rabbitmq04 --name rabbitmqCluster04 -p 15674:15672 -p 5674:5672 -p 1884:1883 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' --link rabbitmqCluster03:rabbitmq03 rabbitmq
docker run -d --hostname rabbitmq05 --name rabbitmqCluster05 -p 15675:15672 -p 5675:5672 -p 1885:1883 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' --link rabbitmqCluster03:rabbitmq03 --link rabbitmqCluster04:rabbitmq04  rabbitmq

        注意:–link 容器之间连接

        Erlang Cookie 值必须相同,也就是一个集群内 RABBITMQ_ERLANG_COOKIE 参数的值必须相同。因为 RabbitMQ 是用Erlang实现的,Erlang Cookie 相当于不同节点之间通讯的密钥,Erlang节点通过交换 Erlang Cookie 获得认证。

进入不同的容器进行配置连接

        命令剖析:

        rabbitmqctl join_cluster --ram rabbit@rabbitmq03

        进入第一个容器——03号容器(从命令看上去能省略这一步,但是我已经配置了,也就不回去折腾了)

docker exec -it rabbitmqCluster03 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit

        进入第二个容器——04号容器

docker exec -it rabbitmqCluster04 bash
rabbitmqctl stop_app
rabbitmqctl reset
#关键命令——加入集群
rabbitmqctl join_cluster --ram rabbitmqCluster03@rabbitmq03
rabbitmqctl start_app
exit

        进入第三个容器——05号容器

docker exec -it rabbitmqCluster05 bash
rabbitmqctl stop_app
rabbitmqctl reset
#关键命令——加入集群
rabbitmqctl join_cluster --ram rabbitmqCluster03@rabbitmq03
rabbitmqctl start_app
exit

        配置好一切容器后,就都重启他们吧~然后进入后台查看集群情况(进入任意一个后台)总览界面的Nodes如果出现3个节点,那么,恭喜你,集群搭建成功了!docker搭建RabbitMQ集群_第1张图片

镜像集群模式介绍和操作(官网推荐)

简介        

        镜像集群模式是基于普通集群模式上配置策略来实现。

策略policy概念

        使用RabbitMQ镜像功能,需要基于RabbitMQ策略来实现,策略policy是用来控制和修改群集范围的某个vhost队列行为和Exchange行为。策略policy就是要设置哪些Exchange或者queue的数据需要复制、同步,以及如何复制同步。 为了使队列成为镜像队列,需要创建一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不同的值,下表说明这些key的选项。

A方案操作

docker搭建RabbitMQ集群_第2张图片

 

B方案操作

        使用如下命令:在cluster中任意节点启用策略,策略会自动同步到集群节点

        #进入容器        

docker exec -it rabbitmqCluster01 bash

        #创建策略

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

rabbitmqctl set_policy-p/ha-all"^"'{"ha-mode":"all"}'

rabbitmqctl set_policy-p/ha-all"^message"'{"ha-mode":"all"}'

        “^message” 这个规则要根据自己修改,这个是指同步“message”开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为“^”

docker搭建RabbitMQ集群_第3张图片

注意:ttl队列创建依赖插件,集群情况下,只需要主节点开启ttl队列创建即可,其余2个节点在设置过程中会超时报错timeout_waiting_for_tables,但是主节点down掉后,仍然可以用剩下的节点进行ttl队列声明。 

docker搭建RabbitMQ集群_第4张图片

docker搭建RabbitMQ集群_第5张图片

项目代码从单机配置转集群配置

        单机配置 appliaction.yml

spring:
  rabbitmq:
    host: 127.0.0.1   #单机配置
    port: 5672    #单机配置
    username: guest
    password: guest
    virtual-host: /

        集群配置 application.yml

spring:
  rabbitmq:
    addresses: 127.0.0.1:5673,127.0.0.1:5674,127.0.0.1:5675 #集群配置
    username: guest
    password: guest
    virtual-host: /

         注意:如果代码中有使用到次配置,则需要手动再修改

        单机配置RabbitAdminConfig.java

import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitAdminConfig {

    /**===单机配置开始===**/
    @Value("${spring.rabbitmq.host}")
    private String host;
    @Value("${spring.rabbitmq.port}")
    private int port;
    /**===单机配置结束===**/
    @Value("${spring.rabbitmq.username}")
    private String username;
    @Value("${spring.rabbitmq.password}")
    private String password;
    @Value("${spring.rabbitmq.virtual-host}")
    private String virtualhost;
    @Bean
    public ConnectionFactory connectionFactory(){
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setAddresses(host); // 单机配置
        connectionFactory.setPort(port); // 单机配置

        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        connectionFactory.setVirtualHost(virtualhost);
        connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED); //
        connectionFactory.setPublisherReturns(true);

        return connectionFactory;
    }
    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){
        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
        rabbitAdmin.setAutoStartup(true);
        return rabbitAdmin;
    }
}

         集群配置RabbitAdminConfig.java

import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitAdminConfig {

    /**===单机配置开始===**/
    @Value("${spring.rabbitmq.host}")
    private String host;
    @Value("${spring.rabbitmq.port}")
    private int port;
    /**===单机配置结束===**/
    @Value("${spring.rabbitmq.username}")
    private String username;
    @Value("${spring.rabbitmq.password}")
    private String password;
    @Value("${spring.rabbitmq.virtual-host}")
    private String virtualhost;

    /**===集群配置开始===**/
    @Value("${spring.rabbitmq.addresses}")
    private String addresses;
    /**===集群配置结束===**/
    @Bean
    public ConnectionFactory connectionFactory(){
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
//        connectionFactory.setAddresses(host); // 单机配置
//        connectionFactory.setPort(port); // 单机配置
        connectionFactory.setAddresses(addresses); // 集群配置
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        connectionFactory.setVirtualHost(virtualhost);
        connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED); //
        connectionFactory.setPublisherReturns(true);

        return connectionFactory;
    }
    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){
        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
        rabbitAdmin.setAutoStartup(true);
        return rabbitAdmin;
    }
}

以上的做完就可以试试启动啦~看下原本单机配置改成集群配置后的消息是否能发送和正常消费。(仅作基础配置,无手动确认消息、消息发送确认、预取机制等配置,自行按需加上)

你可能感兴趣的:(RabbitMQ,java-rabbitmq,rabbitmq,docker)