RabbitMQ高可用集群部署

news2024/11/18 7:42:41

文章目录

    • 1.RabbitMQ常见的集群模式
    • 2.部署基于镜像队列模式的RabbitMQ高可用集群
      • 2.1.镜像队列集群原理
      • 2.2.分别在两台机器中部署RabbitMQ
        • 2.2.1.基础环境配置
        • 2.2.2.安装Erlang环境
        • 2.2.3.部署RabbitMQ并开启管理界面
        • 2.2.4.配置RabbitMQ各节点变量信息
        • 2.2.5.访问RabbitMQ后台管理系统
      • 2.3.将两个节点配置成集群模式
      • 2.4.配置RabbitMQ的镜像队列
        • 2.4.1.通过后台管理图形化配置镜像队列
        • 2.4.2.通过RabbitMQ命令行配置镜像队列
      • 2.5.在集群中创建队列观察镜像队列效果
        • 2.5.1.将队列创建在RabbitMQ-1节点上观察效果
        • 2.5.2.将队列创建在RabbitMQ-2节点上观察效果
      • 2.6.验证RabbitMQ集群的高可用性
    • 4.RabbitMQ的集群管理

1.RabbitMQ常见的集群模式

  • 主备模式
    • 节点提供读写,备用节点不提供读写。如果主节点挂了,就切换到备用节点,原来的备用节点升级为主节点提供读写服务,当原来的主节点恢复运行后,原来的主节点就变成备用节点。
  • 远程模式
    • 跨地域的让两个 MQ 集群互联,远距离通信和复制。
  • 镜像模式
    • 百分百保证数据不会丢失,类似于主从复制,但是所有节点都可以提供读写功能,当主节点挂了备用节点继续提供服务
  • 多活模式
    • 实现异地数据复制的主流模式

2.部署基于镜像队列模式的RabbitMQ高可用集群

2.1.镜像队列集群原理

由于RabbitMQ是使用Erlang语言开发的,天生就具备分布式集群模式,不像ActiveMQ还需要zookeep来实现主备的选举,RabbitMQ自身就可以实现,镜像队列模式是指多个MQ节点之间共同复制消息队列,即使其中一个节点挂了也不会影响程序的使用,在其他的节点中还会存在相同的数据。

RabbitMQ通过进队列就可以实现集群模式,但是当节点很多时,就需要为这些MQ提供一个统一的入口,让消费者和生产者去调用。

image-20220310151028981

集群规划:

角色IPWEB端口通信端口
rabbitmq-1@rabbitmq-node1192.168.81.210156725672
rabbitmq-2@rabbitmq-node2192.168.81.220156725672
haproxy192.168.81.2305672

2.2.分别在两台机器中部署RabbitMQ

两台机器都按如下步骤进行部署。

2.2.1.基础环境配置

# hostnamectl set-hostname rabbitmq-node1
# hostnamectl set-hostname rabbitmq-node2

# vim /etc/hosts
192.168.81.210 rabbitmq-node1
192.168.81.220 rabbitmq-node2

2.2.2.安装Erlang环境

1.解压源码包
[root@rabbitmq-node1 ~]# tar xf erlang_9.0.tar.gz -C /data

2.配置环境变量
[root@rabbitmq-node1 ~]# vim /etc/profile
ERLANG_HOME=/data/erlang
PATH=$ERLANG_HOME/bin:$PATH

3.加载变量信息
[root@rabbitmq-node1 ~]# source /etc/profile

4.查看erlang版本
[root@rabbitmq-node1 ~]# erl -version
Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 9.0

2.2.3.部署RabbitMQ并开启管理界面

1.部署RabbitMQ
[root@rabbitmq-node1 ~]# tar xf rabbitmq-server-generic-unix-3.6.10.tar.xz -C /data/
[root@rabbitmq-node1 data]# mv rabbitmq_server-3.6.10/ rabbitmq_server

