MQ集群配置

目录

集群分类

普通集群介绍

普通集群部署  

 镜像集群

 集群模式介绍以及特征:

 那么,问题来了,主节点是如何将队列备份到其他节点上呢?

仲裁队列

介绍 

 基于Java代码实现仲裁队列


(44条消息) 手把手教你搭建 RabbitMQ 集群__江南一点雨的博客-CSDN博客_rabbitmq集群搭建

(44条消息) RabbitMQ(五) | MQ集群搭建、部署、仲裁队列、集群扩容_慌途L的博客-CSDN博客_mq搭建

集群分类

镜像集群很像es集群中的分片集群,每个节点都有其他节点的备份,保证了数据的一致性(CP)

(31条消息) elasticsearch搭建集群_Fairy要carry的博客-CSDN博客

然后我们还学了redis的分片集群:

与之区别呢,redis有点像CurrentHashMap,弄了多个master主节点,相当于分段锁的机制,每个master保存不同的数据以此提高并发度,而每个master之间相互监测心跳,功能类似哨兵机制;

(31条消息) Redis分片集群_Fairy要carry的博客-CSDN博客

MQ集群配置_第1张图片


普通集群介绍

首先理清楚几个概念

1.集群各个节点共享的数据:Exchange交换机,队列Queue的元信息(也就是地址) 

2.当消费者consumer访问某个节点时,会根据队列元信息(类似引用),路由到指定的队列

如果队列宕机了,队列中的消息就会消失,路由就会失败

MQ集群配置_第2张图片

 MQ集群配置_第3张图片

普通集群部署  

MQ集群配置_第4张图片

KCPLSSZPNCUMEWTABDTH

  清理数据卷

docker volume prune

然后再在tmp目录下创建一个RabbitMQ的配置文件,在里面添加配置数据

loopback_users.guest = false #防止不法分子访问
listeners.tcp.default = 5672
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@mq1
cluster_formation.classic_config.nodes.2 = rabbit@mq2
cluster_formation.classic_config.nodes.3 = rabbit@mq3

将cookie写入.erlang.cookie文件

echo "KCPLSSZPNCUMEWTABDTH" > .erlang.cookie

然后查看一下是否存在

cat .erlang.cookie

修改权限,只有root用户有权限

chmod 600 .erlang.cookie 

准备三个目录作为节点,将RabbitMQ.conf拷贝到三个目录作为每个节点的配置文件

cp rabbitmq.conf mq1
cp rabbitmq.conf mq2
cp rabbitmq.conf mq3

并且将.erlang.cookie也考入这三个目录中

cp .erlang.cookie mq1
cp .erlang.cookie mq2
cp .erlang.cookie mq3

验证都是存在的

MQ集群配置_第5张图片

 启动集群

创建一个网络

docker network create mq-net

运行命令

docker run -d --net mq-net \
-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq1 \
--hostname mq1 \
-p 8071:5672 \
-p 8081:15672 \
rabbitmq:3.8-management
docker run -d --net mq-net \
-v ${PWD}/mq3/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq3 \
--hostname mq3 \
-p 8073:5672 \
-p 8083:15672 \
rabbitmq:3.8-management

监听容器

docker logs -f mq1

MQ集群配置_第6张图片

 然后我们进行访问

三个mq节点

MQ集群配置_第7张图片

因为队列是元信息,所以说每个mq节点都能看到 ,并且其他节点也是能够取消息的,但其实其他节点上的这个队列只是一个引用,我们查看它的消息只是从其他节点调取过来的(请求过来的),如果那个节点宕机了,那么这个队列就访问不了了;

 MQ集群配置_第8张图片

 当将mq1队列宕机,其他节点就访问不到队列了

 所以要保证队列可用必须保证声明节点可以使用

 镜像集群

 集群模式介绍以及特征:

0.主从模式,类似于es分片集群

1.每个节点都会保留其他节点上队列的副本——>也就是镜像节点,当主节点挂了,镜像节点就成为那个队列的主节点,从而保证数据一致性(CP)

2.所以说,他又跟es有点不一样,它的主节点不是只有一个的,他是基于队列来的,每个队列都有属于自己的主节点

3.另外所有主节点才会完成各个队列的操作,然后同步给镜像节点

MQ集群配置_第9张图片

 那么,问题来了,主节点是如何将队列备份到其他节点上呢?

MQ集群配置_第10张图片

 exactly模式

rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

MQ集群配置_第11张图片

 产生策略MQ集群配置_第12张图片

 添加一个队列,查看从属关系

 然后我们stop主节点mq1

docker stop mq1

此时mq3由从从节点为主节点

 然后我们再启动mq1节点会发现它已经不是主节点了


仲裁队列

介绍 

MQ集群配置_第13张图片

 不需要根据命令配置队列副本的配置了(集群策略)​​​​​​

 保证了强一致性,在任何时候访问到队列数据,都是一致性的

(33条消息) 强一致性、顺序一致性、弱一致性和共识_chao2016的博客-CSDN博客_强一致性

添加仲裁队列

队列类型设置为Quorum即可

MQ集群配置_第14张图片

 队列中的详细配置信息

MQ集群配置_第15张图片

 基于Java代码实现仲裁队列

因为是集群,所以我们配置文件中连接不能写host

之前的配置

MQ集群配置_第16张图片

 现在的配置

MQ集群配置_第17张图片

package cn.itcast.mq.config;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author diao 2022/6/20
 */
@Configuration
public class QuorumConfig {

    /**
     * 仲裁队列配置
     * @return
     */
    @Bean
    public Queue quorumQueue(){
        return QueueBuilder.durable("quorum.queue2").quorum().build();
    }
}

你可能感兴趣的:(RabbitMQ,java,服务器,rabbitmq)