RabbitMQ镜像集群

325 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

前言

RabbitMQ镜像集群是在RabbitMQ的普通集群上进行修改而来,因此搭建RabbitMQ的镜像集群,首先需要搭建RabbitMQ的普通集群。

案例是在同一台Centos7中通过Docker搭建的RabbitMQ集群,企业生产环境根据多个服务器进项安装即可。

前提在Centos7中已经装好了docker环境。如果还不知道如何安装docker,可参考Centos7安装系统安装docker

准备

  • 先创建文件夹做准备
mkdir /mydata/rabbitmq
cd /mydata/rabbitmq/
mkdir rabbitmq01 rabbitmq02 rabbitmq03

启动容器

  • 利用docker命令创建3个rabbitmq实例并启动
docker run -d --hostname rabbitmq01 --name rabbitmq01 -v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='xinxing' rabbitmq:management
docker run -d --hostname rabbitmq02 --name rabbitmq02 -v /mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq -p 15674:15672 -p 5674:5672 -e RABBITMQ_ERLANG_COOKIE='xinxing' --link rabbitmq01:rabbitmq01 rabbitmq:management
docker run -d --hostname rabbitmq03 --name rabbitmq03 -v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq -p 15675:15672 -p 5675:5672 -e RABBITMQ_ERLANG_COOKIE='xinxing' --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 rabbitmq:management

说明:

RABBITMQ_ERLANG_COOKIE节点认证作用,部署集成时,需要同步该值,自己根据实际业务任意定一个值,保证所有节点相同即可。

image.png 彼此都一样,都只有自己,没有其他两个,箭头表示已经创建了集群,rabbitmq01是master。

节点加入集群(单机普通集群)

docker exec -it rabbitmq01 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
docker exec -it rabbitmq02 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit
docker exec -it rabbitmq03 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

这时普通集群已经搭建完成,普通模式集群:它们之间只能同步一些元数据,但是Queue中的消息不能同步,如果主节点宕机,就会导致数据丢失,很不友好。

接下来在普通集群上进项修改,演变成镜像集群。

镜像集群模式

docker exec -it rabbitmq01 /bin/bash
rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
rabbitmqctl list_policies -p /
exit

说明: 第二条命令中 /表示虚拟主机,^表示所有队列,策略就是所有队列都是高可用的,它们是自动同步数据(元数据+Queue中的Message)。 第三条命令是查看镜像集群的策略。


镜像集群有自己的一套选举策略,生产者和消费者的请求都会先转到主节点,如果主节点宕机,就会从从节点中重新选举出一个新的主节点。可以理解从节点就是主节点的一个备份。

普通集群与镜像集群的区别:

普通集群只会同步元数据信息,不会同步队列的message信息。而镜像集群会。

image.png 每个节点都包含了集群中的所有节点信息了。

image.png

每个节点都有配置的策略。

Spring Boot整合RabbitMQ

  • springboot连接镜像集群
  • 引入依赖(和单机一样引入amqp组件)
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency> 
  • 添加配置文件(配置的地址信息有所不同)
# rabbitmq镜像队列地址 第一中集群写法是多台服务器且使用的默认端口 第二种集群写法是一台主机,不是默认端口
#spring.rabbitmq.addresses=192.168.2.121,192.168.2.122,192.168.2.123
#spring.rabbitmq.addresses=192.168.56.108:5673,192.168.56.108:5674,192.168.56.108:5675
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
# 默认虚拟主机
spring.rabbitmq.virtual-host=/
# 连接超时
spring.rabbitmq.connection-timeout=15000
# 是否使用启用消息确认模式(可靠性投递)
# 新版本已被弃用,使用publisher-confirm-type=correlated替换
#spring.rabbitmq.publisher-confirms=true
# 选择确认类型为交互
spring.rabbitmq.publisher-confirm-type=correlated
# 设置reture消息模式,注意要和mandatory一起配合使用
spring.rabbitmq.publisher-returns=true
spring.rabbitmq.template.mandatory=true
# 消息监听器(消费端)手动ack模式
spring.rabbitmq.listener.simple.acknowledge-mode=manual