【04】RabbitMQ的集群机制

1、RabbitMQ的性能监控

  • 关于RabbitMQ的性能监控,在管理控制台中提供了非常丰富的展示。例如:首页这个整体监控页面,就展示了非常多详细的信息:
  • 还包括消息的生产消费频率、关键组件的使用情况等等非常多的消息。都可以在这个管理控制台上展现出来。但是,对于构建一个自动化的性能监控系统来说,这个管理页面是不够用的。为此,RabbitMQ也提供了一系列的HTTP接口,通过这些接口可以非常全面的监控并且管理RabbitMQ的各种功能。
  • 这些HTTP的接口不需要专门去查手册,在部署的管理控制台页面下方已经集成了详细的文档,我们只需要打开HTTP API的页面就能看到。
  • 比如最常用的 http://[server:port]/api/overview 接口,会列出非常多的信息,包含系统的资源使用情况。通过这个接口,就可以很好的对接Promethus、Grafana等工具,构建更灵活的监控告警体系。
  • 可以看到,这里面的接口相当丰富,不光可以通过GET请求获取各种消息,还可以通过其他类型的HTTP请求来管理RabbitMQ中的各种资源,因此在实际使用时,还需要考虑这些接口的安全性。

2、RabbitMQ的备份与恢复

  • RabbitMQ有一个data目录,会保存分配到该节点上的所有消息。默认目录存放路径为:/var/lib/rabbitmq/mnesia,这个目录中的备份分为两个部分,一个是元数据(定义结构的数据),另一个是消息存储目录。
  • 对于元数据,可以在Web管理页面通过json文件直接导出或者导入:
  • 对于消息,可以手动进行备份恢复:
    • 其实对于消息,由于MQ的特性,是不建议进行备份恢复的。而RabbitMQ如果要进行数据备份恢复,也非常简单。
    • 首先,要保证要恢复的RabbitMQ中已经有了全部的元数据,这个可以通过上一步的json文件来恢复。
    • 然后,备份过程必须要先停止应用。如果是针对镜像集群,还需要把整个集群全部停止。
    • 最后,在RabbitMQ的数据目录中,有按virtual hosts组织的文件夹。你只需要按照虚拟主机,将整个文件夹复制到新的服务中即可。持久化消息和非持久化消息都会一起备份。
    • 最后注意:拷贝后的文件权限需要改为rabbitmq用户,使用命令:chown -R rabbitmq:rabbitmq ./*

3、使用联邦插件进行远程消息同步

3.1 插件的作用

  • 在企业中有很多大型的分布式场景,在这些业务场景下,希望服务也能够同样进行分布式部署。这样既可以提高数据的安全性,也能够提升消息读取的性能。例如,某大型企业,可能在北京机房和西安机房分别搭建RabbitMQ服务,然后希望西安机房需要同步北京机房的消息,这样可以让西安的消费者服务可以直接连接西安本地的RabbitMQ,而不用费尽周折去连接北京机房的RabbitMQ服务。这时要如何进行数据同步呢?搭建一个跨度这么大的内部子网显然就不太划算。这时就可以考虑使用RabbitMQ的Federation插件,搭建联邦队列Federation。通过Federation可以搭建一个单向的数据同步通道

3.2 使用步骤

  • <1> 启动插件
    • RabbitMQ的官方运行包中已经包含了Federation插件。只需要启动后就可以直接使用。
    • 相关命令:
      # 确认联邦插件
      rabbitmq-plugins list|grep federation
      [  ] rabbitmq_federation               3.13.6
      [  ] rabbitmq_federation_management    3.13.6# 启用联邦插件
      rabbitmq-plugins enable rabbitmq_federation
      # 启用联邦插件的管理平台支持
      rabbitmq-plugins enable rabbitmq_federation_management
      
    • 插件启用完成后,可以在管理控制台的Admin菜单看到两个新增选项 Federation StatusFederation Upstreams
  • <2> 配置Upstream
    • Upstream表示是一个外部的服务节点,在RabbitMQ中,可以是一个交换机,也可以是一个队列。它的配置方式是由下游服务主动配置一个与上游服务的连接,然后数据就会从上游服务主动同步到下游服务中。
    • 接下来我们用192.168.65.112上的的RabbitMQ服务来模拟DownStream下游服务,去指向一个192.168.65.193服务器上搭建的RabbitMQ服务,搭建一个联邦交换机Federation Exchange。
      • 首先要在下游RabbitMQ中声明一个交换机和交换队列,用来接收远端的数据。这里我们直接用客户端API来快速进行声明。
        public class DownStreamConsumer {public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.65.112");factory.setPort(5672);factory.setUsername("admin");factory.setPassword("admin");factory.setVirtualHost("/mirror");Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.exchangeDeclare("fed_exchange","direct");channel.queueDeclare("fed_queue",true,false,false,null);channel.queueBind("fed_queue","fed_exchange","routKey");Consumer myconsumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body)throws IOException {System.out.println("========================");String routingKey = envelope.getRoutingKey();System.out.println("routingKey >" + routingKey);String contentType = properties.getContentType();System.out.println("contentType >" + contentType);long deliveryTag = envelope.getDeliveryTag();System.out.println("deliveryTag >" + deliveryTag);System.out.println("content:" + new String(body, "UTF-8"));}};channel.basicConsume("fed_queue", true, myconsumer);}
        }
        
      • 然后在下游RabbitMQ服务中配置一个上游服务。
      • 服务的名字Name属性随意,URI指向远程服务器(配置方式参看页面上的示例):amqp://admin:admin@192.168.65.112:5672/,需要注意下,下游和上游建议使用相同的虚拟机。
      • 下面的Federated exchanges parameters和Federated queues parameters分别指定 上游(也就是远程服务器)的Exchange和Queue。如果不指定,就是用和下游中相同的Exchange和Queue。如果UpStream里没有,就创建新的Exchange和Queue。
  • <3> 配置 Federation 策略:
    • 接下来需要配置一个指向上游服务的Federation策略。在配置策略时可以选择是针对Exchange交换机还是针对Queue队列。配置策略时,同样有很多参数可以选择配置。最简化的一个配置如下:
    • 注意:每个策略的Definition部分,至少需要指定一个Federation目标。federation-upstream-set参数表示是以set集合的方式针对多个Upstream生效,all表示是全部Upstream。而federation-upstream参数表示只对某一个Upstream生效。
  • <4> 测试:
    • 配置完Upstream和对应的策略后,进入Federation Status菜单就能看到Federation插件的执行情况。状态为running表示启动成功,如果配置出错,则会提示失败原因。
    • 然后,在远程服务193的RabbitMQ服务中,可以看到对应生成的Federation交换机。
    • 并且,在fed_exchange的详情页中也能够看到绑定关系。这里要注意一下它给出了一个默认的Routing_key。
    • 接下来就可以尝试在上游服务193的fed_exchange中发送消息,消息会同步到Local本地的联邦交换机中,从而被对应的消费者消费到。

4、RabbitMQ服务高可用机制

4.1 RabbitMQ的集群机制

  • 在企业中真实使用RabbitMQ时,单机肯定是不够的。如果只是单机RabbitMQ的服务崩溃了,那还好,大不了重启下服务就是了。但是如果是服务器的磁盘出问题了,那问题就大了。因为消息都是存储在Queue里的,Queue坏了,意味着消息就丢失了。这在生产环境上肯定是无法接受的。而RabbitMQ的设计重点就是要保护消息的安全性。
  • 所以RabbitMQ在设计之初其实就采用了集群模式来保护消息的安全。基础的思想就是给每个Queue提供几个备份。当某一个服务的Queue坏了,至少还可以从其他Queue中获取服务。
  • 其实对于RabbitMQ,一个节点的服务也是作为一个集群来处理的,在web控制台的admin-> cluster 中可以看到集群的名字,并且可以在页面上修改。
  • 实际上,RabbitMQ实现了两种集群模式:
    • 普通集群模式(默认):
      • 这种模式使用Erlang语言天生具备的集群方式搭建。这种集群模式下,集群的各个节点之间只会有相同的元数据,即队列结构,而消息不会进行冗余,只存在一个节点中。消费时,如果消费的不是存有数据的节点, RabbitMQ会临时在节点之间进行数据传输,将消息从存有数据的节点传输到消费的节点。
      • 很显然,这种集群模式的消息可靠性不是很高。因为如果其中有个节点服务宕机了,那这个节点上的数据就无法消费了,需要等到这个节点服务恢复后才能消费,而这时,消费者端已经消费过的消息就有可能给不了服务端正确应答,服务起来后,就会再次消费这些消息,造成这部分消息重复消费。 另外,如果消息没有做持久化,重启就消息就会丢失。
      • 并且,这种集群模式也不支持高可用,即当某一个节点服务挂了后,需要手动重启服务,才能保证这一部分消息能正常消费。
      • 所以这种集群模式只适合一些对消息安全性不是很高的场景。而在使用这种模式时,消费者应该尽量的连接上每一个节点,减少消息在集群中的传输。
    • 镜像集群模式:
      • 这种模式是在普通集群模式基础上的一种增强方案,这也就是RabbitMQ的官方HA高可用方案。需要在搭建了普通集群之后再补充搭建。其本质区别在于,这种模式会在镜像节点中间主动进行消息同步,而不是在客户端拉取消息时临时同步。
      • 并且在集群内部有一个算法会选举产生master和slave,当一个master挂了后,也会自动选出一个来。从而给整个集群提供高可用能力。
      • 这种模式的消息可靠性更高,因为每个节点上都存着全量的消息。而他的弊端也是明显的,集群内部的网络带宽会被这种同步通讯大量的消耗,进而降低整个集群的性能。这种模式下,队列数量最好不要过多。

4.2 搭建普通集群

  • 我们准备三台服务器,在三台服务器上分别搭建起RabbitMQ的服务。在实际项目中,通常建议搭建奇数台服务的集群,因为这样的集群对官方推荐的Quorum对列更友好。

  • 然后需要再三天服务器上调整域名映射:

    	# 配置每台机器的域名vi /etc/hosts192.168.65.193 192-168-65-193192.168.65.112 192-168-65-112192.168.65.170 192-168-65-170
    
  • 接下来还需要将各个节点上的集群名字调整为 rabbit@worker1这样的形式。每个节点的集群名字对应自己的域名。做好这些准备工作,就可以来搭建集群了。

    • 1、需要同步集群节点中的cookie

      • 默认会在 /var/lib/rabbitmq/目录下生成一个.erlang.cookie。 里面有一个字符串。我们要做的就是保证集群中三个节点的这个cookie字符串一致。需要使用 ll -a 才能看到这个隐藏文件。
      • 我们将worker2和3加入到worker1的RabbitMQ集群中,所以将worker1的.erlang.cookie文件分发到worker2和3,使用命令 scp .erlang.cookie root@192.168.65.112:/var/lib/rabbitmq
      • 同步文件时注意一下文件的权限,如果文件不可读,集群启动会有问题。需要将文件的所属用户调整为rabbitmq。指令为 chown rabbitmq:rabbitmq .erlang.cookie。 另外需要注意文件的权限,必须只有当前用户可读。建议使用指令 chmod 400 .erlang.cookie 重新调整下文件权限。
    • 2、将worker2和3的服务加入到worker1的集群中

      • 首先需要保证worker1上的rabbitmq服务是正常启动的。 然后分别在worker2和3上执行以下指令:
      • RabbitMQ的集群节点分为disk和ram。disk节点会将元数据保存到硬盘当中,而ram节点是将元数据保存到内存当中的。
      • 由于ram节点减少了很多与硬盘的交互,所以,ram节点的元数据使用性能会比较高。但是,这也意味着元数据的安全性是不如disk节点的。在我们这个集群中,worker2和worker3都以ram节点的身份加入到worker1集群里,因此,是存在单点故障的。如果worker1节点服务崩溃,那么元数据就有可能丢失。在企业进行部署时,性能与安全性需要自己进行平衡。
      • 这里说的元数据仅仅只包含交换机、队列等的定义,而不包含具体的消息。因此,ram节点的性能提升,仅仅体现在对元数据进行管理时,比如修改队列queue,交换机exchange,虚拟机vhosts等时,与消息的生产和消费速度无关。
      • 如果一个集群中,全部都是ram节点,那么元数据就有可能丢失。这会造成集群停止之后就启动不起来了。RabbitMQ会尽量阻止创建一个全是ram节点的集群,但是并不能彻底阻止。所以,综合考虑,官方其实并不建议使用ram节点,更推荐保证集群中节点的资源投入,使用disk节点。
  • 3、加入完成之后,可以查看集群的状态

    • 使用指令查看集群状态:rabbitmqctl cluster_status
    • 在Web管理界面查看集群状态:

4.3 搭建镜像集群

  • 在普通集群的基础之上,可以继续搭建镜像集群。

  • 通常在生产环境中,为了减少RabbitMQ集群之间的数据传输,在配置镜像策略时,会针对固定的虚拟主机virtual host来配置。

  • RabbitMQ中的 vritual host 可以类比为MySQL中的库,针对每个虚拟主机,可以配置不同的权限、策略等。并且不同虚拟主机之间的数据是相互隔离的。

  • 我们首先创建一个/mirror的虚拟主机,然后再添加给对应的镜像策略:

    # 创建虚拟机
    rabbitmqctl add_vhost /mirror
    # 添加镜像策略
    rabbitmqctl set_policy ha-all --vhost "/mirror" "^" '{"ha-mode":"all"}'
    
  • 这些参数需要大致了解下。其中,pattern 是队列的匹配规则, ^ 表示全部匹配,^ ha \ 这样的配置表示以ha开头。通常就用虚拟主机来区分就够了,这个队列匹配规则就配置成全匹配。

  • 然后几个关键的参数:

    • HA mode: 可选值 all , exactly, nodes。生产上通常为了保证高可用,就配all
    • all : 队列镜像到集群中的所有节点。当新节点加入集群时,队列也会被镜像到这个节点。
    • exactly : 需要搭配一个数字类型的参数(ha-params)。队列镜像到集群中指定数量的节点。如果集群内节点数少于这个数字,则队列镜像到集群内的所有节点。如果集群内节点少于这个数,当一个包含镜像的节点停止服务后,新的镜像就不会去另外找节点进行镜像备份了。
    • nodes: 需要搭配一个字符串类型的参数。将队列镜像到指定的节点上。如果指定的队列不在集群中,不会报错。当声明队列时,如果指定的所有镜像节点都不在线,那队列会被删除。
  • 通常镜像模式的集群已经足够满足大部分的生产场景了。虽然他对系统资源消耗比较高,但是在生产环境中,系统的资源都是会做预留的,所以正常的使用是没有问题的。但是在做业务集成时,还是需要注意队列数量不宜过多,并且尽量不要让RabbitMQ产生大量的消息堆积。

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

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

相关文章

Segugio:一款针对恶意软件的进程执行跟踪与安全分析工具

关于Segugio Segugio是一款功能强大的恶意软件安全分析工具&#xff0c;该工具允许我们轻松分析恶意软件执行的关键步骤&#xff0c;并对其进行跟踪分析和安全审计。 Segugio允许执行和跟踪恶意软件感染过程中的关键步骤&#xff0c;其中包括从点击第一阶段到提取恶意软件的最…

YOLO-FaceV2:A Scale and Occlusion Aware Face Detector

摘要 近年来&#xff0c;基于深度学习的人脸检测算法取得了巨大进展。这些算法一般可以分为两类&#xff0c;即像Faster R-CNN这样的两阶段检测器和像YOLO这样的一阶段检测器。由于一阶段检测器在精度和速度之间取得了更好的平衡&#xff0c;因此已被广泛应用于多种场景。在本…

贪心算法与盛雨水问题

啥是盛雨水问题&#xff1f;给个图就熟悉了 欸&#xff1f; 这其中的关键在于&#xff1a; 1. 容量2D化就是长 * 宽 2. 木桶效应&#xff1a;宽取决于短板。 那我们来分析&#xff0c;怎么样能达到最佳的结果呢&#xff1f;穷举一下所有可能性不就好了&#xff1f;每两个板子…

OAK相机的RGB-D彩色相机去畸变做对齐

▌低畸变标准镜头的OAK相机RGB-D对齐的方法 OAK相机内置的RGB-D管道会自动将深度图和RGB图对齐。其思想是将深度图像中的每个像素与彩色图像中对应的相应像素对齐。产生的RGB-D图像可以用于OAK内置的图像识别模型将识别到的2D物体自动映射到三维空间中去&#xff0c;或者产生的…

Information Theoretical Estimators (ITE) Toolbox的使用(MATLAB)

Information Theoretical Estimators (ITE) Toolbox是什么 官方文档&#xff1a; ITE is can estimate several entropy, mutual information, divergence, association measures, cross quantities and kernels on distributions. Thanks to its highly modular design, ITE …

STM32G474硬件CRC16和软件CRC16校验

1、硬件CRC校验和软件CRC校验的多项式&#xff0c;以及初始值 #define CRC_Hardware_POLYNOMIAL_16B 0x8005 //硬件CRC多项式为0x8005 //CRC16x^16 x^15 x^2 1&#xff0c;因为bit151,bit21,bit01&#xff0c;所以正向校验的多项式的值为0x8005 //CRC校验分为正向校验和反…

UWA Gears:Frame Capture模式 - 着色器查看器

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 在上周的文章中&#xff0c;我们详细介绍了网格查看器的功能&#xff0c;介绍如何通过网格数据优化…

微服务电商平台课程三:基础环境搭建

后端基础环境 工具版本号功能说明下载JDK1.8java编译运行的基本环境Java Downloads | Oracledocker27.0.3容器化部署Windows | Docker Docsgit2.46.2代码版本管理&#xff0c;多人协作代码开发Git for Windowsmaven3.9.9服务的依赖管理Maven – Download Apache MavenMySQL5.7…

第十四章 章节练习echarts饼图渲染

目录 一、引言 二、完整代码 三、总结 一、引言 通过前面几个章节的学习&#xff0c;再结合日常项目中经常会使用到的echarts图&#xff0c;来完整以下功能需求&#xff0c;增强对知识点的巩固&#xff1a; 1. 基本渲染 2. 添加功能 3. 删除功能 4. 饼图渲染 运行效果图…

厨艺爱好者的在线互动平台:Spring Boot实现

摘 要 使用旧方法对厨艺交流信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在厨艺交流信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的厨艺交流平台功能…

WUP-MY-POS-PRINTER 旻佑热敏打印机票据打印uniapp插件使用说明

插件地址&#xff1a;WUP-MY-POS-PRINTER 旻佑热敏打印机票据打印安卓库 简介 本插件主要用于旻佑热敏打印机打印票据&#xff0c;不支持标签打印。适用于旻佑的各型支持票据打印的热敏打印机。本插件开发时使用的打印机型号为MY-805嵌入式面板打印机&#xff0c;其他型号请先…

2006-2023年各地级市债务余额数据

2006-2023年各地级市债务余额数据 1、时间&#xff1a;2006-2023年 2、来源&#xff1a;整理自wind 3、指标&#xff1a;地区、地方政府债-债券数量(只)、地方政府债-债券余额(亿)、地方政府债-债券余额占比(%)、城投债-债券数量(只)、城投债-债券余额(亿)、城投债-债券余额…

CentOS7安装Docker-2024

CentOS7安装Docker-2024 安装 更新yum仓库&#xff1a; yum -y update安装yum-utils并配置阿里云的docker仓库和相关插件&#xff1a; sudo yum install -y yum-utilsyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum i…

121.WEB渗透测试-信息收集-ARL(12)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;120.WEB渗透测试-信息收集-ARL&#xff08;11&#xff09; 点击管理控制台 连接成功&…

Java | Leetcode Java题解之第513题找树左下角的值

题目&#xff1a; 题解&#xff1a; class Solution {public int findBottomLeftValue(TreeNode root) {int ret 0;Queue<TreeNode> queue new ArrayDeque<TreeNode>();queue.offer(root);while (!queue.isEmpty()) {TreeNode p queue.poll();if (p.right ! nu…

w005基于Springboot学生心理咨询评估系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

SpringCloud接入nacos配置中心

这里写自定义目录标题 版本选择项目搭建pom.xml本地的 application.ymlchenfu-miniapp-dev.yml 中的配置项接收配置的实体类 版本选择 spring-cloud-Alibaba版本依赖关系 本文章&#xff0c;采用的 springboot 版本是 2.6.13&#xff0c;spring-cloud-alibaba 版本是 2021.0.5…

(二十二)、k8s 中的关键概念

文章目录 1、总体概览2、第一层&#xff1a;物理机、集群、Node、Pod 之间的关系2、第二层&#xff1a;命名空间 Namespace3、定义4、控制平面&#xff08;Control Plane&#xff09;5、特别的概念 Service6、Deployment 经过 之前几篇文章对 k8s 的实践&#xff0c;结合实践&…

AI模型库 : 下一个大型供应链攻击目标

像 Hugging Face 这样的AI模型平台&#xff0c;很容易受到攻击者多年来通过 npm、PyPI 和其他开源存储库成功执行的同类攻击的影响 Hugging Face 等AI模型存储库为攻击者提供了与 npm 和 PyPI 等开源公共存储库相同的将恶意代码植入开发环境的机会。 在今年 4 月即将举行的 Bl…

元学习-学习笔记

学习视频&#xff1a;火炉课堂 | 元学习(meta-learning)到底是什么鬼&#xff1f;_哔哩哔哩_bilibili 一、从传统机器学习到元学习 我们传统的机器学习&#xff0c;是手工设计一个模型&#xff0c;然后将训练数据投进模型中进行训练&#xff0c;得到一个最优的模型参数&#x…