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博客


普通集群介绍

首先理清楚几个概念

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

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

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

 

普通集群部署  

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

验证都是存在的

 启动集群

创建一个网络

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节点

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

 

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

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

 镜像集群

 集群模式介绍以及特征:

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

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

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

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

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

 exactly模式

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

 产生策略

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

 然后我们stop主节点mq1

docker stop mq1

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

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


仲裁队列

介绍 

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

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

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

添加仲裁队列

队列类型设置为Quorum即可

 队列中的详细配置信息

 基于Java代码实现仲裁队列

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

之前的配置

 现在的配置

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();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fairy要carry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值