RabbitMQ配置镜像队列,实现各节点队列同步
SHTL 博客:https://www.shtlls.ltd
镜像集群模式
概念:
把队列做成镜像队列,让各队列存在于多个节点中,属于 RabbitMQ 的高可用性方案。镜像模式和普通模式的不同在于,queue和 message 会在集群各节点之间同步,而不是在 consumer 获取数据时临时拉取。
特点:
(1)实现了高可用性。部分节点挂掉后,不会影响 rabbitmq 的使用。
(2)降低了系统性能。镜像队列数量过多,大量的消息同步也会加大网络带宽开销。
(3)适合对可用性要求较高的业务场景。
RabbitMQ普通集群部署
首先按照普通集群部署,然后通过设置,使之成为 镜像集群模式。
-
拉取镜像
docker pull rabbitmq:management
-
运行容器
docker run -d --hostname rabbit_host1 --name rabbitmq1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:latest docker run -d --hostname rabbit_host2 --name rabbitmq2 -p 5673:5672 --link rabbitmq1:rabbit_host1 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:latest docker run -d --hostname rabbit_host3 --name rabbitmq3 -p 5674:5672 --link rabbitmq1:rabbit_host1 --link rabbitmq2:rabbit_host2 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:latest
主要参数说明:
-p 15672:15672 management 界面管理访问端口 -p 5672:5672 amqp 访问端口 --link 容器之间连接 Erlang Cookie 值必须相同,也就是一个集群内 RABBITMQ_ERLANG_COOKIE 参数的值必须相同。因为 RabbitMQ 是用Erlang实现的,Erlang Cookie 相当于不同节点之间通讯的密钥,Erlang节点通过交换 Erlang Cookie 获得认证。
-
加入节点到集群
设置节点一 主节点
docker exec -it {CONTAINER ID} bash rabbitmq-plugins enable rabbitmq_management // 安装可视化组件,否则,无法通过浏览器访问 rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app exit
设置节点二,加入到集群
docker exec -it {CONTAINER ID} bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@rabbit_host1 rabbitmqctl start_app exit
设置节点三,加入到集群
docker exec -it {CONTAINER ID} bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@rabbit_host1 rabbitmqctl start_app exit
主要参数说明:
--ram 表示设置为内存节点,忽略此参数默认为磁盘节点。该配置启动了3个节点,1个磁盘节点和2个内存节点。 设置好之后,使用 http://ip:15672 进行访问,默认账号密码:guest/guest
注意
docker exec -it {CONTAINER ID} bash cd /etc/rabbitmq/conf.d/ echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf exit docker restart {CONTAINER ID}
每一个节点都需要做的修改,否则,绿色的部分都不会显示,都会变黄
由上图可见:共有三个节点, rabbit@rabbit_host1: 磁盘节点(disc) rabbit@rabbit_host2: 内存节点(RAM) rabbit@rabbit_host3: 内存节点(RAM)
RabbitMQ镜像集群部署
- 策略policy概念
使用RabbitMQ镜像功能,需要基于RabbitMQ策略来实现,策略policy是用来控制和修改群集范围的某个vhost队列行为和Exchange行为。策略policy就是要设置哪些Exchange或者queue的数据需要复制、同步,以及如何复制同步。
为了使队列成为镜像队列,需要创建一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不同的值,下表说明这些key的选项。
-
添加策略
登录rabbitmq管理页面 ——> Admin ——> Policies ——> Add / update a policy
name:随便取,策略名称
Pattern:^ 匹配符,只有一个^代表匹配所有
Definition:ha-mode=all 为匹配类型,分为3种模式:all(表示所有的queue)
或者使用命令:
\#rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
-
查看效果
此策略会同步所在同一VHost中的交换器和队列数据。设置好policy之后,使用 http://ip:15672 再次进行访问,可以看到队列镜像同步。
SpringBoot配置RabbitMQ集群
- 配置RabbitMQ单机
spring:
rabbitmq:
host: localhost
port: 5672
username: username
password: password
或者使用addresses
spring:
rabbitmq:
addresses:ip1:port1
username: username
password: password
-
配置RabbitMQ集群
addresses节点用逗号分隔
spring:
rabbitmq:
addresses:ip1:port1,ip2:port2,ip3:port3
username: username
password: password
-
配置RabbitMQ集群
addresses节点用逗号分隔
spring:
rabbitmq:
addresses:ip1:port1,ip2:port2,ip3:port3
username: username
password: password