2.开放登陆用户
[root@rabbitmq-node1 ~]# vim /data/rabbitmq_server/ebin/rabbit.app 
            {loopback_users, [guest]},					#36行,将默认的<<"guest">>改成guest
            

3.启动RabbitMQ
[root@rabbitmq-node1 ~]# /data/rabbitmq_server/sbin/rabbitmq-server start &

              RabbitMQ 3.6.10. Copyright (C) 2007-2017 Pivotal Software, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: /data/rabbitmq_server/var/log/rabbitmq/rabbit@rabbitmq.log
  ######  ##        /data/rabbitmq_server/var/log/rabbitmq/rabbit@rabbitmq-sasl.log
  ##########
              Starting broker...
 completed with 0 plugins.

4.开启后台管理系统
[root@rabbitmq-node1 ~]# /data/rabbitmq_server/sbin/rabbitmq-plugins enable rabbitmq_management

2.2.4.配置RabbitMQ各节点变量信息

1)RabbitMQ Node1节点配置

1.配置RabbitMQ的变量信息
[root@rabbitmq-node1 ~]# cat /data/rabbitmq_server/etc/rabbitmq/rabbitmq-env.conf 
RABBITMQ_NODENAME=rabbitmq-1@rabbitmq-node1						#节点名称
RABBITMQ_NODE_IP_ADDRESS=192.168.81.210							#节点地址
RABBITMQ_NODE_PORT=5672										   #使用的端口号
RABBITMQ_MNESIA_BASE=/data/rabbitmq_server/data					 #数据路径
RABBITMQ_LOG_BASE=/data/rabbitmq_server/logs					 #日志路径

2.添加RabbitMQ的主配置文件
[root@rabbitmq-node1 ~]# cat /data/rabbitmq_server/etc/rabbitmq/rabbitmq.config 
[
 {rabbit,
   [
     {tcp_listeners, [5672]},
     {dump_log_write_threshold, [1000]},
     {vm_memory_high_watermark, 0.5},
     {disk_free_limit, "200MB"},
     {hipe_compile,true}
   ]
  }
].

2)RabbitMQ Node2节点配置

1.配置RabbitMQ的变量信息
[root@rabbitmq-node1 ~]# vim /data/rabbitmq_server/etc/rabbitmq/rabbitmq-env.conf 
RABBITMQ_NODENAME=rabbitmq-1@rabbitmq-node2						#节点名称
RABBITMQ_NODE_IP_ADDRESS=192.168.81.220							#节点地址
RABBITMQ_NODE_PORT=5672										   #使用的端口号
RABBITMQ_MNESIA_BASE=/data/rabbitmq_server/data					 #数据路径
RABBITMQ_LOG_BASE=/data/rabbitmq_server/logs					 #日志路径

2.添加RabbitMQ的主配置文件
[root@rabbitmq-node1 ~]# vim /data/rabbitmq_server/etc/rabbitmq/rabbitmq.config 
[
 {rabbit,
   [
     {tcp_listeners, [5672]},
     {dump_log_write_threshold, [1000]},
     {vm_memory_high_watermark, 0.5},
     {disk_free_limit, "200MB"},
     {hipe_compile,true}
   ]
  }
].

3)配置完成后重启两个节点

# /data/rabbitmq_server/sbin/rabbitmqctl stop
# /data/rabbitmq_server/sbin/rabbitmq-server start 

HiPE compiling:  |---------------------------------------------------------|
                 |#########################################################|

Compiled 57 modules in 114s

              RabbitMQ 3.6.10. Copyright (C) 2007-2017 Pivotal Software, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: /data/rabbitmq_server/logs/rabbitmq-1@rabbitmq-node1.log
  ######  ##        /data/rabbitmq_server/logs/rabbitmq-1@rabbitmq-node1-sasl.log
  ##########
              Starting broker...
 completed with 6 plugins.

2.2.5.访问RabbitMQ后台管理系统

访问各节点。

image-20220310224237705

2.3.将两个节点配置成集群模式

