RabbitMQ集群部署

news2024/9/22 7:29:30

RabbitMQ集群部署

简介
  • 消息中间件RabbitMQ,一般以集群方式部署, 主要提供消息的接受和发送,实现各微服务之间的消息异步。 以下将介绍RabbitMQ+HA方式进行部署。
原理介绍
  • cookie
    • ​ RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证来实现分布式,所以部署Rabbitmq分布式集群时要先安装Erlang,并把其中一个服务的cookie复制到另外的节点。
  • 内存节点和磁盘节点
    • ​ RabbitMQ集群中,各个RabbitMQ为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般都建立为磁盘节点,为了防止机器重启后的消息消失;
  • 普通模式和镜像模式
    • ​ RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。消息队列通过RabbitMQ HA镜像队列进行消息队列实体复制。
    • 普通模式
      • ​ 普通模式下,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。
    • 镜像模式
      • ​ 镜像模式下,将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
环境要求
  • 1、所有节点需要再同一个局域网内;

  • 2、所有节点需要有相同的 erlang cookie,否则不能正常通信,为了实现cookie内容一致,采用scp的方式进行。

  • 3、准备三台虚拟机,配置相同

    • 192.168.145.11 设置主机名 rabbitmq1
    • 192.168.145.12 设置主机名 rabbitmq2
    • 192.168.145.13 设置主机名 rabbitmq3
    • 操作系统:centos7.2以上
  • 4、集群中所有节点都需要hosts文件解析

    • [root@rabbitmq1 ~]# cat /etc/hosts 
      
      192.168.229.11 rabbitmq1
      192.168.229.12 rabbitmq2
      192.168.229.13 rabbitmq3
      
部署过程(每个节点都配置)
  • 1、所有节点配置 vim /etc/hosts

    • 192.168.145.11 rabbitmq1
    • 192.168.145.12 rabbitmq2
    • 192.168.145.13 rabbitmq3
  • 2、所有节点安装erLang和rabbitmq

    • 见linux系统中单机部署rabbitmq
yum -y install erlang

在这里插入图片描述

yum install -y rabbitmq-server

在这里插入图片描述

cp /usr/share/doc/rabbitmq-server-3.3.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config 

vim /etc/rabbitmq/rabbitmq.config

