搭建RabbitMQ集群可以在一台RabbitMQ宕机时让另一台继续工作,同时可以添加更多节点来扩展消息通信的吞吐量。本期我们就来搭建RabbitMQ集群。
RabbitMQ的集群模式
普通模式
RabbitMQ的普通模式支持交换机、队列结构等同步,但不支持队列中消息体的同步。这也意味着,如果主机宕机,从机中并不会存有消息体的内容。
这种模式下,从机事实上不能在主机宕机时代替主机继续使用。
graph LR subgraph Host exchange1(Exchange) message1(Message) end subgraph Slave1 exchange2(Exchange) message2(Message) end subgraph Slave2 exchange3(Exchange) message3(Message) end exchange1 --> exchange2 exchange1 --> exchange3
镜像模式
镜像模式基于普通模式实现。
镜像模式下,队列中的消息体同样可以同步。其原理是,队列会打包成一个镜像发放给从机。
graph LR subgraph Host exchange1(Exchange) message1(Message) end subgraph Slave1 exchange2(Exchange) message2(Message) end subgraph Slave2 exchange3(Exchange) message3(Message) end exchange1 --> exchange2 exchange1 --> exchange3 message1 --> message2 message1 --> message3
实现普通模式集群
启动容器
笔者使用docker模拟多台RabbitMQ服务器。
下载RabbitMQ镜像:
1 | sudo docker pull rabbitmq:3.8.5-management |
启动3个端口:
1 | sudo docker run -d \ |
启动之后,我们就可以通过localhost:15672、localhost:15673、localhost:15674访问三个RabbitMQ容器了。
配置docker自定义网络
创建网络:
1 | sudo docker network create mq_net |
连接网络:
1 | sudo docker network connect mq_net rabbit01 |
我们可以测试一下容器之间网络是否连通:
1 | sudo docker exec -it rabbit02 /bin/bash # 进入rabbit02容器 |
测试成功。
连接容器
进入rabbit01:
1 | sudo docker exec -it rabbit01 bash |
进入rabbit02:
1 | sudo docker exec -it rabbit02 bash |
进入rabbit03:
1 | sudo docker exec -it rabbit03 bash |
此时查看管理页面,发现配置成功:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jkMSrQet-1595159191014)(https://i.loli.net/2020/07/19/Qb1GLiCZ46UVoBE.png)]
实现镜像模式集群
设置策略
先来了解一下策略命令:
rabbitmqctl list_policies
查看当前所有策略
rabbitmqctl set_policy 策略名 '正则表达式' '{"ha-mode":"模式","ha-sync-mode":"automatic"}'
正则表达式用于匹配队列名,""表示匹配所有,"hello"表示以hello开头
模式有:
- all 所有节点都执行策略
- exactly 随机抽取对应数量的节点执行策略,需要配合ha-params指定参数
- nodes 指定对应的节点执行策略,需要配合ha-params指定参数
"ha-sync-mode":"automatic"表示自动同步
进入rabbit01执行即可,从机无需再执行:
1 | sudo docker exec -it rabbit01 bash |
查看管理页面,注意到策略被添加:
-sync-mode":"automatic"表示自动同步
进入rabbit01执行即可,从机无需再执行:
1 | sudo docker exec -it rabbit01 bash |
查看管理页面,注意到策略被添加:
