RocketMQ系统性学习-RocketMQ高级特性之文件恢复与 CheckPoint 机制

news2025/2/6 1:09:00

🌈🌈🌈🌈🌈🌈🌈🌈
【11来了】文章导读地址:点击查看文章导读!
🍁🍁🍁🍁🍁🍁🍁🍁

文件恢复与 CheckPoint 机制

文件恢复的目的:

让 Broker 重新启动之后,可以完成对 flushedPosition、commitedWhere 指针位置的设置,让程序可以知道上次写的位置,可以继续接收消息在上次写的位置之后继续写数据!

如何检测是否正常:

  • 首先检查 Broker 是否正常退出的标准就是abort 文件是否存在,如果存在表示 Broker 异常退出

    abort 文件是 Broker 启动时会创建的一个临时文件,当 Broker 正常退出时,通过注册的 JVM 钩子函数就会将 abort 文件删除掉;如果异常关闭,则 abort 文件被保留,代表 Broker 异常退出

  • 检查 Commitlog、ConsumeQueue、IndexFile 文件是否正常的标准就是: checkpoint 文件

    checkpoint 会记录三个偏移量,在这三个偏移量之前的数据都是正常的:

    • physicMsgTimestamp:物理偏移量,记录 CommitLog 上一次刷盘的时点
    • logicsMsgTimestamp:逻辑偏移量,记录 ConsumeQueue 的刷盘时点
    • indexMsgTimestamp:索引偏移量,记录 IndexFile 的刷盘时点

查找执行文件恢复方法的入口:

Broker 文件恢复入口在 DefaultMessageStore # load(),那么是从哪里调用这个恢复的入口呢?(在 Broker 启动的时候)

  • BrokerStartupmain() 主启动类中,调用了 createBrokerController() 方法

  • BrokerStartupcreateBrokerController() 中调用了 initialize() 方法

  • BrokerControllerinitialize() 方法中,调用了 recoverAndInitService() 方法

  • BrokerControllerrecoverAndInitService() 方法中,调用了 load() 方法:result = this.messageStore.load()

文件恢复的流程:

首先文件恢复总体的流程如下:

在这里插入图片描述

那么文件恢复的入口就是在 DefaultMessageStore # load() 方法中:

  1. 首先判断 abort 文件是否存在:boolean lastExitOK = !this.isTempFileExist()
  2. 加载 Commitlog 文件,调用 result = this.commitLog.load()
    • 去存储 Commitlog 文件的目录下,加载所有 Commitlog 文件,并将 Commitlog 文件构建为 MappedFile 逻辑对象
    • 将构建好的 MappedFile 逻辑对象的三个变量值设置为初始值:将 WrotePosition、FlushedPosition、CommitedPosition 的值先初始化为文件大小
  3. 加载 ConsumeQueue 文件,调用 result = result && this.consumeQueueStore.load()
    • 在这里会去存储 consume files 文件的目录下,加载所有文件并且创建 ConsumeQueue 逻辑对象
    • 构建 topic、queueId、consumeQueue 三者的关系:<topic : <queueId : consumeQueue>>
  4. 数据恢复主要是在 this.recover(lastExitOK) 方法

那么接下来进入到 recover(lastExitOK) 方法中,看数据恢复的逻辑是怎样的:

  1. 如果 lastExitOK 是 true,表示 Broker 正常退出,通过 this.commitLog.recoverNormally(maxPhyOffsetOfConsumeQueue) 恢复

    这个方法是在 CommitLog 类中,是对 CommitLog 文件进行恢复

    • 在正常退出时,对 commieLog 恢复的逻辑为:从倒数第三个文件开始恢复,恢复完成后设置 flushedWhere 和 commitWhere 两个偏移量,并且将多余的文件删除
  2. 否则,表示 Broker 异常退出,通过 this.commitLog.recoverAbnormally(maxPhyOffsetOfConsumeQueue) 恢复

    • 在异常退出时,对 commieLog 恢复的逻辑为:从倒数第一个文件开始恢复,迭代 mappedFiles 集合,找到 mappedFile 中的第一条写入的消息,校验是否满足条件,如果满足则从这个文件开始恢复,恢复完成后设置 flushedWhere 和 commitWhere 两个偏移量,并且将多余的文件删除

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

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

