rabbitmq集群-普通模式

这篇具有很好参考价值的文章主要介绍了rabbitmq集群-普通模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RabbitMQ的Cluster模式分为两种

  1. 普通模式
  2. 镜像模式
1. 概念解释
1.1 什么是普通模式

普通集群模式,就是将 RabbitMQ 部署到多台服务器上,每个服务器启动一个 RabbitMQ 实例,多个实例之间进行消息通信。

此时我们创建的队列 Queue,它的元数据(主要就是 Queue 的一些配置信息)会在所有的 RabbitMQ 实例中进行同步,但是队列中的消息只会存在于一个 RabbitMQ 实例上,而不会同步到其他队列。

当我们消费消息的时候,如果连接到了另外一个实例,那么那个实例会通过元数据定位到 Queue 所在的位置,然后访问 Queue 所在的实例,拉取数据过来发送给消费者。

这种集群可以提高 RabbitMQ 的消息吞吐能力,但是无法保证高可用,因为一旦一个 RabbitMQ 实例挂了,消息就没法访问了,如果消息队列做了持久化,那么等 RabbitMQ 实例恢复后,就可以继续访问了;如果消息队列没做持久化,那么消息就丢了。

大致的流程图如下图:

rabbitmq集群-普通模式
*我们会发现,其实队列的数据只是保存了一份,其他的broker只是保留了元数据而已,用来访问交换机,binding或者队列的基本信息(比如地址啥的)

1.2 什么是元数据

元数据包含以下内容:

  • 队列元数据:队列的名称及属性
  • 交换器:交换器的名称及属性
  • 绑定关系元数据:交换器与队列或者交换器与交换器
  • vhost元数据:为vhost内的队列,交换器和绑定提供命名空间及安全属性之间的绑定关系
1.3 节点类型

RabbitMQ 中的节点类型有两种:

  • RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得交换机和队列声明等操作速度更快。
  • Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息

RabbitMQ 要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。为了确保集群信息的可靠性,或者在不确定使用磁盘节点还是内存节点的时候,建议直接用磁盘节点。

1.4 缺点

我们会发现,在这汇总集群方式中的情形下,我们会遇到如下几个问题

  1. 保存队列的节点很难知道
  2. 一旦保存队列信息的节点宕机,其实,集群还是没办法工作
2 windows下单机配置rabbitmq集群(普通模式)
2.1 安装rabbitmq

参考文章window下单机搭建RabbitMQ多节点集群

rabbitmq集群-普通模式
分别访问他们的ui管理界面
http://localhost:15673/#/
http://localhost:15674/#/
http://localhost:15675/#/
界面应当如下,节点名称应当会变,但是应当可以访问
rabbitmq集群-普通模式

2.2 建立集群

关闭rabbitmq node 2,3,让他们加入rabbit1集群

如果是通过rabbitmq-server方式启动的,直接关闭运行界面就可以了,如果是通过rabbitmq-server -detached的话,执行

D:\tools\RabbitMQ Server\rabbitmq_server-3.8.4-2\sbin>rabbitmqctl stop_app
Stopping rabbit application on node rabbit2@DESKTOP-IB5K0.. ... //成功关闭提示

ok,那我们正式开始,关闭所有的节点(命令基于powershell)

2.2.1 启动rabbit1,执行 .\rabbitmq-server.bat -detached

rabbitmq集群-普通模式
打开 http://localhost:15673/#/ 查看信息

2.2.2 将 rabbit2 加入 rabbit1, 在rabbit2的目录下执行:
.\rabbitmqctl.bat join_cluster rabbit1

出现如下提示,
rabbitmq集群-普通模式
我们查看http://localhost:15673/#/,
rabbitmq集群-普通模式
rabbit2节点没有启动,但是加进来了。

2.2.3 启动节点rabbit2

在D:\rabbitmq_server-3.10.6-2\sbin 下执行如下命令

rabbitmqctl start_app

rabbitmq集群-普通模式
rabbit2节点启动了

同理,注册rabbit3到集群中,并且启动
可以在ui中查看到注册进来了
rabbitmq集群-普通模式

2.2.4 查看集群状态

我们切换到server-1下执行命令

 .\rabbitmqctl.bat cluster_status

可以查看各种节点的信息
rabbitmq集群-普通模式

2.2.5 退出集群