rabbitmq-1@rabbitmq-node1为集群中的主节点,rabbitmq-2@rabbitmq-node2加入rabbitmq-1@rabbitmq-node1的集群。

1)RabbitMQ-1节点操作

RabbitMQ第一个节点为集群中的主节点,可以不做数据清理,亦不用执行下面的步骤。

1.停止rabbitmq-1节点
[root@rabbitmq-node1 ~]# /data/rabbitmq_server/sbin/rabbitmqctl stop_app
Stopping rabbit application on node 'rabbitmq-1@rabbitmq-node1'

2.清空数据
[root@rabbitmq-node1 ~]# /data/rabbitmq_server/sbin/rabbitmqctl  reset
Resetting node 'rabbitmq-1@rabbitmq-node1'

3.启动rabbitmq-1节点
[root@rabbitmq-node1 ~]# /data/rabbitmq_server/sbin/rabbitmqctl start_app
Starting node 'rabbitmq-1@rabbitmq-node1'

如果一个节点上存在多个应用,则需要使用-n指定当前mq应用的名称,例如`/data/rabbitmq_server/sbin/rabbitmqctl -n rabbitmq-2 reset`
stop_app停止的并不是RabbitMQ服务,而是停止的由erlang运行的服务

2)RabbitMQ-2节点操作

由于RabbitMQ第二个节点要加入第一个节点的集群,因此必须要清空数据。

1.停止rabbitmq-2节点
[root@rabbitmq-node2 ~]# /data/rabbitmq_server/sbin/rabbitmqctl -n  stop_app
Stopping rabbit application on node 'rabbitmq-2@rabbitmq-node2'

2.清空数据
[root@rabbitmq-node2 ~]# /data/rabbitmq_server/sbin/rabbitmqctl  reset
Resetting node 'rabbitmq-2@rabbitmq-node2'

3.加入rabbitmq-1节点组成集群
[root@rabbitmq-node2 ~]# /data/rabbitmq_server/sbin/rabbitmqctl join_cluster --ram rabbitmq-1@rabbitmq-node1
Clustering node 'rabbitmq-2@rabbitmq-node2' with 'rabbitmq-1@rabbitmq-node1'

rabbitmq-1@rabbitmq-node1 @符号后面的是第一个节点的主机名,主机名不要随意更改

当加入集群的命令执行成功后,在RabbitMQ第一个节点的控制台就可以看到已经有第二个节点加入了,现处于未启动状态。

image-20220312100425584

4.启动第二个节点
[root@rabbitmq-node2 ~]# /data/rabbitmq_server/sbin/rabbitmqctl  start_app
Starting node 'rabbitmq-2@rabbitmq-node2'

集群组件完成。

image-20220312100519779

3)查看集群的状态

可以看到集群及诶单的信息等等。

[root@rabbitmq-node1 ~]# /data/rabbitmq_server/sbin/rabbitmqctl cluster_status
Cluster status of node 'rabbitmq-1@rabbitmq-node1'
[{nodes,[{disc,['rabbitmq-1@rabbitmq-node1']},
         {ram,['rabbitmq-2@rabbitmq-node2']}]},
 {running_nodes,['rabbitmq-2@rabbitmq-node2','rabbitmq-1@rabbitmq-node1']},
 {cluster_name,<<"rabbitmq-1@rabbitmq-node1">>},
 {partitions,[]},
 {alarms,[{'rabbitmq-2@rabbitmq-node2',[]},{'rabbitmq-1@rabbitmq-node1',[]}]}]

2.4.配置RabbitMQ的镜像队列

在上一步中,RabbitMQ集群已经搭建完成了,但是并不能保证消息队列的高可用,尽管交换机和队列都可以绑定和复制到任何一个节点中,在每个节点都会显示,但是数据时不会复制的,当我们在rabbitmq-1节点上创建的队列,产生的消息数据,在第二个节点上只能看到这个队列的状态,当第一个节点挂了之后,数据就无法读取了,仅显示有这个队列存在并且状态是down。