相关文章

理解AI思维链:AI领域的核心概念及其意义

理解AI思维链&#xff1a;AI领域的核心概念及其意义 引言AI思维链的定义AI思维链的重要性实际应用案例分析面临的挑战与未来展望结语 引言 在这个日益由数据驱动的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为科技领域的一颗耀眼的明星&#xff0c;其影响力遍…

TG5032CGN TCXO / VC-TCXO(超高稳定10pin端子型)

TG5032CGN 晶振是EPSON推出的一款额定频率10MHz至40MHz的石英晶体振荡器&#xff0c;该型号采用互补金属氧化物半导体技术&#xff0c;输出波形稳定可靠。外形尺寸为5.0 3.2 1.45mm具有小尺寸,高稳定性。该款晶体振荡器&#xff0c;可以在G&#xff1a;-40C至 85C的温度内稳定…

达梦到达梦的外部链接dblink(DM-DM DBLINK)

一. 使用场景&#xff1a; 部链接对象&#xff08;LINK&#xff09;是 DM 中的一种特殊的数据库实体对象&#xff0c;它记录了远程数据库的连接和路径信息&#xff0c;用于建立与远程数据的联系。通过多台数据库主库间的相互通讯&#xff0c;用户可以透明地操作远程数据库的数…

v-if与v-show的区别

v-if指令可以控制一个元素的显示和隐藏&#xff0c;那么它是如何实现的&#xff1f;它和看起来很像的v-show指令有什么区别呢&#xff1f; 如果v-if指令的值为假&#xff0c;那么这个元素不会被插入DOM。 下面的代码 <div v-if"true">one</div><div…

海外社媒营销新趋势,品牌出海如何做?

社交媒体在网上的影响力是毋庸置疑的。投资社交媒体平台并建立公司形象&#xff0c;提高产品运营收入&#xff0c;提升品牌知名度&#xff0c;对于吸引对您所提供的产品感兴趣的人至关重要。 然而&#xff0c;社交媒体格局总是在变化&#xff0c;这意味着您需要掌握新的社交媒…

【Jmeter】循环执行某个接口,接口引用的参数变量存在规律变化

变量设置成下面的值即可 ${__V(supplierId_${supplierIdNum})}

【项目问题解决】% sql注入问题

目录 【项目问题解决】% sql注入问题 1.问题描述2.问题原因3.解决思路4.解决方案1.前端限制传入特殊字符2.后端拦截特殊字符-正则表达式3.后端拦截特殊字符-拦截器 5.总结6.参考 文章所属专区 项目问题解决 1.问题描述 在处理接口入参的一些sql注入问题&#xff0c;虽然通过M…

基于SSM的在线学习系统的设计与实现论文

基于SSM的在线学习系统的设计与实现 摘要 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的管理系统。本文介绍了在线学习系统的开发全过程。通过分析企业对于在线学习系统的需求&#xff0c;创建了一个计算机管理在线学习系统的方案。文章介绍了在线学习…

研究生课程 |《数值分析》复习

搭配往年真题册食用最佳。

SpringMVC:整合 SSM 上篇

文章目录 SpringMVC - 03整合 SSM 上篇一、准备工作二、MyBatis 层1. dao 层2. service 层 三、Spring 层四、SpringMVC 层五、执行六、说明 SpringMVC - 03 整合 SSM 上篇 用到的环境&#xff1a; IDEA 2019&#xff08;JDK 1.8&#xff09;MySQL 8.0.31Tomcat 8.5.85Maven…

Linux磁盘空间不足扩展

先在虚拟机Vmware上扩展磁盘空间 后将fdisk 进行分区之后&#xff0c;在/dev/中找不到新分区文件 3.创建物理卷pv时发现找不到/dev/sda3分区&#xff0c;通过ls查看确认在/dev/中没有找到新分区文件 4.解决方法 执行&#xff1a;partprobe 再查看/dev中是否可以看到新分区文件…

linux中playbook的控制语句

本章主要介绍 playbook中的控制语句。 使用 when 判断语句 block-rescue判断 循环语句 一个play中可以包含多个task&#xff0c;如果不想所有的task全部执行&#xff0c;可以设置只有满足某个 条件才执行这个task&#xff0c;不满足条件则不执行此task。本章主要讲解when 和 …

python:删除空白

删除字符串末尾的空白 例如&#xff0c;下面的代码&#xff0c;变量hobby指向的字符串在末尾有一个空格&#xff1a; 可以使用函数rstrip()删除字符串末尾的空格&#xff0c;如下&#xff1a; 因为删除字符串末尾的空格并没有赋值给原变量hobby&#xff0c;所以此时查看hobb…

众和策略股市行情分析:股市里什么叫外资?外资股是什么?

股市里什么叫外资&#xff1f; 外资就是指的国外本钱&#xff0c;即国外出资者参与到我国股市所投入的本钱。通常情况下&#xff0c;外资主要靠直接或直接持有我国股市的股票来达成注入本钱的意图。比较于内资&#xff0c;外资更多的注重于我国商场的整体情况&#xff0c;采用…

什么是伦敦金的假突破?假突破为何有效?

部分投资者做伦敦金交易的时候喜欢追逐那些强势的行情&#xff0c;也就是我们所说的突破行情。但是突破行情会带来两种结果&#xff0c;一种是突破成功&#xff0c;而另一种是出现假突破。什么是伦敦金中的假突破呢&#xff1f;为什么假突破会有效呢&#xff1f;下面我们就来讨…

狮子目标检测数据集VOC+YOLO格式1400张

狮子&#xff08;Lion&#xff09;是一种生活在非洲和印度的大型猫科动物。它们是一种非常强壮和威猛的动物&#xff0c;通常被称为“草原之王”。狮子的身体结构非常适应于它们的生活方式&#xff0c;有着强壮的肌肉和锋利的牙齿。 狮子的身高一般在1.2-1.5米之间&#xff0c…

Ajax Search Pro Live WordPress网站内容实时搜索插件

点击阅读Ajax Search Pro Live WordPress网站内容实时搜索插件原文 Ajax Search Pro Live WordPress网站内容实时搜索插件是 WordPress 最好的实时搜索引擎插件。高度可定制&#xff0c;具有许多功能和选项&#xff0c;可提供最佳结果&#xff01;用更美观、更高效的搜索引擎替…

大数据---34.HBase数据结构

一、HBase简介 HBase是一个开源的、分布式的、版本化的NoSQL数据库&#xff08;即非关系型数据库&#xff09;&#xff0c;依托Hadoop分布式文件系统HDFS提供分布式数据存储&#xff0c;利用MapReduce来处理海量数据&#xff0c;用Zookeeper作为其分布式协同服务&#xff0c;一…

光条中心线提取-Steger算法 [OpenCV]

在线结构光视觉传感器中&#xff0c;由线激光器发射出的线结构光&#xff0c;在本质上为一个连续且具有一定厚度的空间光平面&#xff0c;而在目标表面上所形成的具有一定宽度的光条特征&#xff0c;即为该光平面与目标表面相交而成的交线。在该空间光平面的厚度方向上&#xf…

众和策略证券开户首选:股票增持是好还是坏?大股东增持规定?

股票增持是好仍是坏&#xff1f; 股东增持在一定程度上反映股东对个股比较看好&#xff0c;大量的买单&#xff0c;增加了市场上的多方力气&#xff0c;会推动股价上涨&#xff0c;是一种利好消息。 一般大股东会增持可能是上市公司运营成绩较好&#xff0c;具有较大的发展前…