部署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 地址。
  • 时间同步:使用 ntpchrony 服务同步时间。
  • Erlang:RabbitMQ 依赖 Erlang。确保所有节点安装相同版本的 Erlang。

一、环境准备及主机名设置

RabbitMQ 使用主机名和 Erlang 的 nodename 区分节点,因此每个节点的主机名必须唯一。

  1. 修改主机名
    在每一台主机上执行以下命令,以设置相应的主机名:

    # 以 rabbit1 为例
    sudo hostnamectl set-hostname rabbit1
    
  2. 修改 /etc/hosts 文件
    在每台机器的 /etc/hosts 中添加集群中所有节点的主机名与 IP 对应关系,示例如下(所有机器需要保持一致):

    192.168.1.101  rabbit1
    192.168.1.102  rabbit2
    192.168.1.103  rabbit3
    

    修改完成后,可以使用 ping rabbit2ping rabbit3 等来测试是否能正常通过主机名访问。

  3. 更新系统软件包索引
    在每台机器上执行:

    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)来访问可视化管理界面,并创建管理员账号。

  1. 启用管理插件
    在每台 RabbitMQ 节点上执行:

    sudo rabbitmq-plugins enable rabbitmq_management
    

    启用之后,RabbitMQ 通常会在本地 15672 端口提供 HTTP 管理界面。例如,通过 http://192.168.1.101:15672 可以访问 rabbit1 的管理页面。

  2. 创建管理员账号
    在每台节点上都可以执行(若已存在相同名称则会提示):

    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 文件中。

  1. 选择一台节点作为 Cookie 源
    通常以 rabbit1 为源。

  2. 复制 Cookie 到其他节点
    rabbit1 上查看 Cookie:

    sudo cat /var/lib/rabbitmq/.erlang.cookie
    

    将内容复制,然后分别在 rabbit2rabbit3 上执行:

    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 作为主节点,先将 rabbit2rabbit3 加入到 rabbit1 的集群中。

  1. rabbit2 上执行:

    sudo rabbitmqctl stop_app
    sudo rabbitmqctl join_cluster rabbit@rabbit1
    sudo rabbitmqctl start_app
    
    • rabbit@rabbit1 表示主机名是 rabbit1,Erlang 内部节点名称是 rabbit
    • 成功后会输出一串信息,表明已成功加入 rabbit1 所在的集群。
  2. rabbit3 上执行:

    sudo rabbitmqctl stop_app
    sudo rabbitmqctl join_cluster rabbit@rabbit1
    sudo rabbitmqctl start_app
    
  3. 查看集群状态
    可以在任意节点上运行以下命令查看集群状态:

    sudo rabbitmqctl cluster_status
    

    若一切顺利,会看到类似如下输出,其中 running_nodes 中包含 rabbit@rabbit1rabbit@rabbit2rabbit@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 表示将策略应用到队列。

七、验证集群

  1. 使用 rabbitmqctl cluster_status 命令查看集群健康状态

    sudo rabbitmqctl cluster_status
    

    确认三个节点都在 running_nodes 列表里。

  2. 访问管理界面进行验证
    在浏览器中分别访问三台机器的 http://<节点IP或主机名>:15672,使用前面创建的账号(如 admin)进行登录,查看集群信息、节点信息、队列信息等。

  3. 测试队列高可用

    • 连接到其中一个节点,创建一个队列并发送消息。
    • 关闭该节点的 RabbitMQ 服务或者网络,使用另一个节点进行消费,验证消息是否正常可消费、数据是否依旧存在。

若一切无误,则说明 RabbitMQ 集群部署成功并具备了高可用能力。


八、安装过程中遇到的问题

1. 用户访问被拒绝

以下日志行表明用户 guest 无法从远程登录管理界面:

HTTP access denied: user 'guest' - User can only log in via localhost

原因:RabbitMQ 默认配置限制 guest 用户只能从 localhost 登录。

解决方法

  1. 创建新用户
    为远程登录创建一个新的管理员用户:
    sudo rabbitmqctl add_user myadmin mypassword
    sudo rabbitmqctl set_user_tags myadmin administrator
    sudo rabbitmqctl set_permissions -p / myadmin ".*" ".*" ".*"
    
    替换 myadminmypassword 为你自己的用户名和密码。

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 语法,主要用于复杂的配置需求,例如队列策略、插件配置等。