53行解注释
{loopback_users, []}
  • 3、导入rabbitmq 的管理界面

    • rabbitmq-plugins enable rabbitmq_management
    • systemctl restart rabbitmq-server
  • 4、设置erlang运行节点

    • 一定要保证三台机器的cookie内容一致

      • 找到erlang cookie文件的位置,

        • 源码包部署一般会存在.erlang.cookie文件;
        • rpm包部署一般是在/var/lib/rabbitmq/.erlang.cookie。
        • 将 rabbitmq1 的该文件使用rsync或者是scp复制到 rabbitmq2、rabbitmq3,文件权限需要是400。
      • [root@rabbitmq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie  rabbitmq3:/var/lib/rabbitmq/.erlang.cookie
        
        [root@rabbitmq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie  rabbitmq2:/var/lib/rabbitmq/.erlang.cookie
        
      • cat /var/lib/rabbitmq/.erlang.cookie

    • systemctl restart rabbitmq-server

    • rabbitmq2和rabbitmq3

      • #rabbitmqctl stop
        • 关闭rabbitmq2和rabbitmq3的服务(不要关rabbitmq1) 如果2,3节点没有启动服务,会提示关闭错误。
        • 也就是,确保所有的活动任务和连接都被正常处理和关闭
    • rabbitmq2和rabbitmq3

      • #rabbitmq-server -detached
        • 2、3 独立运行节点,warning提示不用理会
        • Warning: PID file not written; -detached was passed.
    • rabbitmqctl cluster_status

      • 查看各个节点状态。(下图是node1节点)
[root@rabbitmq1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
[{nodes,[{disc,[rabbit@rabbitmq1]}]},
 {running_nodes,[rabbit@rabbitmq1]},
 {cluster_name,<<"rabbit@rabbitmq1">>},
 {partitions,[]},
 {alarms,[{rabbit@rabbitmq1,[]}]}]
  • Cluster status of node rabbit@rabbitmq1

    • 每台主机看到的只有一个的server信息。目前尚未组合成集群

    在这里插入图片描述

  • 5、添加用户并设置密码

    • 由于guest这个用户,只能在本地访问,所以我们要在每个节点上,新增一个用户并赋予对/的所有权限,然后添加到管理员组中,让此用户能够远程访问
    • 三个主机都操作
    • rabbitmqctl add_user admin admin
    • rabbitmqctl set_permissions -p “/” admin “.*” “.*” “.*”
    • rabbitmqctl set_user_tags admin administrator
      • 命令行添加用户,设置tags
(开发者)查看所有的队列:rabbitmqctl list_queues

(开发者)清除所有的队列:rabbitmqctl reset

 添加用户:rabbitmqctl add_user username password

 username  换掉 passwd 换掉

 分配角色:rabbitmqctl set_user_tags username administrator 
# 删除用户命令
 rabbitmqctl delete_user testuser
  • 新增虚拟主机:rabbitmqctl add_vhost vhost_name
[root@rabbitmq1 ~]# rabbitmqctl add_vhost iphone
Creating vhost "iphone" ...
...done.
  • 将新虚拟主机授权给新用户:rabbitmqctl set_permissions -p vhost_name username “.*” “.*” “.*”(后面三个”*”代表用户拥有配置、写、读全部权限)

  • 6、访问测试

    • http://ip:15672
    • 默认账号密码:guest/guest
      在这里插入图片描述
  • 客户端介绍

    • 1、界面介绍
      请添加图片描述
  • 2、设置虚拟主机与添加用户

    • 添加用户请添加图片描述
      请添加图片描述
组成集群
  • 简介

    • rabbitmq-server 启动时,会一起启动:节点和应用,它预先设置RabbitMQ应用为standalone(脱机)模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。(停应用,不停止节点)
  • 1、将node2、node3加入到node1中组成集群

    • 磁盘节点

      • 第二台节点
 node2# rabbitmqctl stop_app 

 仅停止应用,不关闭节点(注意是节点2)

node2# rabbitmqctl join_cluster rabbit@rabbitmq1

集群名字一定不要写错(查看rabbitmq1 的节点状态)

 node2# rabbitmqctl start_app
  • 如果此时查看节点1,会发现集群节点信息增加
          [root@rabbitmq1 ~]# rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbitmq1 ...
          [{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2]}]},
           {running_nodes,[rabbit@rabbitmq2,rabbit@rabbitmq1]},
           {cluster_name,<<"rabbit@rabbitmq1">>},
           {partitions,[]}]
          ...done.
          
  • 第三台节点
node3# rabbitmqctl stop_app      

node3# rabbitmqctl join_cluster rabbit@rabbitmq1           ##集群名字一定不要写错

node3# rabbitmqctl start_app
  • 如果此时查看节点1,会发现集群节点信息增加
  [root@rabbitmq1 ~]# rabbitmqctl cluster_status
  Cluster status of node rabbit@rabbitmq1 ...
  [{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]},
   {running_nodes,[rabbit@rabbitmq3,rabbit@rabbitmq2,rabbit@rabbitmq1]},
   {cluster_name,<<"rabbit@rabbitmq1">>},
   {partitions,[]}]
  ...done.
  
  • 内存节点(了解)
#使用内存节点加入集群
 node2 # rabbitmqctl join_cluster --ram rabbit@rabbitmq1
  • 2、在任意节点上查看集群状态
 node3# rabbitmqctl cluster_status
  • 输出信息

    [root@rabbitmq2 ~]# rabbitmqctl cluster_status
    Cluster status of node rabbit@rabbitmq2 ...
    [{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]},
     {running_nodes,[rabbit@rabbitmq3,rabbit@rabbitmq1,rabbit@rabbitmq2]},
     {cluster_name,<<"rabbit@rabbitmq1">>},
     {partitions,[]}]
    ...done.
    
    
    [root@rabbitmq3 ~]# rabbitmqctl cluster_status
    Cluster status of node rabbit@rabbitmq3 ...
    [{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]},
     {running_nodes,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]},
     {cluster_name,<<"rabbit@rabbitmq1">>},
     {partitions,[]}]
    ...done.
    
    
  • 3、在任意节点上设置镜像队列策略

    • 在web界面登陆,点击“Admin–Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机,同时给用户“admin”和“guest”均加上权限(在页面直接设置、点点点即可);
    • 然后在linux中设置镜像队列策略:
      • 语法介绍
        • rabbitmqctl set_policy -p vhost1 ha-all “^” ‘{“ha-mode”:“all”}’
      • 案例中的命令
        • rabbitmqctl set_policy -p jinlongyu ha-all “^” ‘{“ha-mode”:“all”}’
      • 注释
        • “coresystem”
          • vhost名称,此处应该填写“jinlongyu”
        • ha-all
          • 策略名称
        • “^”
          • queue的匹配模式为匹配所有的队列
        • { }
          • 为镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
          • ha-mode
            • 指明镜像队列的模式,有效值为 all/exactly/nodes
            • all
              • 表示在集群中所有的节点上进行镜像,包含新增节点
            • exactly
              • (可选)表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
            • nodes
              • (可选)表示在指定的节点上进行镜像,节点名称通过ha-params指定
          • ha-sync-mode
            • (可选)进行队列中消息的同步方式,有效值为automatic和manual
        • 提示
          • ​ 此时镜像队列设置成功。队列会被复制到各个节点,各个节点状态保持一致(这里的虚拟主机vhost1 。是代码中需要用到的虚拟主机,虚拟主机的作用是做一个消息队列进行隔离,本质上可认为是一个rabbitmq-server,是否增加虚拟主机,增加几个,这是由开发中的业务决定,即有哪几类服务,哪些服务用哪一个虚拟主机,这是一个规划)。

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

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