假如我们需要结束节点3,那么在对应的目录下,执行命令如下

  1. rabbitmq-server -detached (已经启动可以忽略这一步)
  2. rabbitmqctl stop_app (关闭节点)
  3. rabbitmqctl reset
    rabbitmq集群-普通模式
    我们查看ui管理,发现节点rabbit3确实没了
    rabbitmq集群-普通模式
    至此,普通集群已初步搭建,这种集群可以提高 RabbitMQ 的消息吞吐能力,但是无法保证高可用,因为一旦一个 RabbitMQ 实例挂了,消息就没法访问了,如果消息队列做了持久化,那么等 RabbitMQ 实例恢复后,才可以继续访问;如果消息队列没做持久化,那么消息就丢了。基于这种情况,我们可以将队列设置为镜像队列来解决
3 spring boot + rabbitmq集群(单节点配置)

我们发现无论是访问下面的那个界面,都是出现了集群的信息的
http://localhost:15673/#/
http://localhost:15674/#/
http://localhost:15675/#/

前文请参考:spring-boot rabbitmq整合

3.1 发送单点结合,但是在另外的节点也是可以消费的

如果publish指定集群的某个节点,其他的节点也是可以访问这个message的,除非该节点宕机了。

3.1.1 生产者设置节点是node1-rabbit1

测试
搭建好集群后,我们需要做个测试,我们发送一个mq消息,会发现三个节点都有这个消息,我们修改配置把publish的broker节点设置为5673,而不是address设置集群地址

spring:
  rabbitmq:
    host: 0.0.0.0
    port: 5673
    username: root
    password: root
    publisher-confirms: true    #确认消息已发送到交换机(Exchange)
    publisher-returns: true     #确认消息已发送到队列(Queue)

如果root没有权限,请改成guest/guest都行,我们发送了一个名为TestDirectQueue的队列,我们去

http://localhost:15673/#/queues
http://localhost:15674/#/queues
http://localhost:15675/#/queues

看,我们会发现都有未消费的的message

rabbitmq集群-普通模式

3.1.2 生产者设置消费者节点是node2-rabbit2

修改consumer配置为:

spring:
  rabbitmq:
    host: 0.0.0.0
    port: 5674
    username: root
    password: root
    virtual-host: pers-xrb
    listener:
      direct:
        retry:
          max-attempts: 3
      simple:
        retry:
          max-attempts: 3
        acknowledge-mode: manual

启动consumer项目,我们可以发现,message被消费完了
rabbitmq集群-普通模式
总结
我们可以大胆的猜测,保留队列信息的消息在节点1,rabbit1上的,但是集群中的其他节点也是可以消费的。如果节点1的消费者很慢的话,多几个节点也是可以的。但是如果rabbit1节点宕机了,理论上是其他节点应该是消费不了的了。

3.2 基于3.1,停机publish发布的节点-rabbit1,其他节点会丢失该节点信息
3.2.1 停止保存queue信息的节点

如果保存queue 消息队列的节点宕机了的话,那么就会发现,其他节点没有节点信息了,我们发送一个mq后,再执行命令,停止rabbit1

 .\rabbitmqctl.bat stop_app

在访问 http://localhost:15674/#/ 或者http://localhost:15675/#/ 我们会发现节点 rabbit1停止了,我们再看queue的消息
rabbitmq集群-普通模式
无法获取对应的消息了,启动消费者会报错
rabbitmq集群-普通模式

3.2.2 重启停止了的保存queue 消息的节点queue

我们执行命令,重启节点rabbit1

 .\rabbitmqctl.bat start_app

rabbitmq集群-普通模式
message又可见了,我们再重启消费者,消费成功
rabbitmq集群-普通模式

4 spring boot + rabbitmq集群(多节点配置)

参考 3. spring boot + rabbitmq集群(单节点配置) 只需要修改配置文件就可以了。

通常来说,配置rabbitmq的集群应该如下配置,在address中配置多个地址,通过都好分割

spring:
  rabbitmq:
    username: root
    password: root
    publisher-confirms: true    #确认消息已发送到交换机(Exchange)
    publisher-returns: true     #确认消息已发送到队列(Queue)
    addresses: 0.0.0.0:5674,0.0.0.0:5673,0.0.0.0:5675
    listener:
      simple:
        acknowledge-mode: manual

参考
  1. SpringBoot中RabbitMQ集群的搭建详解
  2. window下单机搭建RabbitMQ多节点集群(超详细)

代码地址: https://github.com/GitHubsteven/spring-in-action2.0/tree/master/spring-boot-mesage文章来源地址https://www.toymoban.com/news/detail-421598.html