默认配置文件可能不存在,可以手动创建:

  1. 创建配置文件
    sudo nano /etc/rabbitmq/rabbitmq.conf
    
  2. 添加基础配置
    示例内容:
    ## Basic configuration
    listeners.tcp.default = 5672
    management.listener.port = 15672
    management.listener.ip = 0.0.0.0
    
  3. 保存文件并重启服务
    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 仓库安装

  1. 添加一个兼容的 PPA:
    sudo add-apt-repository ppa:rabbitmq/rabbitmq-erlang
    
  2. 更新包列表并安装 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 默认端口

根据节点分别设置:

  • node1NODENAMErabbit@node1
  • node2NODENAMErabbit@node2
  • node3NODENAMErabbit@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 等容器化编排方案,以实现更灵活的集群管理与更高的可用性。同时,也可根据业务需求针对镜像队列策略进行更细化的调优与分配。

在这里插入图片描述

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

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

相关文章

【Linux】之【Bug】VMware 虚拟机开机 一直卡在黑屏左上角下划线闪烁界面

解决 参考&#xff1a; 解决Ubuntu20.04 开机黑屏光标闪烁进不去系统 Centos根目录100%解决思路 当前界面 ctrlaltf3-f6 暂时进入终端界面 df -h 查看发现根目录 磁盘空间已满 执行命令 查看当前目录占用内存明细 sudo du -h -x --max-depth1清理无用的大内存文件 或者安装…

webflux集成langchain4j基础版

伴随着大模型应用的兴起&#xff0c;webflux逐渐引起关注。为了以java的方式运行AI应用&#xff0c;让我们一起学习webflux集成langchain4j吧。 1. 项目依赖 首先&#xff0c;你需要在 pom.xml 中添加必要的依赖&#xff1a; <dependencies><!-- Spring WebFlux --…

使用GitLink个人建站服务部署Allure在线测试报告

更多技术文章&#xff0c;访问软件测试社区 文章目录 &#x1f680;前言&#x1f511;开通GitLink个人建站服务1. 前提条件2. 登录GitLink平台&#xff08;https://www.gitlink.org.cn/login&#xff09;3. 进入设置>个人建站>我的站点4. 新建站点5. 去仓部进行部署6. 安…

go数组的声明和初始化

1.数组简介 数组是可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;在go中&#xff0c;数组是值类型。数组的长度也是数组类型的一部分&#xff0c;所以[2]int和[3]int属于不同的数据类型。 2.数组的长度也是类型的一部分 var arr1 [2]intvar arr2 [3]intfmt.P…

四款GIS工具箱软件解析:满足企业多样化空间数据需求

概述 随着地理信息系统&#xff08;GIS&#xff09;在城市规划、环境监测、资源管理等领域的广泛应用&#xff0c;各种GIS工具箱软件不断涌现&#xff0c;为用户提供了强大的数据处理、空间分析和地图制图功能。本文将为大家介绍4款GIS工具箱软件&#xff0c;这些软件各具特色…

VirtualBox虚拟机安装Mac OS启动后的系统设置

VirtualBox虚拟机安装Mac OS一直没装成功&#xff0c;本来想要放弃的&#xff0c;后来想着再试一次&#xff0c;于是在关机的情况&#xff0c;执行那几句设置&#xff1a; cd "E:\Program Files\Oracle\VirtualBox\" VBoxManage.exe modifyvm "MacOS" --c…

[力扣每日一练]关于所有不同域名的查找

一、题目要求&#xff1a; 表&#xff1a;Emails---------------------- | Column Name | Type | ---------------------- | id | int | | email | varchar | ---------------------- id 是这张表的主键&#xff08;有不同值的列&#xff09;。 这张表的…

blender看不到导入的模型

参考&#xff1a;blender 快捷键 常见问题_blender材质预览快捷键-CSDN博客 方法一&#xff1a;视图-裁剪起点&#xff0c;设置一个很大的值 方法二&#xff1a;选中所有对象&#xff0c;对齐视图-视图对齐活动项-选择一个视图

HarmonyOS Next~鸿蒙系统ArkCompiler跨平台编译技术的革新实践

