部署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.rhkb.cn/news/29360.html

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

相关文章

三维数据可视化与表面重建:Marching Cubes算法的原理与应用

1. 引言 随着现代医学影像技术的飞速发展&#xff0c;三维数据的可视化与重建已成为医学研究、临床诊断和手术规划的重要工具。在众多三维重建算法中&#xff0c;Marching Cubes算法因其高效、稳定的特性成为从离散数据场中提取等值面的经典方法。本报告将深入探讨Marching Cu…

IDEA 2024.1.7 Java EE 无框架配置servlet

1、创建一个目录&#xff08;文件夹&#xff09;lib来放置我们的库 2、将tomcat目录下的lib文件夹中的servlet-api.jar文件复制到刚创建的lib文件夹下。 3、把刚才复制到lib下的servlet-api.jar添加为库 4、在src下新建一个package&#xff1a;com.demo&#xff0c;然后创…

【文生图】windows 部署stable-diffusion-webui

windows 部署stable-diffusion-webui AUTOMATIC1111 stable-diffusion-webui Detailed feature showcase with images: 带图片的详细功能展示: Original txt2img and img2img modes 原始的 txt2img 和 img2img 模式 One click install and run script (but you still must i…

【TCP/IP协议栈】【传输层】端口号、套接字、多路复用/分解、网络字节序

参考资料&#xff1a; 前言&#xff1a; 总结&#xff1a; 【计算机网络】套接字&#xff08;应用层和传输层之间的接口&#xff09; 套接字是一个通用的通信接口抽象不仅限于TCP/IP协议族作为应用层和传输层之间的桥梁支持多种通信方式和协议族 套接字定义 在 TCP 或者 UDP…

【AI大模型】DeepSeek + Kimi 高效制作PPT实战详解

目录 一、前言 二、传统 PPT 制作问题 2.1 传统方式制作 PPT 2.2 AI 大模型辅助制作 PPT 2.3 适用场景对比分析 2.4 最佳实践与推荐 三、DeepSeek Kimi 高效制作PPT操作实践 3.1 Kimi 简介 3.2 DeepSeek Kimi 制作PPT优势 3.2.1 DeepSeek 优势 3.2.2 Kimi 制作PPT优…

【哇! C++】类和对象(三) - 构造函数和析构函数

目录 一、构造函数 1.1 构造函数的引入 1.2 构造函数的定义和语法 1.2.1 无参构造函数&#xff1a; 1.2.2 带参构造函数 1.3 构造函数的特性 1.4 默认构造函数 二、析构函数 2.1 析构函数的概念 2.2 特性 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中…

基于RapidOCR与DeepSeek的智能表格转换技术实践

基于RapidOCR与DeepSeek的智能表格转换技术实践 一、技术背景与需求场景 在金融分析、数据报表处理等领域&#xff0c;存在大量图片格式的表格数据需要结构化处理。本文介绍基于开源RapidOCR表格识别与DeepSeek大模型的智能转换方案&#xff0c;实现以下典型场景&#xff1a; …

字节跳动AI原生编程工具Trae和百度“三大开发神器”AgentBuilder、AppBuilder、ModelBuilder的区别是?

字节跳动AI编程工具Trae与百度"三大开发神器"&#xff08;AgentBuilder、AppBuilder、ModelBuilder&#xff09;在定位、功能架构和技术路线上存在显著差异&#xff0c;具体区别如下&#xff1a; 一、核心定位差异 Trae&#xff1a;AI原生集成开发环境&#xff08;AI…

docker:Dockerfile案例之自定义centos7镜像

1 案例需求 自定义centos7镜像。要求&#xff1a; 默认登录路径为 /usr可以使用vim 2 实施步骤 编写dockerfile脚本 vim centos_dockerfile 内容如下&#xff1a; #定义父镜像 FROM centos:7#定义作者信息 MAINTAINER handsome <handsomehandsome.com># 设置阿里云…

【音视频】ffplay简单过滤器

一、ffplay简单过滤器 视频旋转&#xff1a;借助transpose滤镜 ffplay -i 1.mp4 -vf transpose1这里选择不同的数字是不同的方向&#xff1a; 视频翻转&#xff1a;借助hflip/vflip实现水平和垂直翻转&#xff1a; 水平翻转 ffplay 1.mp4 -vf hflip垂直翻转 ffplay 1.mp4 …

使用Kingfisher加载网络图片时使用indicatorType产生布局混乱

SheetInfoCell代码中&#xff0c;执行iconView.show(info.picurl) 时&#xff0c;若采用kf.indicatorType .activity&#xff0c;则会产生ui页面混乱&#xff0c;如果不使用这个加载动画&#xff0c;则不会产生。 与此同时&#xff0c;对于发现页面&#xff0c;是否使用加载动…

【慕课网wiki项目学习笔记01】Spring Boot 项目搭建

2-2 新建SpringBoot项目 一、创建SpringBoot项目 &#xff08;1&#xff09;在SpringBoot官网创建 &#xff08;2.1&#xff09;在 IDEA 中创建 Group&#xff1a;公司名 Artifact&#xff1a;项目名 创建成功后开始下载Maven依赖&#xff08;选择右下角的Import Changes&…

突破极限:高性能ROCK 220A-M 工业级无人机电调深度测评 —— 无人机动力系统的核心守护者

引言 在无人机技术高速发展的今天&#xff0c;动力系统的稳定性与效率成为决定任务成败的关键。作为工业级电调领域的标杆产品&#xff0c;ROCK 220A-M 凭借其卓越的性能与多重安全设计&#xff0c;为专业级无人机应用提供了可靠的动力解决方案。本文将从技术架构、防护…

Java-servlet(三)Java-servlet-Web环境搭建(下)详细讲解利用maven和tomcat搭建Java-servlet环境

Java-servlet&#xff08;三&#xff09;Java-servlet-Web环境搭建&#xff08;下&#xff09;利用maven和tomcat搭建Java-servlet环境 前言一、配置maven阿里镜像二、利用IDEA创建maven文件创建maven文件删除src文件创建新的src模版删除example以及org文件 三、在第二个xml文件…

YOLOv12本地部署教程——42%速度提升,让高效目标检测触手可及

YOLOv12 是“你只看一次”&#xff08;You Only Look Once, YOLO&#xff09;系列的最新版本&#xff0c;于 2025 年 2 月发布。它引入了注意力机制&#xff0c;提升了检测精度&#xff0c;同时保持了高效的实时性能。在保持速度的同时&#xff0c;显著提升了检测精度。例如&am…

快速生成viso流程图图片形式

我们在写详细设计文档的过程中总会不可避免的涉及到时序图或者流程图的绘制&#xff0c;viso这个软件大部分技术人员都会使用&#xff0c;但是想要画的好看&#xff0c;画的科学还是比较难的&#xff0c;现在我总结一套比较好的方法可以生成好看科学的viso图(图片格式)。主要思…

关于后端接口的返回值问题

1、后端接口中&#xff0c;get请求能返回给前端一个整数么&#xff1f; 问题说明&#xff1a; 解释&#xff1a; 在 Spring MVC 项目中&#xff0c;GET 请求的后端接口可以返回一个整数给前端。因为我们在controller层中&#xff0c;设置了RestController注解&#xff0c;这表明…

第十五届蓝桥杯----B组cpp----真题解析(小白版本)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 必看前言&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;一、试题A&#xff1a;握手问题1.题意分析2.代码解答 二、试题B&#xff1a;小球反弹1.题意…

1493. 删掉一个元素以后全为 1 的最长子数组

目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题2.4 复盘 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 2.2 代码尝试 class Solution { public:int longestSubarray(vector<int>& nums) {int len0;int l0;int a1;int ret1;…

解锁前端表单数据的秘密旅程:从后端到用户选择!✨

&#x1f604; 解锁前端表单数据的秘密旅程&#xff1a;从后端到用户选择&#xff01;✨ 嘿&#xff0c;技术爱好者们&#xff01;&#x1f44b; 你有没有在开发中遇到过这样的困惑&#xff1a;表单里的数据&#xff08;比如图片附件、识别点 ID&#xff09;从哪儿来的&#x…