RabbitMQ集群架构

1.RabbitMQ集群模式介绍

  • 普通集群

    • 默认的集群模式,比如有节点node1、node2和node3,三个节点是普通集群,但是他们仅有相同的元数据,即交换机、队列的结构
    • 消息只存在其中的一个节点里面,假如消息A存储在node1节点,消费者连接node1节点消费消息时,可以直接取出来;但如果消费者是连接的其他节点,那RabbitMQ会把queue中的消息从存储它的节点中取出,并经过连接节点转发后再发送给消费者
    • 假如node1故障,那node2无法获取node1存储未被消费的消息;如果node1持久化后故障,那需要等node1恢复后才可以正常消费;如果node1没做持久化后故障,那消息将会丢失
    • 这个情况无法实现高可用性,且节点间会增加通讯获取消息,性能存在瓶颈;该模式更适合于消息无需持久化的场景,如日志传输的队列
    • 注意:集群需要保证各个节点有相同的token令牌。erlang.cookie是erlang的分布式token文件,集群内各个节点的erlang.cookie需要相同,才可以互相通信
  • 镜像集群(大厂基本使用这个方式)

    • 队列做成镜像队列,让各队列存在于多个节点中
    • 和普通集群比较大的区别就是【队列queue的消息message】会在集群各节点之间同步,且并不是consumer获取数据时临时拉取,而普通集群则是临时从存储的节点里面拉取对应的数据
    • 实现了高可用性,部分节点挂掉后,不影响正常的消费,可以保证100%消息不丢失,推荐奇数个节点,结合LVS+Keepalive进行IP漂移,防止单点故障
    • 缺点:由于镜像队列模式下,消息数量过多,大量的消息同步也会加大网络带宽开销,适合高可用要求比较高的项目,过多节点的话,性能则更加受影响
    • 注意:集群需要保证各个节点有相同的token令牌。erlang.cookie是erlang的分布式token文件,集群内各个节点的erlang.cookie需要相同,才可以互相通信
  • 还有其他通过插件形成的集群,比如Federation集群

2.普通集群docker搭建

  • Linux启动3个rabbitmq节点

    # 节点一
    docker run -d --hostname rabbit_host1 \
    --name gen-rabbitmq1 \
    -p 15672:15672 -p 5672:5672 \
    -e RABBITMQ_NODENAME=rabbit \
    -e RABBITMQ_DEFAULT_USER=admin \
    -e RABBITMQ_DEFAULT_PASS=Gen123 \
    -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' \
    --privileged=true \
    -v /usr/local/rabbitmq/1/lib:/var/lib/rabbitmq \
    -v /usr/local/rabbitmq/1/log:/var/log/rabbitmq \
    rabbitmq:management# 节点二
    docker run -d --hostname rabbit_host2 \
    --name gen-rabbitmq2 \
    -p 15673:15672 -p 5673:5672 \
    -e RABBITMQ_NODENAME=rabbit \
    -e RABBITMQ_DEFAULT_USER=admin \
    -e RABBITMQ_DEFAULT_PASS=Gen123 \
    -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' \
    --privileged=true \
    -v /usr/local/rabbitmq/2/lib:/var/lib/rabbitmq \
    -v /usr/local/rabbitmq/2/log:/var/log/rabbitmq \
    --link gen-rabbitmq1:rabbit_host1 \
    rabbitmq:management# 节点三
    docker run -d --hostname rabbit_host3 \
    --name gen-rabbitmq3 \
    -p 15674:15672 -p 5674:5672 \
    -e RABBITMQ_NODENAME=rabbit \
    -e RABBITMQ_DEFAULT_USER=admin \
    -e RABBITMQ_DEFAULT_PASS=Gen123 \
    -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' \
    --privileged=true \
    -v /usr/local/rabbitmq/3/lib:/var/lib/rabbitmq \
    -v /usr/local/rabbitmq/3/log:/var/log/rabbitmq \
    --link gen-rabbitmq1:rabbit_host1 \
    --link gen-rabbitmq2:rabbit_host2 \
    rabbitmq:management
    
  • 参数说明

    --hostname:自定义docker容器的主机名
    --link:容器之间连接,link不可或缺,使得三个容器能互相通信
    --privileged=true:使用该参数,容器内的root拥有真正的root权限,否则容器出现permission denied
    -v:宿主机和容器路径映射
    -e RABBITMQ_NODENAME:缺省Unix*:rabbit@HOSTNAME
    -e RABBITMQ_DEFAULT_USER=admin:登录用户名
    -e RABBITMQ_DEFAULT_PASS=Gen123:登录密码
    -e RABBITMQ_ERLANG_COOKIE:值必须相同,也就是一个集群内,相当于不同节点之间通讯的密钥;erlang.cookie是erlang的分布式token文件,集群内各个节点的erlang.cookie需要相同,才可以互相通信
    
  • 配置集群

    # 节点一配置集群
    docker exec -it gen-rabbitmq1 bash
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl start_app
    exit# 节点二加入集群,--ram是以内存方式加入,忽略该参数默认为磁盘节点
    docker exec -it gen-rabbitmq2 bash
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl join_cluster --ram rabbit@rabbit_host1
    rabbitmqctl start_app
    exit# 节点三加入集群,--ram是以内存方式加入,忽略该参数默认为磁盘节点
    docker exec -it gen-rabbitmq3 bash
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl join_cluster --ram rabbit@rabbit_host1
    rabbitmqctl start_app
    exit# 查看集群节点状态,配置启动了3个节点,1个磁盘节点和2个内存节点
    rabbitmqctl cluster_status
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 测试

    • node1主节点创建队列,发送消息(可以选择消息是否持久化),node2和node3通过节点自身的web管控台可以看到队列和消息
    • 如果把node1节点停止,node2和node3会收不到消息
    • 如果是在非主节点(非磁盘节点)创建队列和发送消息,则其他队列可以显示
  • springboot项目配置集群

    spring:rabbitmq:virtual-host: /password: Gen123username: adminaddresses: 192.168.101.128:5672,192.168.101.128:5673,192.168.101.128:5674
    

