RabbitMQ集群搭建

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

说明:集群,不管是Redis集群,还是MQ集群,都是为了提高系统的可用性,使系统不至于因为Redis、MQ宕机而崩溃。本文介绍RabbitMQ集群搭建,RabbitMQ集群分为以下三类:

  • 普通集群

  • 镜像集群

  • 仲裁队列

普通集群

普通集群下,节点之间并不会进行数据同步,而是节点之间存在引用,当消费者绑定的队列(one.queue1),在当前这个节点(mq3)中不存在时,如果该节点关联了该队列所在的节点(mq1),会去该节点拉取消息,并返回。

节点之间的通信是依靠Erlang cookie实现的,当集群中的节点拥有相同的Erlang cookie,则这些节点可以相互通信。Erlang cookie是长度最多255的字母数字字符。

结构图:

RabbitMQ集群搭建,rabbitmq,集群,分布式

搭建

第一步:获取Cookie

输入下面的命令,获取当前单机RabbitMQ的Cookie值,后面把这个值当做集群MQ中每个节点的Cookie;

docker exec -it mq cat /var/lib/rabbitmq/.erlang.cookie

Cookie值为前面的这一段:SKPRVQBTSMEJURVKVQGH

RabbitMQ集群搭建,rabbitmq,集群,分布式

顺便停掉当前运行中的RabbitMQ

docker rm -f mq

RabbitMQ集群搭建,rabbitmq,集群,分布式

第二步:准备配置文件

在/tem目录下,创建一个关于RabbitMQ的配置文件(rabbitmq.conf),内容如下:

loopback_users.guest = false
listeners.tcp.default = 5672
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@mq1
cluster_formation.classic_config.nodes.2 = rabbit@mq2
cluster_formation.classic_config.nodes.3 = rabbit@mq3

RabbitMQ集群搭建,rabbitmq,集群,分布式

第三步:创建cookie文件

在/tem目录下,创建一个文件,用于记录Cookie信息,并设置cookie文件的权限为600,即只能被管理员读写;

# 创建cookie文件
touch .erlang.cookie

# 写入cookie
echo "cookie值" > .erlang.cookie

# 修改cookie文件的权限
chmod 600 .erlang.cookie

RabbitMQ集群搭建,rabbitmq,集群,分布式

第四步:创建目录

准备三个目录,搭建三个节点的集群,分别把配置文件,cookie文件拷贝到这三个目录里;

mkdir mq1 mq2 mq3

cp rabbitmq.conf mq1
cp rabbitmq.conf mq2
cp rabbitmq.conf mq3
cp .erlang.cookie mq1
cp .erlang.cookie mq2
cp .erlang.cookie mq3

RabbitMQ集群搭建,rabbitmq,集群,分布式

第五步:启动

先创建一个网络

docker network create mq-net

RabbitMQ集群搭建,rabbitmq,集群,分布式

分别启动这三个节点,账号、密码相同,名称分别为:mq1、mq2、mq3

程序端口号分别是:8071、8072、8073;

管理平台端口号分别是:8081、8082、8083;

docker run -d --net mq-net \
-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=123456 \
--name 节点名称 \
--hostname 节点名称 \
-p 程序端口:5672 \
-p 管理平台端口:15672 \
rabbitmq:3.8-management

RabbitMQ集群搭建,rabbitmq,集群,分布式

第六步:测试

打开这三个管理平台,如果使用的是云服务,需要开放对应的端口;如果使用的是虚拟机,可直接关闭防火墙;

RabbitMQ集群搭建,rabbitmq,集群,分布式

可以看到其他节点的信息,说明搭建完成;

RabbitMQ集群搭建,rabbitmq,集群,分布式

第七步:使用

在第一个节点(8081)里面创建一个队列,队列内添加一条信息,如下:
RabbitMQ集群搭建,rabbitmq,集群,分布式

在第二个节点(8082)中,可以查看到队列信息和消息的内容,已经达到了集群的效果;

RabbitMQ集群搭建,rabbitmq,集群,分布式

可是此时,把创建这个队列的节点8081关闭,再查看另外节点的情况,另外节点可以看到队列信息,但是不能查看队列的消息内容

RabbitMQ集群搭建,rabbitmq,集群,分布式

小结

在普通集群下,如果各个节点都在线,可以访问任意一个节点,消费到任何队列的消息。但是因为节点之间没有备份数据,某节点下线后,其他节点就不能访问到该节点的消息。普通镜像的MQ集群具有局限性,有福同享,有难自己当。

镜像集群

