『RabbitMQ』手把手带你搭建RabbitMQ镜像集群

简介: 📣读完这篇文章里你能收获到- RabbitMQ多种模式的区别及概念- 手把手带你搭建高可用集群- 接入HaProxy做高可用负载均衡- 针对生产突发的异常场景提进行测试验证

请添加图片描述

📣读完这篇文章里你能收获到

  • RabbitMQ多种模式的区别及概念
  • 手把手带你搭建高可用集群
  • 接入HaProxy做高可用负载均衡
  • 针对生产突发的异常场景提进行测试验证

请添加图片描述

一、概念篇

  • MQ 会导致系统可用性降低。所以只要你用了 MQ,肯定就要想着 MQ 的缺点怎么来解决了,要是你傻乎乎的就干用了一个 MQ,各种问题从来没考虑过,那你就杯具了。
  • RabbitMQ 是比较有代表性的,因为是基于主从(非分布式)做高可用性的
  • RabbitMQ 有三种模式:单机模式普通集群模式镜像集群模式

1 单机模式

单机模式,就是 Demo 级别的,一般就是你本地启动了玩玩儿的😄,没人生产用单机模式。

2 普通集群模式(无高可用性)

普通集群模式,意思就是在多台机器上启动多个 RabbitMQ 实例,每个机器启动一个。你创建的 queue,只会放在一个 RabbitMQ 实例上,但是每个实例都同步 queue 的元数据(元数据可以认为是 queue 的一些配置信息,通过元数据,可以找到 queue 所在实例)。你消费的时候,实际上如果连接到了另外一个实例,那么那个实例会从 queue 所在实例上拉取数据过来。
在这里插入图片描述
这种方式确实很麻烦,也不怎么好,没做到所谓的分布式,就是个普通集群。因为这导致你要么消费者每次随机连接一个实例然后拉取数据,要么固定连接那个 queue 所在实例消费数据,前者有数据拉取的开销,后者导致单实例性能瓶颈。

而且如果那个放 queue 的实例宕机了,会导致接下来其他实例就无法从那个实例拉取,如果你开启了消息持久化,让 RabbitMQ 落地存储消息的话,消息不一定会丢,得等这个实例恢复了,然后才可以继续从这个 queue 拉取数据。

所以这个事儿就比较尴尬了,这就没有什么所谓的高可用性,这方案主要是提高吞吐量的,就是说让集群中多个节点来服务某个 queue 的读写操作。

3 镜像集群模式(高可用性)

这种模式,才是所谓的 RabbitMQ 的高可用模式。跟普通集群模式不一样的是,在镜像集群模式下,你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,就是说,每个 RabbitMQ 节点都有这个 queue 的一个完整镜像,包含 queue 的全部数据的意思。然后每次你写消息到 queue 的时候,都会自动把消息同步到多个实例的 queue 上。
在这里插入图片描述
那么如何开启这个镜像集群模式呢?其实很简单,RabbitMQ 有很好的管理控制台,就是在后台新增一个策略,这个策略是镜像集群模式的策略,指定的时候是可以要求数据同步到所有节点的,也可以要求同步到指定数量的节点,再次创建 queue 的时候,应用这个策略,就会自动将数据同步到其他的节点上去了。

这样的话,好处在于,你任何一个机器宕机了,没事儿,其它机器(节点)还包含了这个 queue 的完整数据,别的 consumer 都可以到其它节点上去消费数据。坏处在于,第一,这个性能开销也太大了吧,消息需要同步到所有机器上,导致网络带宽压力和消耗很重!第二,这么玩儿,不是分布式的,就没有扩展性可言了,如果某个 queue 负载很重,你加机器,新增的机器也包含了这个 queue 的所有数据,并没有办法线性扩展你的 queue。你想,如果这个 queue 的数据量很大,大到这个机器上的容量无法容纳了,此时该怎么办呢?大家自己动脑筋想一下吧,有好思路(别跟我说换Kafka可以解决,我也知道)欢迎评论

请添加图片描述

二、普通集群搭建

rabbitmq镜像集群依赖于普通集群,所以需要先搭建rabbitmq普通集群