3.mirror镜像集群配置

  • 背景

    • 前面搭建了普通集群,如果磁盘节点挂掉后,如果没开启持久化数据就丢失了,其他节点也无法获取消息,所以我们这个集群方案需要进一步改造为镜像模式集群
  • 策略policy介绍

    • RabbitMQ的策略policy是用来控制和修改集群的vhost队列和Exchange复制行为,就是要设置哪些Exchange或者Queue的数据需要复制、同步,以及如何复制同步

    • 策略会同步同一个VirtualHost中的交换机和队列数据

      • Name:自定义策略名称
      • Pattern:匹配符,^代表匹配所有
      • Definition:ha-mode=all;ha-sync-mode=automatic
      ha-mode:指明镜像队列的模式,可选下面的其中一个all:表示在集群中所有的节点上进行镜像同步(一般使用这个参数)exactly:表示在指定个数的节点上进行镜像同步,节点的个数由ha-params指定nodes:表示在指定的节点上进行镜像同步,节点名称通过ha-params指定ha-sync-mode:镜像消息同步方式manua:手动automatic:自动
      

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 集群重启顺序

    • 启动顺序:磁盘节点–>内存节点
    • 关闭顺序:内存节点–>磁盘节点
    • 最后关闭必须是磁盘节点,否则容易造成集群启动失败、数据丢失等异常情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/693744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery将网页html文档导出为pdf图片

jquery将网页html文档导出为pdf图片 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

leetcode经典题库(简单)

文章目录 1.两数之和2.反转链表3.合并两个有序列表4.合并两个有序链表5.删除有序数组中的重复项6.从数组中移除元素7. 搜索指定数值在数组中的插入位置8. 数组最后一位加一9. 合并两个有序数组在leetcode上刷了几个和数组相关的简单题,记录在这里。 1.两数之和 给定一个整数…

Qt多线程调用python并接收调用数据

功能: qt中用多线程的方式调用python脚本,完成C++和python之间的数据交互。为了满足多任务并发的要求,将调用python的逻辑部分封装到QThread的子类PyApiThread中。 主要实现: 包括PyApiThread的实现以及在主线程中如何使用 PyApiThread的的实现,分.h和.cpp两个文件 #ifnd…

Python中HTTP请求的安全性考虑与实践:安全帽下的网络舞者

在Python的HTTP请求世界里&#xff0c;安全性就像是一个必不可少的舞伴&#xff0c;时刻陪伴着你的网络舞步。想象一下&#xff0c;你正在举办一场网络舞会&#xff0c;而安全性则是那个穿着防弹舞衣&#xff0c;戴着安全帽的忠诚舞伴&#xff0c;确保你在舞池中尽情舞动而不必…

JAVA面试题21

Java中的四个访问修饰符&#xff08;access modifiers&#xff09;是什么&#xff1f;它们的区别是什么&#xff1f; 答案&#xff1a;Java中的四个访问修饰符是public、private、protected和默认&#xff08;即不使用修饰符&#xff09;。它们的区别在于它们允许的访问级别不同…

百度百科词条创建机构有哪些?

百度百科&#xff0c;作为一个权威的知识分享平台&#xff0c;拥有着极高的权重和流量。在这个平台上&#xff0c;词条的创建和维护显得尤为重要&#xff0c;它直接关系到一个人或企业的形象和品牌的塑造。因此&#xff0c;百度百科词条的创建和维护逐渐成为了一个专业化的服务…

数据结构---字典树(Tire)