基于上述问题,想要在某个节点挂掉之后,还可以正常的使用,我们就需要配置镜像队列功能,将MQ中的什么数据进行镜像复制的功能,也就是实时同步这些数据到另外的节点,即使rabbitmq-1节点挂掉了,数据在rabbitmq-2节点上还有一份存在,不影响用户的使用。

镜像队列就是在普通集群模式之上,填写一些策略,完成数据的同步。

配置镜像队列的方式有两种:后台管理系统图形化配置、通过命令配置。

2.4.1.通过后台管理图形化配置镜像队列

点击Admin—>Policies—>Add a Policy—>填写策略的名称:image_queue_ha—>设置正则表达式:^(匹配所有)---->选择要将那些数据进行同步 选择上交换机和对列—>设置模式ha-mode=all

image-20220312103452295

2.4.2.通过RabbitMQ命令行配置镜像队列

rabbitmqctl set_policy image_queue_ha "^" '{"ha-mode":"all"}'

在哪一个节点上添加都可以,都会复制。

image-20220312103734188

2.5.在集群中创建队列观察镜像队列效果

最终结论:再哪一个节点上创建的队列,哪一个节点就是该队列的主节点。

2.5.1.将队列创建在RabbitMQ-1节点上观察效果

1)创建队列选择第一个节点。

image-20220312105030767

2)可以看到创建的队列在节点列表中会多了个+1。

image-20220312104522774

3)点击队列名称查看详细的信息。

可以看到这个队列引用了我们创建的镜像队列的策略,并且主节点是rabbitmq-1,备用节点是rabbitmq-2。

image-20220312104651890

2.5.2.将队列创建在RabbitMQ-2节点上观察效果

1)将队列创建的第二个节点上。

image-20220312104929031

2)同样也会在节点列表中显示+1

image-20220312105131276

3)查看队列的详细信息。

image-20220312105207994

2.6.验证RabbitMQ集群的高可用性

任意关掉集群中的一个节点,我们来查看数据是否还在,我们来关闭第一个节点。

[root@rabbitmq-node1 ~]# /data/rabbitmq_server/sbin/rabbitmqctl stop_app
Stopping rabbit application on node 'rabbitmq-1@rabbitmq-node1'

第一个节点已经停止服务,后台管理系统也已经挂掉,我们进入第二个节点的控制台,观察队列是否存在异常。

可以看到所有队列中的节点列表,都已经变成了rabbitmq-2,并且没有了+1的展示,这是因为第一个节点挂了,现在一个

image-20220312105437740

4.RabbitMQ的集群管理

将节点加入指定的集群中,执行命令前需要停止RabbitMQ应用并重置节点数据。

rabbitmqctl join_cluster {cluster_node} [-ram]

显示集群的状态

rabbitmqctl cluster_status

修改集群节点的类型

rabbitmqctl change cluster_node_type {dusc|ram}

将节点从集群中删除

rabbitmqctl forget cluster_node [-offline]

刷新集群的信息

刷新集群的应用场景:当A节点和B节点组成一个集群,A节点因为某种异常离线了,B节点和C节点此时又组成了这个集群,当B节点从这个集群中下线时,A节点恢复了,A节点就会尝试连接B节点,为了避免此种问题,可以刷新集群的信息。

rabbitmqctl update_cluster_nodes {clusternode}

取消镜像队列的同步操作

rabbitmqctl canncel_sync_queue [-p vhost] {queue}

设置集群的名称

rabbitmqctl set_cluster_name {name}

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

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

相关文章

vue3基础------ 下

目录 二.vue3基础 5.事件处理器 5-1 事件处理器 - 告别原生事件 5-2 事件修饰符 - 事件偷懒符? 6.表单控件绑定 6-1表单输入绑定-一根绳上的蚂蚱 6-2购物车案例 6-3表单修饰符 7.计算属性 7-1计算属性-很聪明&#xff0c;会缓存 7-2 可写计算属性 7-3之前案例的小改…