1 构建环境

操作系统:Centos7
Docker版本:20.10.5

2 搭建RabbitMQ普通集群

  • docker拉取带management tag的最新版本
docker pull rabbitmq:management

  • 启动并创建三个同样cookie的镜像实例(同样的cookie才能加入集群)
这里注意使用--link将容器实例之前网络联系起来
docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management
docker run -d --hostname rabbit2 --name myrabbit2 -p 15673:15672 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management
docker run -d --hostname rabbit3 --name myrabbit3 -p 15674:15672 -p 5674:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

  • 两个从机加入集群
docker exec -it myrabbit1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
 
docker exec -it myrabbit2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster  rabbit@rabbit1
rabbitmqctl start_app
exit
 
 
docker exec -it myrabbit3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster  rabbit@rabbit1
rabbitmqctl start_app
exit

  • 测试普通集群是否搭建成功

进入控制台web界面查看http://ip:15672, 可以发现普通集群搭建成功

在这里插入图片描述

//其他基本操作
// 在另外其他节点上操作要移除的集群节点
rabbitmqctl forget_cluster_node master73@master73
//集群名称(默认为第一个node名称)修改(任意节点):
rabbitmqctl set_cluster_name rabbitmq_cluster1
//查看集群状态(任意节点)
rabbitmqctl cluster_status

请添加图片描述

三、镜像集群配置

1 通过命令配置

  • 设置镜像队列策略(在任意一个节点上执行)
docker exec -it myrabbit1 bash
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

2 通过Dashboard控制台手动配置

切换到Admin->Policy->Add/Update Policy 在这里插入图片描述

参数含义:

pattern: 队列名字的通配符

ha-mode:镜像队列提供了三种模式:

  1. all:全部的节点队列都做镜像;
  2. exactly:指定镜像队列的节点最高镜像数量;
  3. nodes:只为指定具体节点配置镜像队列;

ha-sync-mode :节点之前的同步模式。有自动和手动两种,默认是手动,这里设置为自动。

3 查看镜像队列配置

设置完成并添加了这个策略后,新建的和已存在的队列默认会支持此策略
队列会被同步复制到各个节点,RabbitMQ高可用集群就已经搭建好了

在这里插入图片描述

请添加图片描述

四、接入HaProxy做高可用负载均衡

HaProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HaProxy特别适用于负载特大的web站点,这些站点通常又需要会话保持或七层处理。HaProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以简单安全整合进您当前框架中,同时可以保护你的web服务器不被暴露到网络上。

1 拉取HaProxy镜像

docker pull haproxy

2 创建haproxy.cfg配置文件

mkdir /project/haproxy/
vi /project/haproxy/haproxy.cfg
  • 这里一定要注意,创建的名字一定要为haproxy.cfg,不然后面挂载的时候一直报错

haproxy.cfg文件内容

global
        log 127.0.0.1 local0 info
        maxconn 5120
        uid 99
        gid 99
        daemon
        quiet
        nbproc 20

defaults
        log global
        #使用4层代理模式,”mode http”为7层代理模式
        mode tcp
        #if you set mode to tcp,then you nust change tcplog into httplog
        option tcplog
        option dontlognull
        retries 3
        option redispatch
        maxconn 2000
        timeout connect 5s
        #客户端空闲超时时间为 60秒 则HA 发起重连机制
        timeout client 60s
        #服务器端链接超时时间为 15秒 则HA 发起重连机制
        timeout server 15s
        #front-end IP for consumers and producters

listen rabbitmq_cluster
        bind 0.0.0.0:5678
        #配置TCP模式
        mode tcp
        #balance url_param userid
        #balance url_param session_id check_post 64
        #balance hdr(User-Agent)
        #balance hdr(host)
        #balance hdr(Host) use_domain_only
        #balance rdp-cookie
        #balance leastconn
        #balance source //ip
        #简单的轮询
        balance roundrobin
        #rabbitmq集群节点配置 
        #inter 每隔五秒对mq集群做健康检查, 2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制
        server myrabbit1 192.168.204.128:5672 check inter 5000 rise 2 fall 2
        server myrabbit2 192.168.204.128:5673 check inter 5000 rise 2 fall 2
        server myrabbit3 192.168.204.128:5674 check inter 5000 rise 2 fall 2

