部署RabbitMQ集群详细教程
部署RabbitMQ集群详细教程
下面是一份在 Ubuntu 环境下部署 RabbitMQ 集群的详细步骤说明,涉及主机名设置、Erlang & RabbitMQ 安装、管理插件启用、集群通信 Cookie 配置、节点加入集群、镜像队列策略设置以及集群验证等。为了演示方便,以下示例假设有三台主机,分别命名为 rabbit1
, rabbit2
, rabbit3
,IP 地址分别为 192.168.1.101
, 192.168.1.102
, 192.168.1.103
。请根据自己的实际环境进行修改。
环境准备
- 操作系统:确保所有节点运行相同版本的操作系统(Linux 是最常见的选择)。
- 主机名:为每个节点配置唯一的主机名,确保可以通过 DNS 或
/etc/hosts
文件解析到 IP 地址。 - 时间同步:使用
ntp
或chrony
服务同步时间。 - Erlang:RabbitMQ 依赖 Erlang。确保所有节点安装相同版本的 Erlang。
一、环境准备及主机名设置
RabbitMQ 使用主机名和 Erlang 的 nodename
区分节点,因此每个节点的主机名必须唯一。
-
修改主机名
在每一台主机上执行以下命令,以设置相应的主机名:# 以 rabbit1 为例 sudo hostnamectl set-hostname rabbit1
-
修改 /etc/hosts 文件
在每台机器的/etc/hosts
中添加集群中所有节点的主机名与 IP 对应关系,示例如下(所有机器需要保持一致):192.168.1.101 rabbit1 192.168.1.102 rabbit2 192.168.1.103 rabbit3
修改完成后,可以使用
ping rabbit2
、ping rabbit3
等来测试是否能正常通过主机名访问。 -
更新系统软件包索引
在每台机器上执行:sudo apt-get update
二、安装 Erlang 和 RabbitMQ
RabbitMQ 依赖 Erlang 环境,所以我们需要先安装 Erlang,然后再安装 RabbitMQ。这里演示使用 Ubuntu 自带源或 RabbitMQ 官方源均可。
2.1 使用 Ubuntu 源(版本可能不是最新)
sudo apt-get install -y erlang
sudo apt-get install -y rabbitmq-server
2.2 启动并查看状态
安装完成后,RabbitMQ 会被自动启动并开机自启动。可以执行以下命令查看状态:
sudo systemctl status rabbitmq-server
如正常启动,会显示 active (running)
,后续操作建议在每台节点上都保持服务处于启动状态。
三、启用管理插件并创建管理员账号
RabbitMQ 集群部署完成后,我们通常需要启用管理插件(Management Plugin)来访问可视化管理界面,并创建管理员账号。
-
启用管理插件
在每台 RabbitMQ 节点上执行:sudo rabbitmq-plugins enable rabbitmq_management
启用之后,RabbitMQ 通常会在本地
15672
端口提供 HTTP 管理界面。例如,通过http://192.168.1.101:15672
可以访问rabbit1
的管理页面。 -
创建管理员账号
在每台节点上都可以执行(若已存在相同名称则会提示):sudo rabbitmqctl add_user admin StrongPassword sudo rabbitmqctl set_user_tags admin administrator # 设置该用户在 "/" 虚拟主机下的权限,授予全部读写权限 sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
注意:请使用更强的密码进行生产环境部署,并按照需分配合适的权限或虚拟主机。
不需要每台机器都创建用户,节点接入主节点后,用户可以同步使用。
四、集群通信 Cookie 同步
RabbitMQ 集群依赖 Erlang Cookie 来进行节点间的验证与通信。在同一个集群中的所有节点必须使用相同的 Cookie。该 Cookie 默认保存在 /var/lib/rabbitmq/.erlang.cookie
文件中。
-
选择一台节点作为 Cookie 源
通常以rabbit1
为源。 -
复制 Cookie 到其他节点
在rabbit1
上查看 Cookie:sudo cat /var/lib/rabbitmq/.erlang.cookie
将内容复制,然后分别在
rabbit2
、rabbit3
上执行:sudo systemctl stop rabbitmq-server echo "上一步复制的Cookie字符串" | sudo tee /var/lib/rabbitmq/.erlang.cookie sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie sudo systemctl start rabbitmq-server
确保三台节点的 Cookie 完全一致,并且权限和拥有者正确,才能保证后续正常组建集群。
五、节点加入集群
下面以 rabbit1
作为主节点,先将 rabbit2
、rabbit3
加入到 rabbit1
的集群中。
-
在
rabbit2
上执行:sudo rabbitmqctl stop_app sudo rabbitmqctl join_cluster rabbit@rabbit1 sudo rabbitmqctl start_app
rabbit@rabbit1
表示主机名是rabbit1
,Erlang 内部节点名称是rabbit
。- 成功后会输出一串信息,表明已成功加入
rabbit1
所在的集群。
-
在
rabbit3
上执行:sudo rabbitmqctl stop_app sudo rabbitmqctl join_cluster rabbit@rabbit1 sudo rabbitmqctl start_app
-
查看集群状态
可以在任意节点上运行以下命令查看集群状态:sudo rabbitmqctl cluster_status
若一切顺利,会看到类似如下输出,其中
running_nodes
中包含rabbit@rabbit1
、rabbit@rabbit2
、rabbit@rabbit3
:Cluster status of node rabbit@rabbit1 ... Basics Cluster name: rabbit@rabbit1 ...Running nodes are: rabbit@rabbit1 rabbit@rabbit2 rabbit@rabbit3 ...
六、设置镜像队列(HA)策略
为保证队列数据在集群节点之间进行复制,我们需要设置 镜像队列策略。这里示例设置所有队列自动镜像到所有节点上,并自动同步。
sudo rabbitmqctl set_policy ha-all "^.*" '{"ha-mode":"all","ha-sync-mode":"automatic"}' --priority 0 --apply-to queues
ha-mode: all
表示所有队列将镜像到集群中的所有节点。ha-sync-mode: automatic
表示当新的节点加入时,会自动同步队列数据。^.*
是正则表达式,表示对名称匹配任意队列生效;如需针对特定队列或前缀,可自行修改。--apply-to queues
表示将策略应用到队列。
七、验证集群
-
使用
rabbitmqctl cluster_status
命令查看集群健康状态sudo rabbitmqctl cluster_status
确认三个节点都在
running_nodes
列表里。 -
访问管理界面进行验证
在浏览器中分别访问三台机器的http://<节点IP或主机名>:15672
,使用前面创建的账号(如admin
)进行登录,查看集群信息、节点信息、队列信息等。 -
测试队列高可用
- 连接到其中一个节点,创建一个队列并发送消息。
- 关闭该节点的 RabbitMQ 服务或者网络,使用另一个节点进行消费,验证消息是否正常可消费、数据是否依旧存在。
若一切无误,则说明 RabbitMQ 集群部署成功并具备了高可用能力。
八、安装过程中遇到的问题
1. 用户访问被拒绝
以下日志行表明用户 guest
无法从远程登录管理界面:
HTTP access denied: user 'guest' - User can only log in via localhost
原因:RabbitMQ 默认配置限制 guest
用户只能从 localhost
登录。
解决方法
- 创建新用户
为远程登录创建一个新的管理员用户:
替换sudo rabbitmqctl add_user myadmin mypassword sudo rabbitmqctl set_user_tags myadmin administrator sudo rabbitmqctl set_permissions -p / myadmin ".*" ".*" ".*"
myadmin
和mypassword
为你自己的用户名和密码。
2. 安装日志查看
查看 RabbitMQ 日志文件,定位配置文件未加载的原因:
sudo tail -f /var/log/rabbitmq/rabbit@$(hostname).log
3. 检查监听端口
使用以下命令确认 RabbitMQ 是否在配置的端口上运行:
sudo netstat -tlnp | grep beam
4. 如何创建 RabbitMQ 配置文件
rabbitmq.conf 位于 /etc/rabbitmq/rabbitmq.conf,这是 RabbitMQ 的主配置文件,采用 INI 格式,用来定义更高级别的功能,如集群、插件、TLS、虚拟主机等。
advanced.config 位于 /etc/rabbitmq/advanced.config,这是 RabbitMQ 的高级配置文件,采用 Erlang 的 term 语法,主要用于复杂的配置需求,例如队列策略、插件配置等。
默认配置文件可能不存在,可以手动创建:
- 创建配置文件
sudo nano /etc/rabbitmq/rabbitmq.conf
- 添加基础配置
示例内容:## Basic configuration listeners.tcp.default = 5672 management.listener.port = 15672 management.listener.ip = 0.0.0.0
- 保存文件并重启服务
sudo systemctl restart rabbitmq-server
5. Erlang 安装可能会失败,另一种安装方式
这种安装方式会安装最新版本的Erlang,需要注意RabbitMQ版本和Erlang版本的适配
检查 Erlang 版本
打开终端并运行以下命令:
erl -version
或者:
erl
如果 Erlang 已安装,命令会返回版本号或进入交互式 Erlang shell:
Erlang/OTP 25 [erts-13.1.5] ...
按下 Ctrl+C
后,再按 a
退出 shell。
*使用 ppa
仓库安装
- 添加一个兼容的 PPA:
sudo add-apt-repository ppa:rabbitmq/rabbitmq-erlang
- 更新包列表并安装 Erlang:
sudo apt-get update sudo apt-get install -y erlang
6. 配置RabbitMQ 节点名
RabbitMQ 的节点名通常以 rabbit@<主机名>
的形式表示。你可以通过配置 rabbitmq-env.conf
文件来设置节点名和监听地址。
编辑环境配置文件
在每个节点上编辑 /etc/rabbitmq/rabbitmq-env.conf
文件:
sudo nano /etc/rabbitmq/rabbitmq-env.conf
内容如下:
NODENAME=rabbit@node1 # 当前节点名称,需唯一
NODE_IP_ADDRESS=0.0.0.0 # 监听所有网络接口
NODE_PORT=5672 # AMQP 默认端口
根据节点分别设置:
node1
的NODENAME
为rabbit@node1
node2
的NODENAME
为rabbit@node2
node3
的NODENAME
为rabbit@node3
7. 安装指定版本的RabbitMQ
sudo apt-get install -y rabbitmq-server
这个命令安装的rabbitmq
版本可能不是最新的,可能会和Erlang版本不适配。
关于RabbitMQ和Erlang的版本适配,详情需要参考:
https://www.rabbitmq.com/docs/which-erlang
这里介绍另一种指定版本的安装方式。官方文档参考:
https://www.rabbitmq.com/docs/install-debian#manual-installation
执行脚本
# sync package metadata
sudo apt-get update
# install dependencies manually
sudo apt-get -y install logrotate init-system-helpers adduser# download the package
sudo apt-get -y install wget
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v4.0.5/rabbitmq-server_4.0.5-1_all.deb# install the package with dpkg
sudo dpkg -i rabbitmq-server_4.0.5-1_all.debrm rabbitmq-server_4.0.5-1_all.deb
总结
在实际生产环境中,建议配合负载均衡(如 HAProxy、Nginx)或 Kubernetes 等容器化编排方案,以实现更灵活的集群管理与更高的可用性。同时,也可根据业务需求针对镜像队列策略进行更细化的调优与分配。
相关文章:

部署RabbitMQ集群详细教程
部署RabbitMQ集群详细教程 下面是一份在 Ubuntu 环境下部署 RabbitMQ 集群的详细步骤说明,涉及主机名设置、Erlang & RabbitMQ 安装、管理插件启用、集群通信 Cookie 配置、节点加入集群、镜像队列策略设置以及集群验证等。为了演示方便,以下示例假…...

20250306JIRA添加企业微信邮箱通知
文章目录 一,参考链接如下二,补充内容1,登录企业邮箱2,设置密码3,设置收发信设置 一,参考链接如下 参考链接:https://blog.csdn.net/icett/article/details/142520823 二,补充内容…...

代码随想录算法训练营第五十七天 | 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 104.建造最大岛屿
101. 孤岛的总面积 题目链接:KamaCoder 文档讲解:代码随想录 状态:AC Java代码: import java.util.*;class Main {static int count 0;static int res 0;static boolean island true;public static int[][] dir new int[][]{…...

llamafactory大模型微调教程(周易大模型案例)
1.环境说明 操作系统:ubuntu 20 基础模型:Qwen2.5-1.5B-Instruct 工具:llamafactory GPU:四张4090 2、环境部署 2.1 下载基础模型 # 1、下载 modelscope pip install modelscope#2、模型下载 cd /data/ cat >> download…...

excel 斜向拆分单元格
右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后,你可以开始输入文字。 需要注意的是,文字并不会自动分成上下两行。 为了达到你期望的效果,你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…...

【JAVA架构师成长之路】【JVM实战】第2集:生产环境内存飙高排查实战
课程标题:生产环境内存飙高排查实战——从堆转储到代码修复的15分钟指南 目标:掌握内存泄漏与OOM问题的系统性排查方法,快速定位代码或配置缺陷 0-1分钟:问题引入与核心现象 线上服务内存持续增长,触发频繁Full GC甚至OOM(OutOfMemoryError),导致服务崩溃。常见诱因:…...

MATLAB实现遗传算法优化风电_光伏_光热_储热优化
1. 问题定义 目标:最小化输出负荷与需求负荷的偏差平方和。决策变量:每个时间步长的风电、光伏、光热和储热输出功率。约束条件: 风电、光伏、光热的输出功率不得超过其最大容量。储热系统的输出功率(充放电)不得超过…...

JCRQ1河马算法+四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测
JCRQ1河马算法四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-GRU-Attention、CNN-GRU-Attent…...

react中的fiber和初次渲染
源码中定义了不同类型节点的枚举值 组件类型 文本节点HTML标签节点函数组件类组件等等 src/react/packages/react-reconciler/src/ReactWorkTags.js export const FunctionComponent 0; export const ClassComponent 1; export const IndeterminateComponent 2; // Befo…...

LLM 大模型基础认知篇
目录 1、基本概述 2、大模型工作原理 3、关键知识点 (1)RAG 知识库 (2)蒸馏 (3)微调 (4)智能体 1、基本概述 大型语言模型(Large Language Model, LLM)…...

leetcode700-二叉搜索树中的搜索
leetcode 700 思路 我们需要先了解一下二叉搜索树的特性: 左子树的所有节点值 < 当前节点的值。右子树的所有节点值 > 当前节点的值。这个特性适用于树中的每个节点 那么根据这个特性,我们可以通过根节点的值和目标值的大小来判断后序的走向&…...

《MySQL三大核心日志解析:Undo Log/Redo Log/Bin Log对比与实践指南》
MySQL三大核心日志解析:Undo Log/Redo Log/Bin Log对比与实践指南 一、核心日志全景概览 在MySQL数据库体系中,Undo Log、Redo Log和Bin Log构成了事务处理和数据安全的三大基石。这三大日志各司其职,协同保障了数据库的ACID特性与高可用架…...

java中实体类常见的设计模式
实体类常见的设计模式 1. Set 链式编程 在实体类中实现链式调用通常是指让 setter 方法返回当前对象实例(this),从而允许连续调用多个 setter 方法设置属性值。这种方式可以使代码更加简洁和直观。 例如实体类为: public clas…...

【够用就好006】如何从零开发游戏上架steam面向AI编程的godot独立游戏制作实录001流程
记录工作实践 这是全新的系列,一直有个游戏制作梦 感谢AI时代,让这一切变得可行 长欢迎共同见证,期更新,欢迎保持关注,待到游戏上架那一天,一起玩 面向AI编程的godot独立游戏制作流程实录001 本期是第…...

发行思考:全球热销榜的频繁变动
几点杂感: 1、单机游戏销量与在线人数的衰退是剧烈的,有明显的周期性,而在线游戏则稳定很多。 如去年的某明星游戏,最高200多万在线,如今在线人数是48名,3万多。 而近期热门的是MH,在线人数8…...

docker目录挂载与卷映射的区别
在 Docker 中,目录挂载(Bind Mount)和卷映射(Volume Mount)的命令语法差异主要体现在路径格式上,具体表现为是否以斜杠(/)开头。以下是两者的核心区别及使用场景的总结: …...

`label` 标签的 `for` 属性详解
一、基本概念 label 标签的 for 属性用于将标签与表单控件(如 input、select 等)绑定,其值需与目标元素的 id 完全匹配。这种关联允许用户点击标签时触发控件交互(如聚焦输入框或切换复选框),提升操作便捷…...

公开笔记:自然语言处理(NLP)中文文本预处理主流方法
在自然语言处理(NLP)领域,将中文文本转化为数字的主流方法主要集中在预训练语言模型和子词编码技术上。这些方法能够更好地捕捉语义信息,并且在各种NLP任务中表现出色。以下是目前主流的文本编码方法: 1. 基于预训练语…...

【一个月备战蓝桥算法】递归与递推
字典序 在刷题和计算机科学领域,字典序(Lexicographical order)也称为词典序、字典顺序、字母序,是一种对序列元素进行排序的方式,它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序: …...

算法策略深度解析与实战应用
一、算法策略的本质与价值 算法策略是计算机科学的灵魂,它决定了问题解决的效率与质量。优秀的算法设计者就像战场上的指挥官,需要根据地形(问题特征)选择最佳战术(算法策略)。本文将深入剖析五大核心算法…...

【LeetCode 热题 100】3. 无重复字符的最长子串 | python 【中等】
美美超过管解 题目: 3. 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 注…...

计算机网络(1) 网络通信基础,协议介绍,通信框架
网络结构模式 C/S-----客户端和服务器 B/S -----浏览器服务器 MAC地址 每一个网卡都拥有独一无二的48位串行号,也即MAC地址,也叫做物理地址、硬件地址或者是局域网地址 MAC地址表示为12个16进制数 如00-16-EA-AE-3C-40 (每一个数可以用四个…...

在 Docker 中,无法直接将外部多个端口映射到容器内部的同一个端口
Docker 的端口映射是一对一的,即一个外部端口只能映射到容器内部的一个端口。 1. 为什么不能多对一映射? 端口冲突: 如果外部多个端口映射到容器内部的同一个端口,Docker 无法区分外部请求应该转发到哪个内部端口,会…...

计算机网络开发(2)TCP\UDP区别、TCP通信框架、服务端客户端通信实例
TCP与UDP区别 UDP:用户数据报协议,面向无连接,可以单播,多播,广播, 面向数据报,不可靠TCP:传输控制协议,面向连接的,可靠的,基于字节流ÿ…...

ubuntu打包 qt 程序,不用每次都用linuxdeployqt打包
用linuxdeployqt打包太麻烦,每次程序编译都要用linuxdeployqt打包一次,而且每次都要很长时间,通过研究得出一个新的打包方法 1.用用linuxdeployqt得出依赖的库文件(只要没有增加新模块,只要用一次就可以) …...

【Python项目】基于深度学习的车辆特征分析系统
【Python项目】基于深度学习的车辆特征分析系统 技术简介:采用Python技术、MySQL数据库、卷积神经网络(CNN)等实现。 系统简介:该系统基于深度学习技术,特别是卷积神经网络(CNN),用…...

C++(初阶)(二)——类和对象
类和对象 类和对象类的定义格式访问限定符类域 实例化实例化概念内存对齐 this指针 类的定义 类(Class)是一种用于创建对象的蓝图或模板。它定义了对象(变量)的属性(数据)和方法(行为ÿ…...

JS—组成:2分钟掌握什么是ECMAScript操作,什么是DOM操作,什么是BOM操作
个人博客:haichenyi.com。感谢关注 1. 目录 1–目录2–组成3–内置对象 2. 组成 一直都在说JS,JS,到底啥是JS有了解过吗?JS由哪几部分组成的呢? 定义: JavaScript是一种轻量级、解释型或即时编译型的编程语…...

ArcGIS操作:10 投影坐标系转地理坐标系
应用情景:在计算shp面质心坐标的时,由于需要的坐标是经纬度,所以需要将投影坐标系转化为地理坐标系 1、打开工具箱 2、右侧:数据管理工具 → 投影和变换 → 要素 → 投影 3、选择投影的数据、输出路径、地理坐标系,点…...

NVIDIA Jetson Nano的国产替代,基于算能BM1684X+FPGA+AI算力盒子,支持deepseek边缘部署
NVIDIA Jetson Nano的国产替代,基于算能BM1684X的AI算力盒子,支持deepseek边缘部署 另外,还提供BM1684XFPGAAI的解决方案。 核心板基于Sophon SG2300X SoC(也叫BM1684X)打造 带有8核ARM Cortex-A53 2.3GHz,…...