RabbitMQ集群 - 普通集群搭建、宕机情况
文章目录
- RabbitMQ 普通集群
- 概述
- 集群搭建
- 数据准备
- 启动容器
- 宕机情况
RabbitMQ 普通集群
概述
1)普通模式中所有节点没有主从之分,所有节点的元数据(交换机、队列、绑定等)都是一致的.
例如只要有任意一个节点上面 新增交换机, 那么这个交换机的元数据也会被复制到其他节点上.
2)比较特殊的是队列,队列中的消息数据只保存在创建他的节点上,其他节点只保存元数据(队列名称、配置...) 和指针(指向创建该队列的节点).
例如 node1 创建 cyk.queue,那么 node2 只保存 队列的元数据 和 指向 node1 节点的指针,而 cyk.queue 中的消息,只会存在于 node1 节点中.

3)对于消息的传输如下:
假设有 node1、node2 节点,在 node1 中创建了 cyk.queue 队列.
- 此时有一个
生产者和 node2 建立连接,向 cyk.queue 队列发送数据:RabbitMQ 会根据 node2 中保存的 node1 的指针,把消息转发给 node1 节点,最后消息数据还是保存在 node1 中. - 此时有一个
消费者和 node2 建立连接,从 cyk.queue 队列中消费:RabbitMQ 会根据 node2 中保存的 node1 的指针,把消费消息的请求转发给 node1,然后 node1 将消息实体取出,并经过 node2 发送给 消费者.
4)存在的问题:
假设有 node1、node2 节点,在 node1 中创建了 cyk.queue 队列.
那么一旦 node1 宕机,那么 cyk.queue 中的消息也随之丢失,那么其他节点保存的 node1 指针也相当于失效,再想拿到消息,更是不可能了.
集群搭建
数据准备
1)先简单启动一个容器.
docker run -d --name mq \--restart=always \-e RABBITMQ_DEFAULT_USER=root \-e RABBITMQ_DEFAULT_PASS=1111 \-p 15672:15672 \-p 5672:5672 \rabbitmq:3.8-management
2)RabbitMQ 底层基于 Erlang 语言,默认支持集群模式. 在集群模式中,每个 RabbitMQ 节点使用一个称为 Erlang cookie 的共享密钥来实现相互通信.
要想是两个节点能相互通信,必须具有相同的共享密钥(这个密钥是可以自定义的).
通过以下命令获取 cookie 值:
docker exec -it mq cat /var/lib/rabbitmq/.erlang.cookie

Ps:可以不需要这个步骤,因为只要保证每个节点中保存的 .erlang.cookie 值相同即可
3)在 ~/ 目录下创建 .erlang.cookie 文件,用来保存 Erlang Cookie(将来挂载数据)
touch ~/.erlang.cookie
echo "FQXBTQJMJLRUGFPIECYG" > ~/.erlang.cookie
chmod 600 ~/.erlang.cookie
4)在 ~/ 目录下创建 rabbitmq.conf 文件,配置 RabbitMQ 集群各种参数,以及节点信息和端口(包括禁止默认的 guest 用户,指定 AMQP 端口 5672)
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
5)在 ~/mq_cluster 目录下创建三个目录,用来存放不同节点信息.
mkdir -p ~/mq_cluster/mq1
mkdir -p ~/mq_cluster/mq2
mkdir -p ~/mq_cluster/mq3
6)将 ~/rabbitmq.conf 和 ~/.erlang.cookie 文件复制到三个节点目录中
cp ~/rabbitmq.conf ~/mq_cluster/mq1
cp ~/rabbitmq.conf ~/mq_cluster/mq2
cp ~/rabbitmq.conf ~/mq_cluster/mq3cp ~/.erlang.cookie ~/mq_cluster/mq1
cp ~/.erlang.cookie ~/mq_cluster/mq2
cp ~/.erlang.cookie ~/mq_cluster/mq3
最后结构如下:

启动容器
1)创建网络,让集群中不同节点可以进行网络通信
docker network create mq-net
2)分别启动三个节点
docker run -d --net mq-net \
-v ~/mq_cluster/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ~/mq_cluster/mq1/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=1111 \
--name mq1 \
--hostname mq1 \
-p 5672:5672 \
-p 15672:15672 \
rabbitmq:3.8-managementdocker run -d --net mq-net \
-v ~/mq_cluster/mq2/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ~/mq_cluster/mq2/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=1111 \
--name mq2 \
--hostname mq2 \
-p 5673:5672 \
-p 15673:15672 \
rabbitmq:3.8-managementdocker run -d --net mq-net \
-v ~/mq_cluster/mq3/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ~/mq_cluster/mq3/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=1111 \
--name mq3 \
--hostname mq3 \
-p 5674:5672 \
-p 15674:15672 \
rabbitmq:3.8-management
3)打开 MQ 控制台,例如访问 mq1,就可以看到集群信息:

4)测试集群:
例如在 mq1 节点上添加 cyk.queue 的队列.

此时,访问 mq2 和 mq3 的控制台,也能看到这个队列.

至此集群搭建完成.
宕机情况
1)在 mq1 节点上创建一个 cyk.queue 队列,并发送一个消息,在其他节点上也可以看到同样效果.

2)此时,假设 mq1 节点宕机了(docker stop mq1),那么在 mq2 上可以看到在 mq1 上创建的 cyk.queue 队列的消息也随之丢失


