消息中间件之RocketMQ源码分析(二十三)

news2024/11/20 20:22:07

Broker的关机恢复机制

概述

Broker关机恢复是指恢复CommitLog、Consume Queue、Index File等数据文件。Broker关机分为正常调用命令关机和异常被迫进程终止关机两种情况。恢复过程的设计目标是使正常停止的进程实现零数据丢失,异常停止的进程实现最少量的数据丢失,与关机恢复相关的主要文件有两个:abort和checkpoint.

abort文件

abort是一个空文件,标记当前Broker是否正常关机,Broker进程正常启动的时候,创建该文件。Broker进程正常停止后,该文件就会删除;如果异常退出,则文件依旧存在,创建和删除的过程如图

  • abort文件创建流程
    在这里插入图片描述
  • aboirt文件删除流程
    在这里插入图片描述

Checkpoint文件

checkpoint是检查点文件,保存Broker最后正常存储各种数据的时间,在重启Broker时,恢复程序知道从什么时候恢复数据。检查点逻辑由StoreCheckpoint类实现。
在StoreCheckpoint类中保存了3个时间,更新过程如图.
在这里插入图片描述

  • physicMsgTimestamp:最后一条已存储CommitLog的消息的存储时间
  • logicsMsgTimestamp:最后一条已存储Consume Queue的消息的存储时间
  • indexMsgTimestamp:最后一条已存储IndexFile的消息的存储时间
  • physicMsgTimestamp和logicsMsgTimestamp的更新都是在数据存储成功后进行的,过程比较简单。而indexMsgTimestamp的逻辑是在Index File刷盘时被更新的,Index File刷盘方法IndexService.flush()。

在这里插入图片描述

从上述代码可以看到,在IndexFile刷盘后,已刷盘文件文件的最后存储消息时间被赋值给indexMsgTimestamp,并对Checkpoint文件进行刷盘。
注:IndexFile的刷盘设计和CommitLog、Consume Queue刷盘的方式不同,容易被忽略

Broker关机恢复流程