listen stats
        bind 0.0.0.0:8101
        mode http
        option httplog
        stats enable
        #设置haproxy监控地址为http://localhost:8100/rabbitmq-stats
        stats uri /rabbitmq-stats
        stats refresh 5s
        stats auth admin:123456

listen rabbitmq_admin
        bind 0.0.0.0:8001
        server myrabbit1 192.168.204.128:15672 check inter 5000 rise 2 fall 2
        server myrabbit2 192.168.204.128:15673 check inter 5000 rise 2 fall 2
        server myrabbit3 192.168.204.128:15674 check inter 5000 rise 2 fall 2        

2 登陆查看状态

  • http://ip:8101/rabbitmq-stats
  • 输入设置的账号密码 :admin 123456

在这里插入图片描述

请添加图片描述

五、突发情况模拟测试

1 准备一个生产者,不断地生产数据

  • 生产者接入的端口在这里是5678

在这里插入图片描述

2 随机断开其中一个节点

  • 以Rabbit3演示
docker stop myrabbit3

  • 查看Haproxy状态
  • 发现rabbit3节点已经变为红色

在这里插入图片描述


  • 查看MQ状态
登陆 http://ip:8001
发现rabbit3节点已经变为红色
在这里插入图片描述

3 查看此时的生产者情况

  • 可以看到生产者并为断开,依旧继续稳定生产消息

在这里插入图片描述

4 重新启动Rabbit3节点

docker start myrabbit3

  • 查看HaProxy状态,由黄->绿

在这里插入图片描述
在这里插入图片描述


  • 5.4.2 查看MQ状态,由黄->绿

在这里插入图片描述
在这里插入图片描述

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
3月前
|
消息中间件 存储 负载均衡
|
3月前
|
消息中间件 存储 负载均衡
"RabbitMQ集群大揭秘!让你的消息传递系统秒变超级英雄,轻松应对亿级并发挑战!"
【8月更文挑战第24天】RabbitMQ是一款基于AMQP的开源消息中间件,以其高可靠性、扩展性和易用性闻名。面对高并发和大数据挑战时,可通过构建集群提升性能。本文深入探讨RabbitMQ集群配置、工作原理,并提供示例代码。集群由多个通过网络连接的节点组成,共享消息队列,确保高可用性和负载均衡。搭建集群需准备多台服务器,安装Erlang和RabbitMQ,并确保节点间通信顺畅。核心步骤包括配置.erlang.cookie文件、使用rabbitmqctl命令加入集群。消息发布至任一节点时,通过集群机制同步至其他节点;消费者可从任一节点获取消息。
48 2
|
3月前
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
85 0
|
3月前
|
消息中间件 应用服务中间件 网络安全
rabbitMQ镜像模式搭建
rabbitMQ镜像模式搭建
|
4月前
|
消息中间件 Prometheus 监控
消息队列 MQ使用问题之如何将旧集群的store目录迁移到新集群
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
4月前
|
消息中间件 RocketMQ
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
|
3月前
|
消息中间件 API 数据安全/隐私保护
就软件研发问题之RocketMQ ACL 2.0加强集群组件间访问控制的问题如何解决
就软件研发问题之RocketMQ ACL 2.0加强集群组件间访问控制的问题如何解决
|
4月前
|
消息中间件 负载均衡 算法
【RocketMQ系列十二】RocketMQ集群核心概念之主从复制&生产者负载均衡策略&消费者负载均衡策略
【RocketMQ系列十二】RocketMQ集群核心概念之主从复制&生产者负载均衡策略&消费者负载均衡策略
131 2
|
4月前
|
消息中间件 NoSQL 关系型数据库
【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试&死信队列&幂等消息的出现以及处理
【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试&死信队列&幂等消息的出现以及处理
134 1
|
4月前
|
消息中间件 存储 Java
消息队列 MQ使用问题之如何将RocketMQ中某个集群的topic迁移到另一个集群
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
下一篇
无影云桌面