RabbitMQ集群相关配置

本文详细介绍了如何配置RabbitMQ镜像队列实现集群的高可用性。从创建镜像集群、设置节点、添加策略等方面展开,强调了镜像队列在保证服务不间断的同时可能带来的性能影响。此外,还讲解了SpringBoot应用中配置RabbitMQ集群的方法,并提供了相关命令和管理页面操作步骤。

RabbitMQ配置镜像队列,实现各节点队列同步

SHTL 博客:https://www.shtlls.ltd

镜像集群模式

概念:
把队列做成镜像队列,让各队列存在于多个节点中,属于 RabbitMQ 的高可用性方案。镜像模式和普通模式的不同在于,queue和 message 会在集群各节点之间同步,而不是在 consumer 获取数据时临时拉取。

特点:
(1)实现了高可用性。部分节点挂掉后,不会影响 rabbitmq 的使用。
(2)降低了系统性能。镜像队列数量过多,大量的消息同步也会加大网络带宽开销。
(3)适合对可用性要求较高的业务场景。

RabbitMQ普通集群部署

首先按照普通集群部署,然后通过设置,使之成为 镜像集群模式。

  1. 拉取镜像

    docker pull rabbitmq:management
    
  2. 运行容器

    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 获得认证。
    
  3. 加入节点到集群

    设置节点一 主节点

    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}
    

    每一个节点都需要做的修改,否则,绿色的部分都不会显示,都会变黄

    image-20210723100133996

    由上图可见:共有三个节点,
    	rabbit@rabbit_host1: 磁盘节点(disc)
    	rabbit@rabbit_host2:  内存节点(RAM)
    	rabbit@rabbit_host3: 内存节点(RAM)
    

    RabbitMQ镜像集群部署

    1. 策略policy概念

    使用RabbitMQ镜像功能,需要基于RabbitMQ策略来实现,策略policy是用来控制和修改群集范围的某个vhost队列行为和Exchange行为。策略policy就是要设置哪些Exchange或者queue的数据需要复制、同步,以及如何复制同步。

    为了使队列成为镜像队列,需要创建一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不同的值,下表说明这些key的选项。

image-20210722174732202

  1. 添加策略

    登录rabbitmq管理页面 ——> Admin ——> Policies ——> Add / update a policy

image-20210722174809811

name:随便取,策略名称
Pattern:^ 匹配符,只有一个^代表匹配所有
Definition:ha-mode=all 为匹配类型,分为3种模式:all(表示所有的queue)

或者使用命令:
\#rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
  1. 查看效果

    此策略会同步所在同一VHost中的交换器和队列数据。设置好policy之后,使用 http://ip:15672 再次进行访问,可以看到队列镜像同步。

image-20210722174919751

SpringBoot配置RabbitMQ集群

  1. 配置RabbitMQ单机
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: username
    password: password

或者使用addresses

spring:
  rabbitmq:
    addresses:ip1:port1
    username: username
    password: password
  1. 配置RabbitMQ集群

    addresses节点用逗号分隔

spring:
  rabbitmq:
    addresses:ip1:port1,ip2:port2,ip3:port3
    username: username
    password: password
  1. 配置RabbitMQ集群

    addresses节点用逗号分隔

spring:
  rabbitmq:
    addresses:ip1:port1,ip2:port2,ip3:port3
    username: username
    password: password
### RabbitMQ集群与Nacos集成的配置方法 #### 1. Nacos作为配置中心的作用 Nacos能够提供统一的服务发现和配置管理功能,在微服务架构下,通过集中式的管理和动态更新配置来简化开发运维工作。对于RabbitMQ集群而言,利用Nacos可以实现消费端基于配置文件控制其连接参数以及消费者实例的数量等设置[^1]。 #### 2. 实现方案概述 为了使RabbitMQ集群中的各个组件能响应来自Nacos的变化通知并据此调整自身的运行状态,可以在应用程序启动阶段初始化时订阅特定路径下的配置项;当检测到这些配置发生变更时触发相应的处理逻辑——比如重新加载队列绑定关系或是增减消费者线程池大小等等[^4]。 #### 3. Spring Cloud Stream结合Nacos使用案例分析 考虑到很多场景会采用Spring框架构建Java项目,则借助于`spring-cloud-starter-alibaba-nacos-config`依赖包很容易完成上述需求: - **引入必要的Maven依赖** ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- 如果还需要支持消息中间件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` - **编写自定义事件处理器类** 创建名为`RabbitmqToggleEventHandler.java`的新文件用于监听由Nacos推送过来的消息,并依据接收到的内容执行对应的操作,例如开启/关闭某些特性或修改资源分配策略等: ```java @Component public class RabbitmqToggleEventHandler { @EventListener(RabbitmqToggleInitEvent.class) public void handleRabbitmqToggleInitEvent(RabbitmqToggleInitEvent event){ // 处理业务逻辑... } } ``` - **配置application.properties/yml文件** 指定要从哪个命名空间读取数据源信息以及其他必要属性值,同时声明默认情况下启用哪些特性和它们各自的初始设定[^2]: ```yaml spring.application.name=rabbitmq-consumer-app spring.rabbitmq.host=${rabbitmq.server.address:localhost} spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest management.endpoints.web.exposure.include=* # nacos config properties spring.cloud.nacos.config.server-addr=localhost:8848 spring.cloud.nacos.discovery.server-addr=localhost:8848 ``` #### 4. 动态感知Nacos配置变化机制说明 每当有新的版本被提交至远程仓库之后,本地客户端便会自动拉取最新的快照副本加以解析应用,从而确保整个系统的灵活性与可维护性得以显著提升。特别是针对那些频繁变动的部分(如数据库链接串),这种方式的优势尤为明显[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值