ModaHub魔搭社区:向量数据库MIlvus服务端配置(三)

目录 gpu 区域 logs 区域 metric_config 区域 gpu 区域 在该区域选择是否在 Milvus 里启用 GPU 用于搜索和索引创建。同时使用 CPU 和 GPU 可以达到资源的最优利用&#xff0c;在特别大的数据集里做搜索时性能更佳。 若要切换到 CPU-only 模式&#xff0c;只要将 enable 设…

【敬伟ps教程】色彩基础

文章目录 在通道内发现色光吸管工具与颜色面板在RGB通道创造色彩色彩三要素选择方式CMYK模式详解 在通道内发现色光 RGB基于色光的混合模式&#xff0c;是最常见的色彩模式 我们新建一个 RGB 画布&#xff0c;前景色改为黑色&#xff0c;AltDelete填充前景色。我们查看图像–…

实验篇(7.2) 18. 星型安全隧道 - 分支互访(IPsec) ❀ 远程访问

【简介】Hub-and-Spoke&#xff1a;各分支机构利用VPN设备与总部VPN设备建立VPN通道后&#xff0c;除了可以和总部进行通讯&#xff0c;还可以利用总部VPN设备互相进行数据交换&#xff0c;而各VPN分支机构不需要进行VPN的隧道连接。 实验要求与环境 OldMei集团深圳总部部署了域…

C# 线程基础 二

目录 八、前台线程和后台线程 九、线程参数的传递 十、线程中的 lock 关键字 十一、Monitor类锁定 结束 八、前台线程和后台线程 默认情况下&#xff0c;显式创建的线程是前台线程&#xff0c;通过手动的设置 Thread 类的属性 IsBackground true 来指示当前线程为一个后…

让GPT-3、ChatGPT、GPT-4一起做脑筋急转弯,GPT-4一骑绝尘!

作者 | python 一个烙饼煎一面一分钟&#xff0c;两个烙饼煎两面几分钟&#xff1f; 让你来回答&#xff0c;是不是一不小心就掉到沟里了&#xff1f;如果让大语言模型来做这种脑筋急转弯会怎样呢&#xff1f;研究发现&#xff0c;模型越大&#xff0c;回答就越可能掉到沟里&a…

VScode连接远程服务器

VScode连接远程服务器 文章目录 VScode连接远程服务器下载扩展通过扩展连接服务器在输入框中输入usernameip进行连接通过已保存的配置信息进行连接 连接成功之后访问服务器文件访问文件 下载扩展 下载以下三个扩展 Remote-SSH Remote - SSH: Editing Configuration Files R…

Docker Network 基础

一、是什么 Docker网络是Docker容器之间和容器与外部网络之间的通信和连接的一种机制。在Docker中&#xff0c;每个容器都可以有自己的网络栈&#xff0c;包括网络接口、IP地址和网络配置。Docker网络提供了一种灵活且可定制的方式&#xff0c;使得容器之间可以相互通信&#x…

【单元测试】Junit 4(二)--eclipse配置Junit+Junit基础注解

目录 1.0 前言 1.1 配置Junit 4 1.1.1 安装包 1.1.2 创建Junit项目 1.2 Junit 4 注解 1.2.1 测试用例相关的注解 1.2.1.1 Before 1.2.1.2 After 1.2.1.3 BeforeClass 1.2.1.4 AfterClass 1.2.1.5 Test 1.2.1.6 Ignore 1.2.1.7 示例 1.2.2 打包测试Suite相关的注解…

JAVA工程打包

目录 一、工程代码和第三方依赖包分开 二、工程代码和第三方依赖包打入同一个jar包 1、工程的class文件和依赖的第三方jar包所包含的class文件打进同一个jar包中。部署时&#xff0c;直接部署该jar包即可。 2、如果是springboot工程&#xff0c;可以将工程的class文件和依赖…

