一、集群分类
是一种分布式集群,将队列分散到各个节点上,提高整个集群的并发能力。
是一种主从集群,在普通集群的基础上,添加了主从备份,提高了数据可用性。(镜像集群虽然支持主从,但不是强一致,有可能产生丢失数据的风险。3.8后采用仲裁队列来代替镜像集群,使用Raft协议来保持数据一致性)
1.1 普通集群
集群里面单个节点只有交换机和自己里面声明的队列以及其他节点的队列的元信息,当一个消费者访问当前节点,这个节点不存在该队列,这个节点将会通过队列的元信息找到这个队列所在节点,并返回数据。
1.1.2 从之前启动的mq获取一个公共的cookie
不同的mq节点是通过Erlang cookie进行通信的
docker exec -it mq cat /var/lib/rabbitmq/.erlang.cookie
VZIWBRQFZDOKLTNKVQDE
1.1.2 在/tmp目录新建一个配置文件 rabbitmq.conf
内容如下
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
1.1.3 在/tmp下创建一个文件.erlang.cookie记录cookie,写入cookie
touch .erlang.cookie
echo "VZIWBRQFZDOKLTNKVQDE" > .erlang.cookie
chmod 600 .erlang.cookie #修改文件权限
1.1.4 创建mq三个目录并拷贝
mkdir mq1 mq2 mq3
cp rabbitmq.conf mq1
cp rabbitmq.conf mq2
cp rabbitmq.conf mq3
cp .erlang.cookie mq1
cp .erlang.cookie mq2
cp .erlang.cookie mq3
1.1.4 启动集群
分别是8871、8872、8873。控制台端口分别是8081、8082、8083
#创建网络
docker network create mq-net
#启动docker
#第一台
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=123456 \
--name mq1 \
--hostname mq1 \
-p 8071:5672 \
-p 8081:15672 \
rabbitmq:3.8-management
#第二台
docker run -d --net mq-net \
-v ${PWD}/mq2/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123456 \
--name mq2 \
--hostname mq2 \
-p 8072:5672 \
-p 8082: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=123456 \
--name mq3 \
--hostname mq3 \
-p 8073:5672 \
-p 8083:15672 \
rabbitmq:3.8-management
访问8083
添加队列发现三个节点都有该队列,如果声明队列的节点挂了,队列就不存在了。
1.2 镜像集群
- 本质上是主从模式。交换机、队列以及队列里面的消息会在mq的各个镜像节点中进行同步备份。
- 创建队列的节点为该队列的主节点,备份到的其他节点为该队列的镜像节点。
- 所有操作由主节点完成,然后同步给镜像节点。
1.3 仲裁队列
- 仲裁队列:仲裁队列是3.8版本以后才有的新功能,用来替代镜像队列,具备下列特征:·
- 与镜像队列一样,都是主从模式,支持主从数据同步
给.- 使用非常简单,没有复杂的配置
- 主从同步基于Raft协议,强一致
1.3.1 添加仲裁队列
Type选中Quorum,Node为主节点,其他为镜像节点
1.3.2 代码声明仲裁队列
连接集群