RabbitMQ集群搭建详细介绍以及解决搭建过程中的各种问题——实操型

news2024/12/28 19:33:19

RabbitMQ集群搭建详细介绍以及解决搭建过程中的各种问题——实操型

  • 1. 准备工作
    • 1.1 安装RabbitMQ
    • 1.2 简单部署搭建设计
    • 1.3 参考官网
  • 2. RabbitMQ 形成集群的方法
  • 3. 搭建RabbitMQ集群
    • 3.1 部署架构
    • 3.2 rabbitmq集群基础知识
      • 3.2.1 关于节点名称(标识符)
        • 3.2.1.1 节点名称
        • 3.2.1.2 主机解析
      • 3.2.2 端口访问
      • 3.2.3 群集中的节点
        • 3.2.3.1 配置 Erlang Cookie
    • 3.3 搭建集群(步骤)
      • 3.3.1 开放4369端口、25672端口
      • 3.3.2 修改每台机器的 /etc/hosts 文件
      • 3.3.3 停止服务、配置 Erlang Cookie
      • 3.3.4 启动独立节点
      • 3.3.5 创建集群
      • 3.3.5.1 创建集群步骤
      • 3.3.5.2 遇到的问题
        • 3.3.5.2.1 问题1:
        • 3.3.5.2.1 问题2——移除节点之后重新加入的问题:
      • 3.3.6 查看集群状态(命令查看)
      • 3.3.7 查看集群状态(UI界面查看)
    • 3.4 为集群创建用户
    • 3.5 集群——简单实用
      • 3.5.1 查看是否启用了自动集群发现机制
      • 3.5.2 自动集群发现机制(简单演示)
    • 3.6 解除集群节点
  • 4. 镜像队列
    • 4.1 普通模式集群存在的问题
      • 4.1.1 演示问题——不能备份
      • 4.1.2 引入镜像队列

1. 准备工作

1.1 安装RabbitMQ

  • 准备3台机器,分别安装上RabbitMQ,这里就不多说了,关于安装可以参考下面的文章,里面写的很详细,如下:
    RabbitMQ入门(RabbitMQ的安装 + 解决RabbitMQ安装过程中的版本等问题 + 解决启动RabbitMQ服务失败等问题 + Java客户端使用).

1.2 简单部署搭建设计

  • 服务器情况

    节点(理解用)节点名称(计算生成)主机名主机IP
    node1rabbit@VM-24-15-centosVM-24-15-centos49.xxx.99
    node2rabbit@hello-TQ2hello-TQ215xxxx212
    node3rabbit@hello_TQ1hello_TQ143.xxx.116
  • 部署设计,如下:
    在这里插入图片描述

1.3 参考官网

  • 找官网参考,如下:
    https://www.rabbitmq.com/clustering.html#node-count.

2. RabbitMQ 形成集群的方法

  • 官方说了以下几种,感兴趣的可以试试
    在这里插入图片描述
  • 接下来介绍的是最好一种,手动使用 rabbitmqctl

3. 搭建RabbitMQ集群

3.1 部署架构

  • 这里详细见1.2中的介绍。

3.2 rabbitmq集群基础知识

3.2.1 关于节点名称(标识符)

3.2.1.1 节点名称
  • RabbitMQ 节点由节点名称标识。节点名称由两部分组成,前缀(通常是 rabbit)和主机名。例如,rabbit@node1.messaging.svc.local 是一个节点名称,前缀为 rabbit,主机名为 node1.messaging.svc.local。再例如:rabbit@VM-24-15-centosrabbit@hello_TQ1
  • 在群集中,节点使用节点名称相互标识和联系。这意味着必须解析每个节点名称的主机名部分。CLI 工具还使用节点名称识别和寻址节点。
  • 当节点启动时,它会检查是否已为其分配节点名称。这是通过RABBITMQ_NODENAME环境变量完成的。如果未显式配置任何值,则节点将解析其主机名,并将 rabbit 附加到它以计算其节点名称
3.2.1.2 主机解析
  • 如下:
    在这里插入图片描述

3.2.2 端口访问

  • 开放4369端口、25672端口,关于相关端口,如下:
    在这里插入图片描述

3.2.3 群集中的节点