iOS多语言解决方案全面指南

本文以及相关工具和代码旨在为已上线的iOS项目提供一种快速支持多语言的解决方案。由于文案显示是通过hook实现的&#xff0c;因此对App的性能有一定影响&#xff1b;除了特殊场景的文案显示需要手动支持外&#xff0c;其他任务均已实现自动化。 本文中的部分脚本代码基于 Chat…

OpenShift 4 - 可观测性之用 Network Observability Operator 对网络流量进行监控观测(视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.12 Loki Operator 5.7.2 Network observability 1.2.0 的环境中验证 文章目录 Network Observability 相关组件和架构安装 Network Observaility 功能安装 Operator配置对象存储配置 …

Scrapy的基本使用

目录 Scrapy是什么 安装 使用 获取更多页面信息 写入数据库 图片下载 文件下载 更改文件名称以及路径 更改图片名称以及路径 循环获取页面信息时&#xff0c;item的数据重复或者对不上 下载文件时获取文件流直接上传到某个地方 Scrapy是什么 Scrapy 是一个基于 Pyth…

园区自然人代开果真那么好?可以解决成本票缺失吗?

园区自然人代开果真那么好&#xff1f;可以解决成本票缺失吗&#xff1f; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 自然人代开也就是指个人跟公司发生业务往来的时候&#xff0c;公司要求个人开具发票&#xff0c;进行入账&am…

open-mmlab/mmocr 环境搭建、推理和训练入门教程【一】

文章目录 博文基础信息Linux 搭建 open-mmlab/mmocr 运行环境准备数据集准备必要的预训练模型推理训练测试可视化输出 &#x1f4d9; 预祝各位 前途似锦、可摘星辰 博文基础信息 https://mmocr.readthedocs.io/zh_CN/dev-1.x/get_started/quick_run.html显卡&#xff0c;11G 1…

【Pytorch】梯度裁剪——torch.nn.utils.clip_grad_norm_的原理及计算过程

文章目录 一、torch.nn.utils.clip_grad_norm_二、计算过程三、确定max_norm 众所周知&#xff0c;梯度裁剪是为了防止梯度爆炸。在训练FCOS算法时&#xff0c;因为训练过程出现了损失为NaN的情况&#xff0c;在github issue有很多都是这种训练过程出现loss为NaN&#xff0c;作…

RISCV Reader笔记_3 RISCV汇编

RISC-V 汇编语言 函数调用的步骤在计算机组成与设计中也有过涉及&#xff1a; 指定寄存器存入参数&#xff1b;跳转到函数开始位置&#xff08;jal&#xff09;&#xff1b;在callee中按需保存寄存器&#xff1b;执行函数&#xff1b;恢复保存的寄存器&#xff1b;把返回值存入…

使用传统图像处理算法+机器学习进行shadow detection

前言 阴影是图像中常见的现象&#xff0c;它们对于场景理解和分析非常重要。由于阴影区域通常比较暗淡&#xff0c;而且与周围物体区别较大&#xff0c;因此在图像处理和计算机视觉领域中&#xff0c;阴影检测是一个重要的研究方向。传统的阴影检测算法通常基于阈值或边缘检测…

深入理解 kernel panic 的流程

我们在项目开发过程中&#xff0c;很多时候会出现由于某种原因经常会导致手机系统死机重启的情况&#xff08;重启分Android重启跟kernel重启&#xff0c;而我们这里只讨论kernel重启也就是 kernel panic 的情况&#xff09;&#xff0c;死机重启基本算是影响最严重的系统问题了…

180_Power BI 新卡片图计算组与同环比应用

180_Power BI 新卡片图计算组与同环比应用 一、背景 在 2023 年 6 月&#xff0c;Power BI 更新了新的视觉对象&#xff1a;Card(new) 。 当前还需要在预览功能中将其打开。 我们在实际的应用中将新卡片图做了一些应用&#xff0c;先来看看具体效果。 Power BI 公共 web 效果…