HarmonyOS Next~鸿蒙系统ArkCompiler跨平台编译技术的革新实践 引言 在万物互联时代&#xff0c;操作系统对编译技术的需求已从单纯的代码转换演变为跨设备协同、高效资源调度与极致性能优化的综合挑战。华为鸿蒙系统&#xff08;HarmonyOS&#xff09;自主研发的ArkCompiler…

Kanna 与 Swift:结合使用提升网络请求效率

Kanna 是一个基于 Swift 的轻量级、高性能的 XML/HTML 解析库&#xff0c;它能够帮助开发者快速解析和处理网络返回的 HTML 或 XML 数据。通过结合 Kanna 和 Swift 的网络请求功能&#xff0c;我们可以构建更加高效、灵活的网络交互模块。本文将详细介绍如何在 Swift 中使用 Ka…

《大语言模型的原理发展与应用》:此文为AI自动生成

《大语言模型的原理发展与应用》&#xff1a;此文为AI自动生成 一、引言&#xff1a;大语言模型&#xff0c;AI 时代的 “新引擎” 在当今数字化浪潮中&#xff0c;大语言模型宛如一颗璀璨的明星&#xff0c;照亮了人工智能发展的道路&#xff0c;成为推动各领域变革的核心驱…

RabbitMQ消息队列 面试专题

RabbitMQ消息队列 面试专题 RabbitMQ的实现原理为什么需要消息队列常见消息队列比较如何保证消息不丢失如何防止消息重复消费如何保证消息的有序性如何处理消息堆积 RabbitMQ的实现原理 RabbitMQ 是一个基于 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09; 协…

【Hudi-SQL DDL创建表语法】

CREATE TABLE 命令功能 CREATE TABLE命令通过指定带有表属性的字段列表来创建Hudi Table。 命令格式 CREATE TABLE [ IF NOT EXISTS] [database_name.]table_name[ (columnTypeList)]USING hudi[ COMMENT table_comment ][ LOCATION location_path ][ OPTIONS (options_lis…

蓝桥杯备考:动态规划路径类DP之矩阵的最小路径和

如题&#xff0c;要求左上角到右下角的最短路径&#xff0c;我们还是老样子按顺序做 step1:确定状态表示 f[i][j]表示(1,1)到(i,j)的最短距离 step2 :推导状态表达方程 step3:确定填表顺序&#xff0c;应该是从上到下&#xff0c;从左到右 step4:初始化 step5 找结果&#…

【Maven】基于IDEA学习 Maven依赖 与 工程继承、聚合关系

文章目录 一、基于IDEA 进行Maven依赖管理1. 依赖管理概念2. Maven工程核心信息配置和解读&#xff08;GAVP&#xff09;3. Maven工程依赖管理配置依赖管理和依赖添加依赖版本统一提取和维护 4. 依赖范围5. Maven工程依赖下载失败错误解决6. Maven工程Build构建配置指定打包命名…

微信小程序注册组件

在微信小程序中注册组件分为自定义组件的创建和全局/局部注册&#xff0c;下面为你详细介绍具体步骤和示例。 自定义组件的创建 自定义组件由四个文件组成&#xff0c;分别是 .js&#xff08;脚本文件&#xff09;、.json&#xff08;配置文件&#xff09;、.wxml&#xff08…

贪心算法二

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…

react中的fiber和初次渲染

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

Wireshark的OSPF报文抓包和分析(单区域ospf实验)

一、OSPF的5种数据包和7种状态机制 数据包 Hello&#xff1a;发现、建立邻居&#xff08;邻接&#xff09;关系、维持、周期保活&#xff1b;存在全网唯一的RID&#xff0c;使用IP地址表示 DBD&#xff1a;本地的数据库的目录&#xff08;摘要&#xff09;&#xff0c;LSDB的…

前后分离文件上传案例,前端HTML,后端Net6开发的webapi(完整源代码)下载

文件上传功能在项目开发中非常实用&#xff0c;本案例前端用HTML页面的form表单实现&#xff0c;后端用Net6实现。 前后分离文件上传案例&#xff0c;前端HTML&#xff0c;后端Net6&#xff08;完整源代码&#xff09; 下载链接https://download.csdn.net/download/luckyext/9…