字典树是一种能够快速插入和查询字符串的多叉树结构&#xff0c;节点的编号各不相同&#xff0c;根节点编号为0 Trie树&#xff0c;即字典树&#xff0c;又称单词查找树或键树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。 核心思想也是通过空间来换取时间上的…

C#写的一个计算DCI-P3色域和SRGB的小工具

文章最后附带分享链接与提取码 方便需要测试屏幕的小伙伴&#xff0c;只需要输入RGB就能得到覆盖率与比率&#xff0c;W计算色温&#xff0c;不测也要写上&#xff0c;不然会报错 链接&#xff1a;https://pan.baidu.com/s/1wdmAwmwiXjNvn1tGsvy0HA 提取码&#xff1a;1234

安卓学习笔记之五:Android Studio_骰子案例3(Kotlin搭配 Jetpack Compose实现)

使用 Compose 创建一款交互式 Dice Roller Android 应用。 完成&#xff1a; 定义可组合函数。使用组合创建布局。使用 Button 可组合项创建按钮。导入 drawable 资源。使用 Image 可组合项显示图片。使用可组合项构建交互式界面。使用 remember 可组合项将组合中的对象存储到…

【Docker】有用的命令

文章目录 DockerDocker 镜像与容器的差异Docker的好处Hypervisor运维 一、安装docker二、启动docker三、获取docker镜像四、创建镜像使用命令行创建镜像使用dockerfile创建镜像 五、docker报错 Docker docker镜像&#xff08;Image&#xff09; docker镜像类似于虚拟机镜像&…

sql建库,建表基础操作

当涉及到SQL建库和建表操作时&#xff0c;以下是一个简单的示例&#xff1a; 1. 建库&#xff08;创建数据库&#xff09; sql复制代码 CREATE DATABASE mydatabase; 上述语句将创建一个名为mydatabase的数据库。 2. 选择数据库 在创建表之前&#xff0c;需要选择要在其中…

linux 安装anaconda踩坑——哈希值对不上

下载安装包时执行命令 curl -O https://repo.anaconda.com/archive/Anaconda3-<INSTALLER_VERSION>-Linux-x86_64.sh 其中的<INSTALLER_VERSION>需要填写下载的anaconda版本号&#xff0c;于是我就点开官网提供的版本号链接&#xff0c;将我要下载的版本号copy了一…

pom.xml常见依赖及其作用

1.org.mybatis.spring.boot下的mybatis-spring-boot-starter&#xff1a;这个依赖是mybatis和springboot的集成库&#xff0c;简化了springboot项目中使用mybatis进行持久化操作的配置和管理 2.org.projectlombok下的lombok&#xff1a;常用注解Data、NoArgsConstructor、AllA…

270.【华为OD机试真题】字符串拼接(深度优先搜索(DFS)-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-字符串拼接二.解题思路三.题解代码Python题解代…

如何在Ubuntu部署Emlog,并将本地博客发布至公网可远程访问

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

介绍C++加C++代码

C是一种高效的、通用的、支持多范式的编程语言&#xff0c;支持过程式编程、面向对象编程和泛型编程等多种编程范式。C的设计提供了低级别的存取权限&#xff0c;并且要求程序员管理所有的内存细节。C最初被设计为一种“带类的C”&#xff0c;但它在后来的发展中逐渐增加了更多…

2.20学习总结

1.【模板】单源最短路径&#xff08;弱化版&#xff09; 2.【模板】单源最短路径&#xff08;标准版&#xff09; 3.无线通讯网 4.子串简写 5.整数删除 6.拆地毯 【模板】单源最短路径&#xff08;标准版&#xff09;https://www.luogu.com.cn/problem/P4779 题目描述 给定一个…

Go 语言中,`rune(a)` 将 `a` 转换为 `rune` 类型

在 Go 语言中&#xff0c;rune(a) 将 a 转换为 rune 类型。这里的 a 可以是任何可以被转换为 Unicode 字符的类型&#xff0c;比如另一个 rune 或者一个 byte。 接着&#xff0c;当你用 int() 函数对其进行进一步转换&#xff1a;int(rune(a))&#xff0c;这会将 rune(a) 转换…

给图片添加图片水印

一、项目场景&#xff1a; react antd 4.x&#xff08;此版本没有watermark水印&#xff09;&#xff0c;需要将后端传递的图片添加图片水印 二、水印添加&#xff1a;&#xff08;此代码为修改好的&#xff09; import imgs from ./水印图片.png; // 引入水印图片...代码con…

Excel SUMPRODUCT函数用法(乘积求和,分组排序)

SUMPRODUCT函数是Excel中功能比较强大的一个函数&#xff0c;可以实现sum,count等函数的功能&#xff0c;也可以实现一些基础函数无法直接实现的功能&#xff0c;常用来进行分类汇总&#xff0c;分组排序等 SUMPRODUCT 函数基础 SUMPRODUCT函数先计算多个数组的元素之间的乘积…