3)mq1 节点宕机了,那么 mq2 节点也就无法取出 mq1 中未消费的消息实体.
- 如果 mq1 队列做了持久化,那么等到 node1 恢复了,就能进行消费. 但是在 mq1 恢复之前,其他节点不能创建 mq1 重点已创建的队列.
- 如果 mq1 队列没有持久化,消息也会丢失. 并且在 mq1 恢复之前,其他节点可以创建和 mq1 相同的队列.
相关文章:
RabbitMQ集群 - 普通集群搭建、宕机情况
文章目录 RabbitMQ 普通集群概述集群搭建数据准备启动容器宕机情况 RabbitMQ 普通集群 概述 1)普通模式中所有节点没有主从之分,所有节点的元数据(交换机、队列、绑定等)都是一致的. 例如只要有任意一个节点上面 新增交换机&…...
xssDOM型练习
文章目录 例1要求 例2代码解析方法 例3例4例5例6例7例8 例1 本题通过get接收并传递参数,所有参数不经过过滤直接放入h2标签里面。 要求 1.需要页面弹出1337 2.不能与用户交互 官方认为innerHTML中script标签不安全,所以将其禁用,但只禁用了…...
python中的gradio使用麦克风时报错
python中的gradio使用麦克风时报错 当运行至 import gradio as gr with gr.Blocks() as demo:with gr.Tab("microphone transcriber"):gr.Audio(source"microphone", type"numpy", streamingTrue)demo.queue()##访问链接 https://ip:1235/demo…...
Oracle(63)什么是临时表(Temporary Table)?
临时表(Temporary Table)是一种特殊类型的表,用于存储临时数据,这些数据在会话期间或事务期间是短暂的。临时表在不同的数据库系统中都有实现,但功能和特性可能有所不同。临时表通常用于存储中间计算结果、临时数据处理…...
《Techporters架构搭建》-Day06 国际化
什么是国际化? 国际化,也叫i18n,为什么叫i18n呢? "i18n"是国际化(internationalization)的缩写,数字18代表了国际化这个单词中间的字母数量。类似这样的缩写还有k8s(kube…...
Linux ACL 访问控制
今天给伙伴们分享一下Linux ACL 访问控制,希望看了有所收获。 我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步…...
hg transformers pipeline使用
什么是hg transformers pipeline? 在Hugging Face的transformers库中,pipeline是一个高级API,它提供了一种简便的方式来使用预训练模型进行各种NLP任务,比如情感分析、文本生成、翻译、问答等。通过pipeline,你可以在几行代码内…...
高性能内存对象缓存
Memcached概述 一套开源的高性能分布式内存对象缓存系统 所有的数据都存储在内存中 支持任意存储类型的数据 提高网站的访问速度 数据存储方式与数据过期方式 数据存储方式:Slab Allocation 按组分配内存,每次先分配一个Slab,相当于一个大小为1M的页&…...
文件上传-CMS文件上传分析
黑盒思路: 上传点抓包测试 个人用户中心是否存在文件上传功能后台管理系统是否存在文件上传功能字典目录扫描探针文件(eg:upload.php)构造地址字典目录扫描探针编辑器目录构造地址(编辑器目录一般是默认的)…...
云原生日志Loki
1. Loki简介 1.1 Loki介绍 Loki是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签…...
初阶数据结构之直接选择排序和快速排序
直接选择排序 1.在元素集合 array[i]–array[n-1] 中选择关键码最⼤(⼩)的数据元素 2.若它不是这组元素中的最后⼀个(第⼀个)元素,则将它与这组元素中的最后⼀个(第⼀个)元素 交换 3.在剩余的 array[i]–array[n-2](array[i1]–…...
Java语言程序设计——篇十三(4)
🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…...
低代码: 组件库测试之渲染和元素获取,触发事件,更新表单,验证事件以及异步请求
组件库测试步骤 渲染组件(怎样将一个组件渲染到测试用例里面) mount 和 shallowMount传递属性元素是否成功的显示 查找元素的不同写法get, getAllfind, findAllfindComponent 和 getComponent触发事件(是click也好,是input也好,让它触发对应的事件) trigger 方法观察测试界面…...
银河麒麟服务器操作系统Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤
银河麒麟服务器操作系统 Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤 一、准备工作1. 下载ISO镜像2. 制作安装介质3. 设置BIOS 二、安装过程1. 启动系统2. 选择安装语言3. 选择安装配置4. 配置root密码与创建用户5. 开始安装6. 重启系统7. 同意许可协议 三、系…...
2024年电赛H题全开源
当题目出来的的那一刻,看到了M0芯片,我们实验室只有一块板子,并且我没有接触过M0,电赛只准备了TI的MSP430f5529。但是我并没有放弃,决然的选择了H题。基本上将四问全做出来,可是测试由于使用了感为科技的寻…...
Docker:宿主机可以ping通外网,docker容器内无法ping通外网之解决方法
问题描述 1、宿主机可以ping外网,docker容器内无法ping外网 ping www.baidu.com 提示:unknown host baidu.com 2、宿主机可以wget下载,docker容器内无法wget下载 wget www.baidu.com 提示:unknown host baidu.com 解决方法 1、…...
bootchart抓Android系统启动各阶段性能数据
最近在做Android系统启动优化,首要任务是找到启动过程中各阶段耗时点,进而有针对性地进行优化。主要用bootchart抓开机数据,本文主要记录下工具的使用方法。 1.抓开机数据 adb root adb shell ‘touch /data/bootchart/enabled’ adb rebo…...
使用 Node.js 和 Express 框架通过网页访问GPIO和嵌入式 Linux 系统中使用 GSM/3G/4G 模块
点击上方"蓝字"关注我们 01、前言 想要快速开发嵌入式 Linux 网络应用,控制硬件 GPIO,从而使得用户能够远程控制和监控系统。 主要目的是向读者展示开发使用文件系统控制 GPIO 的 Node 代码、创建用户有好的界面、以及运行基于 Express 框架使用 AJAX 通客户端进…...
IT 行业的就业情况
当前,IT 行业的就业情况呈现出以下特点: 1. 需求持续增长:随着数字化转型的加速,各个行业对信息技术的依赖程度不断提高,推动了对 IT 人才的持续需求。特别是在云计算、大数据、人工智能、物联网等新兴领域ÿ…...
如何快速获取麒麟操作系统版本信息
如何快速获取麒麟操作系统版本信息 一、桌面版系统1. 使用 /etc/kylin-build 文件2. 使用 /etc/.kyinfo 文件 二、服务器版系统1. 使用 /etc/.productinfo 文件2. 使用 nkvers 命令3. 使用 /etc/kylin-release 文件 三、总结 💖The Begin💖点点关注&…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