3.2.3.1 配置 Erlang Cookie
  • CLI工具如何对节点进行身份验证(以及节点之间的身份验证)
    • RabbitMQ 节点和 CLI 工具(例如 rabbitmqctl)使用 cookie 来确定它们是否被允许相互通信。为了使两个节点能够通信,它们必须具有相同的共享密钥,称为Erlang cookie。Cookie 只是一个字母数字字符字符串,最大为 255 个字符。它通常存储在本地文件中。该文件必须仅供所有者访问(例如,具有 600 或类似的 UNIX 权限)。每个群集节点必须具有相同的 Cookie
  • 关于cookie 文件的位置:
    • RabbitMQ 服务启动时,erlang VM 会自动创建该 cookie 文件,cookie通常位于 /var/lib/rabbitmq/.erlang.cookie(由服务器使用)和$HOME/.erlang.cookie(由CLI工具使用)中。
      在这里插入图片描述
  • 所以,下面搭建集群时,需要统一一下.erlang.cookie文件(要求相同的 Cookie)
    • 将node1机器上的.erlang.cookie文件分别拷贝到node2和node3上,拷贝时候记得停止RabbitMQ服务。

3.3 搭建集群(步骤)

3.3.1 开放4369端口、25672端口

  • 云服务器的话,开放 4369、25672 端口,如果防火墙是开启的话,执行下面命令:
    firewall-cmd --state  # 查看防火墙的状态
    
    sudo firewall-cmd --add-port=4369/tcp --permanent
    sudo firewall-cmd --add-port=25672/tcp --permanent
    
    firewall-cmd --reload
    
    firewall-cmd --list-all
    
  • 如果不开放此端口,后面执行 rabbitmqctl stop_app 时报错,不能链接此端口。

3.3.2 修改每台机器的 /etc/hosts 文件

  • vim /etc/hosts,让集群节点间需能互相访问,故每个集群节点的hosts文件应包含集群内所有节点的信息以保证互相解析。
    • 需要注意的是:这里的主机名不是随便填写的,你要看你3台服务器的主机名是什么,比如,我在node1节点的主机名是VM-24-15-centos,node2节点的主机名是hello-TQ2,node3节点的主机名是hello_TQ1,所以我在每台服务器上的配置如下:
      服务器IP1 VM-24-15-centos
      服务器IP2  hello-TQ2
      服务器IP3 hello_TQ1
      
      在这里插入图片描述
  • 重启网络,便于系统识别hosts
    systemctl restart network
    
  • 备注:如果你是刚初始化的服务器,可以修改主机名,但是如果你服务器上已经装了很多东西,就没必要修改主机名了(谨慎修改),关于修改主机名的,可以看下面的文章:
    云服务器修改主机名hostname.

3.3.3 停止服务、配置 Erlang Cookie

  • 这个详细的话见上面说的,操作的话,只需将node1(我这里是VM-24-15-centos主机)上的.erlang.cookie文件分别拷贝到 node2 和 node3 对应的机器上。
  • 停止所有服务,构建Erlang的集群环境
    systemctl stop rabbitmq-server
    
    或 
    
    service rabbitmq-server stop
    
  • 开始拷贝.erlang.cookie
    scp /var/lib/rabbitmq/.erlang.cookie root@node2服务IP:/var/lib/rabbitmq/
    scp /var/lib/rabbitmq/.erlang.cookie root@node3服务IP:/var/lib/rabbitmq/
    

3.3.4 启动独立节点

  • 启动三台RabbitMQ,以正常方式在所有节点上启动 RabbitMQ,启动命令:
    rabbitmq-server -detached
    

3.3.5 创建集群

3.3.5.1 创建集群步骤

  • 为了将集群中的三个节点连接起来,我们告诉其中两个节点,比如rabbit@hello-TQ2rabbit@hello_TQ1,加入node1节点的集群,比如rabbit@VM-24-15-centos。在此之前,必须重置两个新加入的成员。
    • 分别在要加入的两个机上上,执行下面的操作命令:
      rabbitmqctl stop_app   # 1.关闭RabbitMQ服务
      
      rabbitmqctl reset   # 2.重置节点
      
      # 3.节点加入, 在一个node加入cluster之前,必须先停止该node的rabbitmq应用,即先执行stop_app
      rabbitmqctl join_cluster rabbit@VM-24-15-centos
      
      rabbitmqctl start_app    #  4.启动服务
      
    • 注意:
      • abbitmqctl stop 会将Erlang虚拟机关闭;
      • rabbitmqctl stop_app 只关闭rabbitMQ服务
      • rabbitmqctl start_app 只启动应用服务
  • 加入节点、重置节点注意:
    • 我们首先将 rabbit@hello-TQ2rabbit@hello_TQ1 加入一个集群。为此,我们要在 rabbit@hello-TQ2rabbit@hello_TQ1停止 RabbitMQ 应用程序并加入 rabbit@VM-24-15-centos(node1节点) 群集,然后重新启动 node2、node3的RabbitMQ 应用程序。
    • 请注意,节点必须重置后才能加入现有群集。重置节点会删除该节点上以前存在的所有资源和数据。这意味着,节点不能在成为群集成员的同时保留其现有数据。如果需要这样做,可以使用蓝/绿部署策略或备份和还原。
  • 操作如下:
    在这里插入图片描述
    在这里插入图片描述

