集群
1.RabbitMQ节点类型
1.1:磁盘节点
- 磁盘节点将元数据(队列名字属性,交换机的类型名字属性,绑定关系,vhost)放在磁盘中
- 磁盘节点一般用来备份数据
- 集群中至少需要一个磁盘节点用来持久化元数据,否则全部内存节点崩溃就无从同步元数据了
- 节点加入到集群中默认是磁盘节点(可以在加入集群的时候指定为内存节点)
1.2:内存节点
- 内存节点将元数据放在磁盘中
- 内存节点会将磁盘节点的地址存放在磁盘(不然重启后就没有办法同步数据了)。如果是持久化的消息,会同时存放在内存和磁盘
- 一般把应用连接到内存节点因为读写快
2.集群模式
2.1:普通集群
1.架构图
2.普通集群介绍
- 在普通集群模式中各个节点之间只会互相同步元数据
- 如果有客户端连接到了节点3想要通过节点3的交换机A找到队列1的内容的话,那么最终还是会请求到节点1上,在这个过程中节点3起到了路由的作用。
- 在普通集群模式中由于不会同步队列中的数据,如果保存队列数据的节点挂了会导致数据丢失,所以我们需要镜像队列模式(基于普通集群模式)。
3.普通集群的搭建方式
搭建步骤简介
- 安装三台RabbitMQ并保证彼此之间可以通信
- 保证.erlang.cookie文件的内容一样
- 使用命令构建集群
Docker搭建
- 使用docker-compose部署三个RabbitMQ
version: '3'
services:
rabbitmq1:
image: rabbitmq:3.7.17-management
container_name: rabbitmq1
hostname: rabbitmq1
ports:
- 15672:15672
- 5672:5672
volumes:
- ./rabbitmq1/data1:/var/lib/rabbitmq
- ./rabbitmq1/data2:/etc/rabbitmq
- ./rabbitmq1/data3:/opt/rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=root
- RABBITMQ_DEFAULT_PASS=123456
- RABBITMQ_ERLANG_COOKIE=SHANGUOYU
- RABBITMQ_NODENAME=rabbitmq1
rabbitmq2:
image: rabbitmq:3.7.17-management
container_name: rabbitmq2
hostname: rabbitmq2
ports:
- 15673:15672
- 5673:5672
volumes:
- ./rabbitmq2/data1:/var/lib/rabbitmq
- ./rabbitmq2/data2:/etc/rabbitmq
- ./rabbitmq2/data3:/opt/rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=root
- RABBITMQ_DEFAULT_PASS=123456
- RABBITMQ_ERLANG_COOKIE=SHANGUOYU
- RABBITMQ_NODENAME=rabbitmq2
rabbitmq3:
image: rabbitmq:3.7.17-management
container_name: rabbitmq3
hostname: rabbitmq3
ports:
- 15674:15672
- 5674:5672
volumes:
- ./rabbitmq3/data1:/var/lib/rabbitmq
- ./rabbitmq3/data2:/etc/rabbitmq
- ./rabbitmq3/data3:/opt/rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=root
- RABBITMQ_DEFAULT_PASS=123456
- RABBITMQ_ERLANG_COOKIE=SHANGUOYU
- RABBITMQ_NODENAME=rabbitmq3
- 进入到rabbitmq2和rabbitmq3的容器中都执行以下命令
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbitmq1@rabbitmq1
rabbitmqctl start_app
- 这样就构成了普通集群,rabbitmq1是磁盘节点,rabbitme2和rabbitmq3是内存节点。
2.2:镜像队列模式
1.架构图
2.镜像队列模式介绍
- 镜像队列模式下,消息内容会在镜像节点间同步,可用性更高。
- 也有一定的副作用,系统性能会降低,节点过多的情况下同步的代价比较大,所以一般是3个节点
- 基于普通集群模式
3.搭建方式
# 进入到普通集群中的任意一个节点执行此命令即可
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'