Broker在启动时会初始化abort、checkpoint两个文件。正常关闭进程时会删除abort文件,将checkpoint文件刷盘;异常关闭时,通常来不及删除abort文件。由此,在重新启动Broker时会根据abort判断是否需要异常停止进程,而后恢复数据。Broker启动时,会启动存储服务DefaultMessageStore.存储服务在初始化时执行load方法加载全部数据,这里主要分析数据加载流程。Broker关机的恢复过程可以分为以下几步.
在这里插入图片描述

  • 第一步:Broker异常退出检查。如果abort文件存在,说明上次是异常退出的。
  • 第二步:加载延迟消息的位点信息。ScheduleMessageService服务通过继承和重写ConfigManager,调用load()方法从磁盘加载延迟位点文件的内容,并根据配置项messageDelayLevel初始化延迟级别
  • 第三步:加载全部CommitLog文件(#1部分)。通过读取CommitLog目录下的所有文件,依次加载每个CommitLog为MappedFile,并且设置写指针、已刷盘指针、已提交指针,使所有指针都指向该文件的最末位.CommitLog文件加载代码如图。如果文件大小已配置的大小不一致,恢复时
    就直接被忽略,所以,在重启时不要修改mappedFileSizeCommitLog(默认是1G)参数的值,否则数据无法恢复

在这里插入图片描述

  • 第四步:加载全部Consume Queue文件及数据(如图#2、#3)。调用loadConsumeQueue方法,读取./consumequeue/Topic/queueId/目录,加载全部Topic、queueId作为ConsumeQueue对象,再调用load()方法初始化每一个ConsumeQueue
    在这里插入图片描述
  • 第五步:初始化Checkpoint文件为StoreCheckpoint对象,并且初始化三个数据:physicMsgTimestamp、logicsMsgTimestsamp和indexMsgTimestamp.
    初始化StoreCheckpoint对象
    在这里插入图片描述
    在StoreCheckpoint构造方法中初始化三个时间戳
    在这里插入图片描述
  • 第六步:加载IndexFile索引(#4部分)。加载./index目录下的全部索引文件,如果上次进程异常退出并且索引文件操作的最后时间戳大于Checkpoint中保存的时间,则说明当前文件有部分数据可能存在错误,须立即销毁文件
  • 第七步:恢复全部数据(#5部分)lastExitOK=True,表示上次进程正常退出。全部恢复数据主要恢复ConsumeQueue、CommitLog、内存中的consumeQueueTable,并纠正Consume Queue中的最新位点值。
    在这里插入图片描述
    recoverCOnsumeQueue()方法通过循环所有Topic对应的ConsumeQueue,依次调用ConsumeQUeue.recover()方法执行数据恢复
    在这里插入图片描述
    recoverNormally()方法在Broker正常关闭后重启执行CommitLog恢复(#5,2)对于CommitLog恢复数据,这里有一个小技巧,正常恢复是从倒数第三个文件开始直到最后一个文件。正常恢复是假定数据都是正常的,大部分场景都关心最新的消息,所以恢复最新的三个文件到内存中,消息量大小为3GB,当然,如果恢复文件个数做成可配置的就更好了
    在这里插入图片描述
    recoverAbnormally()方法在Broker异常关闭后重启时执行CommitLog恢复(#5.3)CommitLog异常恢复是从最后一个文件开始反向恢复到第一个文件。因为当进程异常停止后最容易出错的是最新的某些文件。所以异常恢复时,RocketMQ从最后一个文件开始,倒序找第一个正常的文件开始恢复。

CommitLog.isMappedFileMatchedRecover()方法判断文件是否正常,整个方法的重点在于,只要文件的最后消息的存储时间都小于在Checkpoint保存的对应时间,那么该文件并未损坏。

CommitLog恢复完毕,会将该文件中的消息重新分发,创建ConsumeQueue和IndexFile。分发全部消息还是部分消息时根据duplicationEnable的值(默认为False)来判断的
在这里插入图片描述
recoverTopicQueueTable():纠正Consume Queue中最小消费位点和恢复ComitLog内存中的TopicTable(#5.4)
在这里插入图片描述

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

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

相关文章

Python:练习:输出int值a占b的百分之几。例如:输入1和4,输出:25%。

案例: 输出int值a占b的百分之几。例如:输入1和4,输出:25%。 思考: 所有的一步步思考,最后综合起来。 首先,确定 输出,那么就用input,而且是int值,所以肯定…

javaee教程郑阿奇,一线互联网架构师筑基必备技能之Java篇

一、什么情况下会发生栈内存溢出? 1、栈是线程私有的,栈的生命周期和线程一样,每个方法在执行的时候就会创建一个栈帧,它包含局部变量表、操作数栈、动态链接、方法出口等信息,局部变量表又包括基本数据类型和对象的引…

【Kubernetes】安装K3S

目录 前言一、原理单体架构高可用架构 二、初始化1.配置yum源2.关掉防火墙3.关掉selinux4. 修改内核参数5.关掉swap交换分区 三、安装master节点1. 安装container2.启动master服务 四、安装node节点五、卸载六、总结 前言 各位小伙伴们,大家好,小涛又来…

【MATLAB源码-第149期】基于MATLAB的2ASK,2FSK,2PSK,2DPSK等相干解调仿真,输出各节点波形。

操作环境: MATLAB 2022a 1、算法描述 2ASK(二进制幅移键控)、2FSK(二进制频移键控)、2PSK(二进制相移键控)和2DPSK(二进制差分相移键控)是数字调制技术中的基本调制方…

1.2 debug的六种指令的使用,四个通用寄存器

汇编语言 首先进入环境 mount c d:masm //把c挂载在d盘中的masm当中 c: //进入c,进入到编译环境 dir //查看文件,可有可无Debug是DOS、Windows都提供的实模式(8086 方式)程序的调试工具。使用它可以查看CPU各种寄存器中的内容…

同芯.共赢 | 暴雨服务器亮相AMD EPYC合作伙伴峰会

2月29日,AMD EPYC合作伙伴峰会活动在北京成功举行,暴雨作为AMD重要生态合作伙伴应邀参加。作为AMD开年首场活动,此次活动意义非凡,AMD在现场向合作伙伴分享了AMD数据中心全新产品路线、解决方案以及生态建设领域的最新进展。 AMD是…

centos服务配置springboot服务开机启动

在做后端服务运维时,经常遇到服务器重启时,需要移动一堆后端服务。服务器故障自动重启时,通常无人通知。把springboot服务的jar包配置开机启动太有必要了,虽然不是很复杂,这里记录一下太有必要了。 创建jar包启动和停…

linux下gcc编译时默认是32位还是64位,怎么指定为32or64?

本来是想研究一下long的字节大小sizeof(long)&#xff0c;于是写了代码&#xff1a; #include <stdio.h> int main() {long a 10;printf("%d\n", sizeof(a));return 0; } 我当时使用的是win10系统&#xff0c;使用的是vs 2022&#xff0c;然后对以上代码进行…

嵌入式 Linux 下的 LVGL 移植

目录 准备创建工程修改配置修改 lv_drv_conf.h修改 lv_conf.h修改 main.c修改 Makefile 编译运行更多内容 LVGL&#xff08;Light and Versatile Graphics Library&#xff0c;轻量级通用图形库&#xff09;是一个轻量化的、开源的、在嵌入式系统中广泛使用的图形库&#xff0c…

【刷题】 Leetcode 1022.从根到叶的二进制数之和

刷题 1022.从根到叶的二进制数之和题目描述&#xff1a;思路一&#xff08;dfs深搜万能版&#xff09;思路二 &#xff08;栈迭代巧解版&#xff09;总结 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff…

Qt6.8 GRPC功能使用(2)标准 Qt实现客户端

简介 基于之前的文章所说&#xff0c; Qt6.7之后才开始支持客户端、服务端、及双向流&#xff0c;恰好电脑需要重装&#xff0c;看到Qt6.8版本就直接安装了&#xff0c;内容也是使用Qt6.8的版本进行编译的 客户端实现步骤 1. 安装Qt6.8, 包含GRPC功能模块 Qt 6.8安装目录下包…

浅谈XSS简单漏洞xss-labs-master(初级)

一、环境以及xss漏洞简介 网上很多gethub自己下就行 XSS简介&#xff1a; 当用户访问被XSS注入的网页&#xff0c;XSS代码就会被提取出来。用户浏览器就会解析这段XSS代码&#xff0c;也就是说用户被攻击了。 用户最简单的动作就是使用浏览器上网&#xff0c;并且浏览器中有J…

ai作画在线生成!这8个AI生图工具一定要知道。

过去的2023年被称作AI元年&#xff0c;随之而来的2024&#xff0c;被业内人士称之为AI应用元年&#xff0c;即随着大模型和各类AI应用的涌现速度放缓&#xff0c;人们关注的焦点也从产品层面&#xff08;有哪些好用的AI应用&#xff09;&#xff0c;转移到AI如何更好地赋能实际…

Go开发 入门以VSCode为例

一、Go环境搭建 1.1 安装 进入Golang官网 https://go.dev&#xff0c;点击 Download 若无法打开网页可以使用国内的Go语言中文网 https://studygolang.com/dl 进入下载 找到合适的平台点击链接下载即可&#xff08;这里以Windows距离&#xff09; 下载完成后 Next Next 安…

33. 【Linux教程】Linux 用户组

前面小节介绍了 Linux 用户相关的增删改查&#xff0c;本小节介绍 Linux 用户组&#xff0c;Linux 系统中采取了一种安全机制&#xff08;即用户组&#xff09;&#xff0c;用户组可以允许多个 Linux 用户共享同一种权限。 1. 用户组介绍 Linux 是多任务多用户的操作系统&…

Android Studio level过滤查看各个等级的日志

Android Studio level过滤查看各个等级的日志 旧版as可以在下方的日志输出框选择debug、info&#xff0c;warn、error日志&#xff0c;新版的需要通过在过滤框手动/联想输入 level:xxx&#xff0c;过滤相应等级的日志&#xff0c;如图&#xff1a; android studio/idea返回/前进…

价格战打响!阿里云服务器和腾讯云服务器价格对比

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器62元一年&#xff0c;2核2G3M、2核4G、4核8G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配置价格表…

Unity 使用脚本获取组件,代码生成预制体

代码获取组件 using System; using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;// 必须要继承 MonoBehaviour 才是一个组件 // 类名必要与文件名一致public class c1 : MonoBehaviour {// 使用 public 初始变量时…

永磁同步电机无感FOC(龙伯格观测器)算法技术总结-实战篇

文章目录 1、ST龙伯格算法分析&#xff08;定点数&#xff09;1.1 符号说明1.2 最大感应电动势计算1.3 系数计算1.4 龙伯格观测器计算1.5 锁相环计算1.6 观测器增益计算1.7 锁相环PI计算&#xff08;ST&#xff09;1.8 平均速度的用意 2、启动策略2.1 V/F压频比控制2.2 I/F压频…

Redis---持久化

Redis是内存数据库&#xff0c;是把数据存储在内存中的&#xff0c;但是内存中的数据不是持久的&#xff0c;如果想要做到持久&#xff0c;那么就需要让redis将数据存储到硬盘上。 Redis持久化有两种策略&#xff1a; RDB > Redis DataBase RDB机制采取的是定期备份AOF …