到了这里,关于rabbitmq集群-普通模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RaabitMQ(三) - RabbitMQ队列类型、死信消息与死信队列、懒队列、集群模式、MQ常见消息问题

    这是RabbitMQ最为经典的队列类型。在单机环境中,拥有比较高的消息可靠性。 经典队列可以选择是否持久化(Durability)以及是否自动删除(Auto delete)两个属性。 Durability有两个选项,Durable和Transient。 Durable表示队列会将消息保存到硬盘,这样消息的安全性更高。但是同时,由于需

    2024年02月14日
    浏览(168)
  • RabbitMQ:概念和安装,简单模式,工作,发布确认,交换机,死信队列,延迟队列,发布确认高级,其它知识,集群

    1.1.1.什么是MQ MQ(message queue:消息队列) ,从字面意思上看,本质是个 队列 , FIFO 先入先出 ,只不过队列中存放的 内容是message 而已 ,还是一种 跨进程的通信机制 , 用于上下游传递消息 。在互联网架构中,MQ 是一种非常常见的上下游 “逻辑解耦+物理解耦” 的消息通信服

    2024年01月20日
    浏览(71)
  • 普通Maven项目使用RabbitMQ

    普通Maven项目使用RabbitMQ 一、简单模式 一个服务者对应一个消费者 创建BaseProject父maven项目,在父项目底下创建maven模块producer 导入相关依赖 在resource目录下创建log4j.properties 创建RabbitMqUtil工具类 服务提供者类发送消息 向队列queue1发送消息,如果该消息没被消费者消费,消息

    2024年02月14日
    浏览(32)
  • Redis集群(cluster模式)搭建

    目录 1、什么是集群 2、为什么使用 3、集群连接 4、redis cluster 如何分配这六个节点? 5、集群搭建: Redis 集群(包括很多小集群)实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N,即一个小集群存储1/N的数据,每

    2024年02月15日
    浏览(47)
  • 【2023】Redis cluster集群模式搭建

    Redis Cluster是Redis提供的一种分布式方案,可以将数据分散到多个节点上进行存储和处理,提高数据的可用性和性能。Redis Cluster采用哈希槽的方式来分片数据,将整个数据集分为 16384 个哈希槽,每个节点负责一部分哈希槽的数据存储和处理,节点之间通过gossip协议进行信息交

    2024年02月08日
    浏览(52)
  • redis7部署集群:包含主从模式、哨兵模式、Cluster集群模式等三种模式

    前言: redis部署集群常见的一般有三种模式:主从模式,Sentinel(哨兵模式),Redis Cluster(高可用Cluster集群),根据不同的需求可自定义选择部署方式。 Redis 主从模式(Replication) 优点: 数据备份:主节点的数据会复制到从节点,提供了数据冗余和一定程度的故障恢复能力

    2024年01月20日
    浏览(95)
  • 【Redis】三种集群模式(主从复制、哨兵模式、Cluster)

    redis有三种集群模式,其中主从是最常见的模式。Sentinel 哨兵模式是为了弥补主从复制集群中主机宕机后,主备切换的复杂性而演变出来的。哨兵顾名思义,就是用来监控的,主要作用就是监控主从集群,自动切换主备,完成集群故障转移。cluster 模式是redis官方提供的集群模

    2024年01月21日
    浏览(61)
  • redis 集群模式(redis cluster)介绍

    目录 一    redis cluster 相关定义 1, redis cluster 是什么 2,redis 集群的组成 3,集群的作用 4,集群架构图 二     Redis集群的数据分片 1,哈希槽是什么 2,哈希槽如何排布 3,Redis集群的主从复制模型 4,哈希槽架构图 三     实验模拟redis 集群 1,实验环境 2,清理实验环

    2024年04月13日
    浏览(40)
  • Redis 主从复制 + 哨兵模式 + Cluster 集群

    redis群集有三种模式: 分别是主从同步/复制、哨兵模式、Cluster,下面会讲解一下三种模式的工作方式,以及如何搭建cluster群集 主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡

    2024年02月09日
    浏览(38)
  • Redis追本溯源(四)集群:主从模式、哨兵模式、cluster模式

    Redis 有多种集群搭建方式,比如,主从模式、哨兵模式、Cluster 模式。 Redis 主从模式还解决了单点的问题。Redis 主库在进行修改操作的时候,会把相应的写入命令近乎实时地同步给从库,从库回放这些命令,就可以保证自己的数据与主库保持一致。那么,当主库发生宕机的时

    2024年02月14日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包