镜像集群,本质上是主从模式。与Redis主从集群不同的是,主从并不是创建时就决定了的,而是以队列为核心,创建队列的是该队列的主节点,其他节点为该队列的从节点。从节点会同步备份主节点的交换机、队列、队列中的消息。

当消费者绑定的是mq1节点中的one.queue1队列时,因为mq3同步备份了mq1的数据,所以通过访问mq3节点就能得到该队列中的消息,并且当(mq1)宕机时,其余的镜像节点(mq3)会代替成为主节点。

结构图

RabbitMQ集群搭建,rabbitmq,集群,分布式

搭建

镜像集群搭建有三种配置模式,详细参考:rabbitMq集群之镜像模式,这里以exactly为例:

第一步:创建

在之前普通集群的情况下,敲下面的命令,表示镜像数量设置2,匹配队列名以“two”开头的队列;

docker exec -it mq1 rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

RabbitMQ集群搭建,rabbitmq,集群,分布式

第二步:测试

打开mq1的管理平台,创建一个队列“two.queue”,看到可以指定节点,说明镜像集群已搭建成功;

RabbitMQ集群搭建,rabbitmq,集群,分布式

点击队列特征(features)可以看到策略信息,one.queue8081没有,是因为不是以“two”开头的队列;

RabbitMQ集群搭建,rabbitmq,集群,分布式

第三步:使用

在mq1节点下two.queue8081队列内添加一条消息;

RabbitMQ集群搭建,rabbitmq,集群,分布式

在mq3节点下,可以看到消息已同步过来;
RabbitMQ集群搭建,rabbitmq,集群,分布式

此时,把mq1宕机,看其他节点还能不能查看到消息;

RabbitMQ集群搭建,rabbitmq,集群,分布式
可以看到,mq3仍能查看到mq1当时创建的队列内的消息,并且队列的Node信息已经更改为rabbit@mq2

RabbitMQ集群搭建,rabbitmq,集群,分布式

小结

镜像集群,本质上是主从模式,可以同步节点之间的交换机、队列、队列内的消息,并且当主节点宕机时,其余镜像节点会代替称为主节点。

仲裁队列

仲裁队列是RabbitMQ 3.8之后增加的功能,效果与镜像队列一样,但省去了搭建镜像集群的操作,十分方便。

搭建

第一步:创建仲裁队列

RabbitMQ集群搭建,rabbitmq,集群,分布式
可以看到Node信息里面有“+2”,表示该队列另有两个镜像节点。默认情况是5,节点数小于5以实际为准;
RabbitMQ集群搭建,rabbitmq,集群,分布式

第二步:添加消息

在quorum.queue队列内添加消息;

RabbitMQ集群搭建,rabbitmq,集群,分布式

第三步:让MQ1宕机

在mq2中可以看到quorum.queue队列的消息内容

RabbitMQ集群搭建,rabbitmq,集群,分布式

手动让mq1宕机,再看看

RabbitMQ集群搭建,rabbitmq,集群,分布式

可以看到,在mq2中还是能看到quorum.queue队列内的消息,并且Node节点已更改为rabbit@mq3,并且数量-1,仲裁队列达到了与镜像集群相同的效果。

RabbitMQ集群搭建,rabbitmq,集群,分布式

代码中使用

如果需要在代码中创建仲裁队列,也十分方便,只需在配置文件中指定节点IP(注意此时端口号为程序的端口号,同样也需要开放这些端口号),连接集群:

spring:
  rabbitmq:
    addresses: 服务器地址:8071, 服务器地址:8072, 服务器地址:8073
  username: root
  password: 123456
  virtual-host: /

创建Quorum队列

    /**
     * 创建仲裁队列
     * @return
     */
    @Bean
    public Queue quorumQueue(){
        return QueueBuilder.durable("quorum.queue")
                .quorum()
                .build();
    }

小结

