目录
集群分类
普通集群介绍
普通集群部署
镜像集群
集群模式介绍以及特征:
那么,问题来了,主节点是如何将队列备份到其他节点上呢?
仲裁队列
介绍
基于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();
}
}