3.3.5.2 遇到的问题

3.3.5.2.1 问题1:
  • 问题如下:
    unable to connect to epmd (port 4369) on VM-24-15-centos: nxdomain (non-existing domain)
    
    在这里插入图片描述
  • 解决问题,修改/etc/hosts,让集群节点间需能互相访问,故每个集群节点的hosts文件应包含集群内所有节点的信息以保证互相解析。如果按上面步骤操作应该不会报这个错,所以此处不做过多解释,详细见3.3.2节
3.3.5.2.1 问题2——移除节点之后重新加入的问题:
  • 问题描述:第一次加没问题,移除再次加入直接报错,在执行rabbitmqctl reset 命令时报错,错误如下:
    Error:
    {:cannot_start_mnesia, {{:shutdown, {:failed_to_start_child, :mnesia_kernel_sup, :killed}}, {:mnesia_app, :start, [:normal, []]}}}
    
    在这里插入图片描述
  • 解决问题:
    • 第一:先解决上面的问题,解决方法就是删除存储的数据,如下:
      cd /var/lib/rabbitmq/mnesia/rabbit@hello_TQ1
      rm -rf ./*
      
      cd /var/lib/rabbitmq
      rm -rf erl_crash.dump
      rm -rf MnesiaCore*
      
      在这里插入图片描述
    • 第二:解决之后,换了新错误,如下:
      	Error:
      {:corrupt_or_missing_cluster_files, {:error, :enoent}, {:error, :enoent}}
      
      • 解决问题,rest之前执行一下命令rabbitmqctl cluster_status,一连串的操作如下(上面那个应该也可以按这个解决,不用手动rm-rf,不知道没尝试,但是感觉可以):
        rabbitmq-server -detached
        rabbitmqctl start_app    # 先启
        rabbitmqctl cluster_status
        rabbitmqctl stop_app  # 再停
        rabbitmqctl reset   # 重置
        
        rabbitmqctl join_cluster rabbit@VM-24-15-centos
        rabbitmqctl start_app
        
        在这里插入图片描述

3.3.6 查看集群状态(命令查看)

  • 通过在任一节点上运行 rabbitmqctl cluster_status 命令,我们可以看到这两个节点已加入集群中:
    rabbitmqctl cluster_status
    
    在这里插入图片描述

3.3.7 查看集群状态(UI界面查看)

  • 如下:
    在这里插入图片描述

3.4 为集群创建用户

  • 如下,在任一台机器上创建即可,创建之后,3个IP都可以登录
    rabbitmqctl add_user mqAdmin2 123456
    
    rabbitmqctl set_user_tags mqAdmin2 administrator
    
    rabbitmqctl set_permissions -p "/" mqAdmin2 ".*" ".*" ".*"
    
    在这里插入图片描述
    在这里插入图片描述

3.5 集群——简单实用

3.5.1 查看是否启用了自动集群发现机制

  • rabbitmq集群发现机制:
    • 如果集群中默认配置中启用了RabbitMQ的自动集群发现机制。那么在一个节点上创建Exchange或Queue时,它会自动地在整个集群中被发现。
    • 当您在一个节点上创建Exchange或Queue时,该节点会将其信息广播到整个集群中,其他节点会收到这个广播消息并自动地创建相应的Exchange或Queue。这种方式可以使得集群中的Exchange和Queue自动地分布到所有节点上,从而提高系统的可用性和可伸缩性。
  • 另外前提:我这里的版本是 RabbitMQ 3.9.13 Erlang 23.3.4.18,没有找到默认的 rabbitmq.conf 文件 或 rabbitmq.conf.d文件。
    • 一般情况下,这两个文件在/etc/rabbitmq目录下,如果有这个配置文件的,可以查看配置文件里的 cluster_formation.peer_discovery_backend 行的配置,如果该行的值为rabbit_peer_discovery_classic_config,则表示启用了自动集群发现机制。如果该行的值为其他任何值,则表示未启用自动集群发现机制。
    • 如果没有配置文件的,也可通过 rabbitmqctl environment 命令查看配置,如下:
      rabbitmqctl environment | grep peer_discovery_backend
      
      在这里插入图片描述

3.5.2 自动集群发现机制(简单演示)

  • 如下:在node1上和node3上分别创建一个队列,其他节点上都能发现:
    在这里插入图片描述
  • 并且可以消费,消费一次,在node2上消费之后,其他节点就不会再有此已消费的消息。

3.6 解除集群节点

  • 如果想解除node3(rabbit@hello_TQ1):
    • 首先,在node3机器上做如下操作,命令如下:
      rabbitmqctl stop_app    # 关闭rabbitMQ服务
      
    • 然后,在node1上做忘记node3节点的操作,如下:
      rabbitmqctl forget_cluster_node rabbit@hello_TQ1
      
      操作此命令之前,一定要先关闭被忘记的节点的服务,否则,如下错误:
      在这里插入图片描述
  • 根据提示,可知,上面两步操作可以都在node1上完成,直接先stop,再forget,如下:
    rabbitmqctl -n rabbit@hello-TQ2 stop_app
    
    rabbitmqctl forget_cluster_node rabbit@hello-TQ2
    
    在这里插入图片描述

4. 镜像队列

4.1 普通模式集群存在的问题

4.1.1 演示问题——不能备份

  • 上面集群虽然可以启动自动集群发现机制,但是存在的问题是,如果创建队列(发送消息)的rabbitmq服务宕机了,消息就丢失了,比如上面node3节点上创建了队列发送了消息,其他node可以发现,但是如下现在node3宕机了,再看下效果:
    在这里插入图片描述
    在这里插入图片描述
  • 所以问题是:只能被发现,但是没有备份!

4.1.2 引入镜像队列

  • RabbitMQ的自动集群发现机制可以帮助集群中的Exchange和Queue自动地分布到所有节点上,从而提高系统的可用性和可伸缩性。然而,这种机制并不能完全保证消息的高可用性。如果某个节点出现故障,该节点上的Exchange和Queue可能会丢失或不可用,从而导致消息丢失或无法传递。为了解决这个问题,RabbitMQ提供了镜像队列(Mirrored Queue)的功能
  • 关于镜像队列的,见下篇!

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

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

相关文章

《操作系统真象还原》 第 01 章 部署工作环境 学习笔记

0. 内容说明 本内容依据《操作系统真象还原》进行学习,在学习过程中,由于新版本和旧版本bochs存在参数差异,故此会出现一些调试错误。也记录对应的解决方案。 1. 需要的编译器 对于现代OS来说,主要使用 C语言 和 汇编语言 两种…

剑指offer——JZ26 树的子结构 解题思路与具体代码【C++】

一、题目描述与要求 树的子结构_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构) 假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2}&…

【智能家居项目】裸机版本——字体子系统 | 显示子系统

🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言:你只管努力,剩下的交给时间! 今天实现上图整个项目系统中的字体子系统和显示子系统。 目录 🀄设计思路&#x1…

无法启动此程序,因为计算机中“找不到msvcp140.dll”的解决方法

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个动态链接库文件,它是许多基于Visual Studio开发的应用程序和游戏的必要组件。当计算机上缺失msvcp140.dll文件时,可能会导致以下问题: 1. 程序无法启动,提示“找不到…

【多线程安全】死锁 锁竞争总结

下面有两段代码&#xff1a; public class test {private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {for (int i 0; i < 10000; i) {count;}});Thread t2 new Thread(() -> {for (i…

速通Redis基础(一):掌握Redis的字符串类型和命令

目录 字符串&#xff08;String&#xff09; 常见命令 SET GET MSET&MGET SETNX INCR INCRBY DECR DECRBY INCRBYFLOAT APPEND GETRANGE SETRANGE STRLEN Redis字符串类型命令总结 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的…

机器学习基础之《分类算法(8)—随机森林》

一、什么是集成学习方法 1、定义 集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型&#xff0c;各自独立地学习和作出预测。这些预测最后结合成组合预测&#xff0c;因此优于任何一个单分类的做出预测 谚语&#xff1a;三个臭皮匠顶个诸…

论文悦读(6)——PM操作系统之TreeSLS单级存储

TreeSLS &#xff08;SOSP23&#xff09; 1. 背景 (Background)1.1 内存-存储二级架构 (1, 2.1)1.2 单级架构 (2.2)1.3 总结 2. 动机 (Motivation)2.1 现有SLS性能低下 (2.3)2.2 现有SLS难以支持External Synchrony (1, 2.4)2.3 高速PM出现为SLS带来新的机遇与挑战 (1, 2.5) 3.…

CDN是什么?(网络零基础入门篇)

1.CDN的全称 是 Content Delivery Network&#xff0c;即内容分发网络。 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。 通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网…

探索古彝文的秘密,AI实现古籍传承

陈老老老板&#x1f934; &#x1f9d9;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f9d9;‍♂️本文简述&#xff1a;最新资讯&#xff0c;合合信息扫描全能王实现古彝文识别&…

sigmoid和softmax函数有什么区别

Sigmoid函数和Softmax函数都是常用的激活函数&#xff0c;但它们的主要区别在于应用场景和输出结果的性质。 Sigmoid函数&#xff08;也称为 Logistic函数&#xff09;&#xff1a; Sigmoid函数将输入值映射到0到1之间的连续实数范围&#xff0c;通常用于二元分类问题。 Si…

U-Net神经网络简明教程

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 在我们进入技术细节之前&#xff0c;考虑一下&#xff0c;为什么要使用 U-Net&#xff1f; 你可能在搜索语义分割时遇到过这一点&#xff0c;我很快就会写一篇博客&#xff0c;然后再看看这个。 制作此架构的初衷是用于生物…

Spring MVC程序开发(JavaEE进阶系列3)

目录 前言&#xff1a; 1.什么是Spring MVC 1.1MVC的定义 1.2MVC和Spring MVC的关系 1.3为什么要学习Spring MVC 2.Spring MVC项目的创建 3.Spring MVC框架的使用 3.1连接的功能 3.1.1RequestMapping 3.1.2GetMapping 3.1.3PostMapping 3.2获取参数的功能 3.2.1获…

罗彻斯特大学探讨ChatGPT等人工智能将如何影响高等教育

人工智能聊天机器人ChatGPT持续引起互联网用户的热议&#xff0c;它能够回答关于各个领域的问题&#xff0c;创作歌曲、食谱&#xff0c;起草电子邮件等等。罗切斯特的教职员工和管理人员就他们如何处理 ChatGPT 以及它如何影响未来的教学和学习提出了他们的想法。 “让这项技…

基于Java的新能源汽车在线租赁平台设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

基于ChatGPT快速入门体验NLP词云

基于ChatGPT快速入门体验NLP词云 一、什么是自然语言处理二、自然语言处理和词云的关系三、Python环境准备四、基于ChatGpt制作词云4.1 ChatGPT生成初级词云代码4.2 ChatGPT生成进阶词云代码4.3 基于ChatGPT解决代码问题4.4 基于ChatGPT建议修改问题代码 一、什么是自然语言处理…

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现)

前段时间也是把指针较为详细系统的讲解完毕&#xff0c;接下来介绍一个全新的知识点&#xff0c;就是字符函数和字符串函数 前几期文章可进我主页观看&#xff1a;总之就是非常唔姆_Matlab,经验分享,c语言题目分享-CSDN博客 想要源代码可以去我的github看看&#xff1a;Neros…

教你拥有一个自己的QQ机器人!0基础超详细保姆级教学!基于NoneBot2 Windows端搭建QQ机器人

0.序言 原文链接&#xff1a;教你本地化部署一个QQ机器人本教程主要面向Windows系统用户教程从0开始全程详细指导&#xff0c;0基础萌新请放心食用&#x1f355;如果你遇到了问题&#xff0c;请仔细检查是否哪一步有遗漏。如果你确定自己的操作没问题&#xff0c;可以到原文链…

苹果macbook电脑磁盘满了怎么清理内存

如果你是苹果macbook用户&#xff0c;可能会面临一个常见但又令人头疼的问题——磁盘空间不足。这不仅影响了你的电脑性能&#xff0c;还可能导致新的软件无法安装&#xff0c;甚至影响到文件的保存。好消息是&#xff0c;有多种方法可以有效地解决这个问题。下面就一起来看看吧…

【100个 Unity实用技能】☀️ | UGUI Text中加入超链接文本,可直接点击跳转

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…