仲裁队列效果与镜像集群相同,省去了搭建镜像集群的操作,使用起来非常方便。另外,仲裁队列可集群扩容,增加集群的可用性(参考:http://t.csdn.cn/BwMeN)

总结

MQ集群分普通集群、镜像集群和仲裁队列三种,就可用性来说,普通集群局限性很大,只能做到“转发”,节点宕机了就没办法;镜像集群和仲裁队列效果相同,但仲裁队列不用额外敲命令,推荐使用。文章来源地址https://www.toymoban.com/news/detail-599972.html

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

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

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

相关文章

  • RabbitMQ——解决分布式事务问题,RabbitMQ的重要作用之一!!!通过可靠生产和可靠消费来完美解决!

    分布式事务是指涉及多个独立的计算机系统(也称为节点或参与者)之间的事务处理。在分布式系统中,每个节点可能各自拥有自己的数据存储和事务管理机制。分布式事务的目标是保证在跨多个节点执行的一系列操作可以以一致和可靠的方式执行和提交,即使在面对故障或

    2024年04月23日
    浏览(46)
  • 分布式消息队列:Kafka vs RabbitMQ vs ActiveMQ

    在现代分布式系统中,消息队列是一种常见的异步通信模式,它可以帮助系统处理高并发、高可用性以及容错等问题。在这篇文章中,我们将深入探讨三种流行的分布式消息队列:Apache Kafka、RabbitMQ和ActiveMQ。我们将讨论它们的核心概念、算法原理、特点以及使用场景。 随着

    2024年02月02日
    浏览(60)
  • 微服务学习:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    目录 一、高级篇 二、面试篇 ==============实用篇============== day05-Elasticsearch01 1.初识elasticsearch 1.4.安装es、kibana 1.4.1.部署单点es 1.4.2.部署kibana 1.4.3.安装IK分词器 1.4.4.总结 2.索引库操作 2.1.mapping映射属性 2.2.索引库的CRUD 2.2.1.创建索引库和映射 2.2.2.查询索引库 2.2.3.修改索引库 2.

    2024年02月02日
    浏览(54)
  • Python爬虫分布式架构 - Redis/RabbitMQ工作流程介绍

    在大规模数据采集和处理任务中,使用分布式架构可以提高效率和可扩展性。本文将介绍Python爬虫分布式架构中常用的消息队列工具Redis和RabbitMQ的工作流程,帮助你理解分布式爬虫的原理和应用。 为什么需要分布式架构? 在数据采集任务中,单机爬虫可能面临性能瓶颈和资

    2024年02月11日
    浏览(40)
  • (黑马出品_07)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    [此文档是在心向阳光的天域的博客加了一些有助于自己的知识体系,也欢迎大家关注这个大佬的博客](https://blog.csdn.net/sinat_38316216/category_12263516.html) [是这个视频](https://www.bilibili.com/video/BV1LQ4y127n4/?p=5spm_id_from=pageDrivervd_source=9beb0a2f0cec6f01c2433a881b54152c) 聚合 可以让我们极其方便

    2024年03月12日
    浏览(52)
  • 分布式搜索引擎(Elastic Search)+消息队列(RabbitMQ)部署(商城4)

    1、全文搜索 Elastic search可以用于实现全文搜索功能,例如商城中对商品搜索、搜索、分类搜索、订单搜索、客户搜索等。它支持复杂的查询语句、中文分词、近似搜索等功能,可以快速地搜索并返回匹配的结果。 2、日志分析 Elastic search可以用于实现实时日志分析,例

    2024年02月04日
    浏览(48)
  • 分布式 SpringCloudAlibaba、Feign与RabbitMQ实现MySQL到ES数据同步

    本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 同步调用 方案一:同步调用 基本步骤如下: hotel-demo对外提供接口,用来修改elasticsearch中的数据 酒店管理服务在完成数据库操

    2024年04月11日
    浏览(45)
  • Hadoop分布式集群搭建

    集群以三台电脑搭建,每台电脑创建一个UbuntuKylin虚拟机,集群以三台UbuntuKylin虚拟机为基础搭建,虚拟机主机名分别为hadoop101、hadoop111和hadoop121。IP地址分别为192.168.214.101、192.168.214.111和192.168.214.121。 主机名 IP地址: hadoop101 192.168.214.101 hadoop111 192.168.214.111 hadoop121 192.168.214

    2024年02月03日
    浏览(48)
  • 搭建HBase分布式集群

    0. Prerequisite There are 3 VMs - hadoop3/hadoop4/hadoop5 for fully-distributed HBase cluster, the setup plan looks like: hadoop3 hadoop4 hadoop5 Hadoop hdfs NameNode:8020 DateNode:50010 JobHistoryServer:19888 DataNode:50010 SecondaryNameNode:50090 DateNode:50010 Hadoop yarn NodeManger:8040 ResourceMananger:8088 NodeManger:8040 NodeManger:8040 Zookeeper Quor

    2024年02月08日
    浏览(34)
  • 【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性

    org.springframework.boot spring-boot-starter-amqp mysql mysql-connector-java runtime org.projectlombok lombok true org.springframework.boot spring-boot-starter-jdbc com.alibaba fastjson 1.2.17 3.2.1.2配置文件内容: server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=tru

    2024年04月14日
    浏览(64)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包