相关文章

基于java五台山景点购票系统(源码+论文+部署讲解等)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台的优…

自建Gitlab和Gitlab runner并推送镜像到Harbor

1. 创建虚拟机 整体规划如下 1.1 创建3台虚拟机 系统版本Centos7.9 设置IP分别为 192.168.200.201 、192.168.200.202、 192.168.200.203 1.2 安装docker 3台虚拟机都安装docker&#xff0c;参考文章 安装docker 1.3 修改daemon.json 修改 /etc/docker/daemon.json 文件…

【数字信号处理】第3章 离散时间信号和系统的频域分析,系列的离散时间傅里叶变换,性质,定理(清华大学)

目录 第3章 离散时间信号和系统的 引言 信号和系统的分析方法有两种 模拟信号与系统的时域分析 模拟信号与系统的频域分析 离散时间信号和系统 历史回顾 3.1.1 序列的离散时间傅里叶变换 3.1.2 序列的离散时间傅里叶变换的性质 1. DTFT的周期性 2. 线性 3. 时移(位移…

守护网站心脏:HAProxy负载均衡技术详解(全网最详细)

守护网站心脏&#xff1a;HAProxy负载均衡技术详解 文章目录 **守护网站心脏&#xff1a;HAProxy负载均衡技术详解**haproxy介绍特点功能配置结论 haproxy负载均衡测试haproxy主机操作日志重定向操作 webserver1主机操作webserver2主机操作 haporxy相关配置测试backup参数测速h…

Petalinux 使用相关问题

文章目录 Petalinux 交叉编译环境Petalinux 以太网相关Petalinux 应用层写寄存器操作 Petalinux 交叉编译环境 方法一&#xff1a; 注意&#xff1a;该方法安装时会 和 Petalinux的 gcc-multilib 冲突&#xff1b; sudo apt install cmake sudo apt-get install gcc-arm-lin…

网络协议 十一 ARP,RARP,icmp,websocket,webservice,HTTPDNS,FTP,邮件相关的协议, SMTP,POP,IMAP

ARP 已知IP 求 MAC 的过程 RARP 已知MAC 求 IP 的过程&#xff0c;已被DHCP取代 ICMP websocket 协议&#xff0c;html5中提出的前端使用协议 webservice 技术&#xff0c;已过时 HTTPDNS 之前我们要获得 某一个域名的 IP &#xff0c;要通过DNS协议 去 运营商的ISP 查询&…

Java | Leetcode Java题解之第327题区间和的个数

题目&#xff1a; 题解&#xff1a; class Solution {public int countRangeSum(int[] nums, int lower, int upper) {long s 0;long[] sum new long[nums.length 1];for (int i 0; i < nums.length; i) {s nums[i];sum[i 1] s;}return countRangeSumRecursive(sum,…

我对意义产生了怀疑!当今社会,一个最基本的因果律(深度好文)——早读(逆天打工人爬取热门微信文章解读)

有时候热搜也是一种预示 引言Python 代码第一篇 洞见 当今社会&#xff0c;一个最基本的因果律&#xff08;深度好文&#xff09;第二篇 空仓结尾 引言 今天真的晚 不过今天会更新两篇 破事真的多 有些人真的很神奇 在你做的时候不断来干预你 然后做得一般的时候就说 你的计划…

计算机图形学 | 动画模拟

动画模拟 布料模拟 质点弹簧系统&#xff1a; 红色部分很弱地阻挡对折 Steep connection FEM:有限元方法 粒子系统 粒子系统本质上就是在定义个体和群体的关系。 动画帧率 VR游戏要不晕需要达到90fps Forward Kinematics Inverse Kinematics 只告诉末端p点&#xff0c;中间…

Simple RPC - 03 借助Netty实现异步网络通信

文章目录 Pre设计技术点1. 接口设计2. 命令类设计3. 异步通信4. 异常处理与超时机制5. 背压机制6. 响应处理 Code封装通信 Transport 接口抽象数据的请求和响应 Command关于版本号 Transport 接口实现类 NettyTransport兜底的超时机制 背压机制 实现 总结 Pre Simple RPC - 01…

ComfyUI中,“鼠标忽然不太好用了”的解决方案---新版本偶遇bug

&#x1f387;背景 这是个很奇怪的界面bug。 最近几天感觉Comfyui的界面操作不好用了&#xff0c;就是鼠标移动到一个节点上&#xff0c;如果想要缩放&#xff0c;按道理应该是在1的位置&#xff0c;但是需要移动到2的位置才能触发缩放的操作。 节点连线的时候&#xff0c;线…

图纸变更频繁,版本管理的高效方法

在工程设计领域&#xff0c;图纸作为设计与制造的核心载体&#xff0c;其变更频繁性已成为常态。如何高效地管理这些不断变化的图纸版本&#xff0c;确保设计信息的准确性和一致性&#xff0c;是每个设计团队面临的重要挑战。本文将探讨几种高效管理图纸版本的方法&#xff0c;…

工作绩效品谷系统2024(代码+论文+ppt)

工作绩效品谷系统2024((代码论文ppt),编号:sp009 代码经过修正,确保可以运行,下载地址在文末 技术栈: springbottvuemysql 展示: 下载地址: https://download.csdn.net/download/hhtt19820919/89639099 备注: 专业承接各种程序java,c,c,python,cuda,AI 专业承接论文指导…

haproxy详解

目录 一、haproxy简介 二、什么是负载均衡 2.1 负载均衡的类型 2.2.1 硬件 2.2.2 四层负载均衡 2.2.3 七层负载均衡 2.2.4 四层和七层的区别 三、haproxy的安装及服务信息 3.1 示例的环境部署&#xff1a; 3.2 haproxy的基本配置信息 3.2.1 global 配置参数介绍 3…

Java实战一 手动创建springboot3+mybatis+mysql工程

idea手动创建sb工程&#xff0c;选择好配置&#xff0c;使用jdk17 main下补全目录resource resource下补全application.yml 引入依赖 &#xff0c;写入父工程 刷新maven 补全配置 创建所需目录 创建User实体类 创建启动类BootDemoApplication 运行启动类成功看到运行在8080端…

java-activiti笔记

版本&#xff1a;activiti7 <dependency><groupId>org.activiti</groupId><artifactId>activiti-json-converter</artifactId><version>7.0.0.Beta2</version><exclusions><exclusion><groupId>org.mybatis</g…

2025年第五届国际计算机通信与信息系统会议(CCCIS 2025) 即将召开!

2025第五届计算机通信与信息系统国际会议&#xff08;CCCIS 2025&#xff09;将于2025年2月28日至3月2日在中国香港举行&#xff0c;本次会议由香港珠海学院主办&#xff0c;新加坡传感器与系统学会支持。CCCIS主要面向通信软件和网络领域的研究人员。它为这些领域研究人员之间…

springboot牙科就诊管理系统--论文源码调试讲解

2 相关技术 2.1 MySQL数据库 本设计用到的数据库就是MySQL数据库[3]&#xff0c;之所以用到这个数据库的原因很多。首先&#xff0c;从满足功能需求上面来讲&#xff0c;MySQL是符合的&#xff1b;其次&#xff0c;从学习程度来讲&#xff0c;MySQL相比其他数据库不管是从安装…

uniapp 中 web-view 向 App 传递消息

web-view向App传递消息 引入官方库 在web项目中引入官方库 uni.webview.1.5.4.js &#xff0c;可以从uniapp官方示例库中下载&#xff0c;下载后放入web项目目录下即可&#xff0c;本文放在js文件夹中&#xff0c;然后在web项目页面中引入。 官网对于uni-app使用web-view的介…

VideoPlayer插件的用法

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取文件类型"相关的内容&#xff0c;本章回中将介绍如何播放视频.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用…