NameNode 重启恢复数据的流程详解

 更新时间:2023年02月07日 15:58:30   作者:点滴星光  
这篇文章主要为大家介绍了NameNode 重启恢复数据的流程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

NameNode 重启恢复数据的流程

我们都知道 NameNode 中存储的是分布式存储系统的元数据,在 NameNode 重启之后,内存的数据已经丢失了的,所以需要重新加载数据。

这时候我们采用的方法是 FsImage 快照 + editslog 操作日志两种结合的方法;

那它们是怎么结合的呢?换句话说,这两种机制是通过什么联系起来的呢??

FsImage 和 editslog 的联系

在内存时的标识

FsImage 是由 editslog 经过 checkpoint 机制而得到的,也就是说先有 editslog 再有 FsImage,那么我们来回顾一下 editslog 的组织格式:

message EditLog {
  int64 txId = 1;
  // 操作类型
  int32 opType = 2;
  string path = 3;
  map<string, string> attr = 4;
}

可以看到 editslog 中是有一个 txId 的属性的,这个属性是自增的(long 类型,64位取值范围非常大,理论上不会超出了的);txId 是 editslog 的唯一标识。

txId 是在内存中维护着的,每生成一个 editslog 都会将当前 txid 赋值给它,并将 txid + 1;这个在内存维护的 txid 是当前系统中最大的 txid 即 max_txid ,在生成 FsImage 会将系统中所有数据生成快照,并将当前 max_txid 赋值给它。

我们都知道 FsImage 中有两个重要的属性:

public class FsImage {
    ......
    /**
     * 当前最大的txId
     */
    private long maxTxId;
    /**
     * 内容
     */
    private INode iNode;
    ......
}

iNode 其实就是元数据,而 maxTxId 其实就是生成 FsImage 时,系统中的 max_txid。

在磁盘中的标识

上述我们介绍了 FsImage 和 editslog 数据在内存中的标识,但是这两样数据都是需要持久化的,那么在持久化之后,怎么标识他们呢?

我们都知道他们的数据中包含了 txid ,可是这个数据是需要加载进内存才能看到的。。。

为了在刚恢复数据的时候,也能看到 txid (系统是根据 txid 来联系 FsImage 和 editslog, 进行数据恢复的),所以在持久化的时候,我们对这两种文件的命名进行了特殊的组织格式:

fsimage文件的文件名是"fsimage_txid",其中 txid 是文件系统状态的事务ID

editslog 文件的文件名是类似 “1_1000.log” 这种格式(editslog 记录的可能是多条数据)

恢复元数据的流程

  • 根据指定路径,找到 FsImage 文件的存放地点
  • 排序,找出 txid 最大的 FsImage (即最新的 FsImage)
  • 解析最新的 FsImage 数据进内存
  • 找到 editslog,并将其排序,找出 txid 比最新 FsImage 的 txid 还大的所有 editslog 文件
  • 将返回的editslog文件数据解析进内存

以上就是NameNode 重启恢复数据的流程详解的详细内容,更多关于NameNode 重启恢复数据的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot配置拦截器实现过程详解

    SpringBoot配置拦截器实现过程详解

    在系统中经常需要在处理用户请求之前和之后执行一些行为,例如检测用户的权限,或者将请求的信息记录到日志中,即平时所说的"权限检测"及"日志记录",下面这篇文章主要给大家介绍了关于在SpringBoot项目中整合拦截器的相关资料,需要的朋友可以参考下
    2022-10-10
  • Java虚拟机内存结构及编码实战分享

    Java虚拟机内存结构及编码实战分享

    这篇文章主要介绍了Java虚拟机内存结构及编码实战分享,文章围绕详细主题展开相关资料具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • Java异常区分和处理的一些经验分享

    Java异常区分和处理的一些经验分享

    这篇文章介绍了Java异常区分和处理的一些经验分享,主要是异常选择和使用中的一些误区总结与归纳,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java中Lambda表达式和函数式接口的使用和特性

    Java中Lambda表达式和函数式接口的使用和特性

    Java Lambda表达式是一种函数式编程的特性,可简化匿名内部类的写法,与函数式接口搭配使用,实现代码简洁、可读性高、易于维护的特点,适用于集合操作、多线程编程等场景
    2023-04-04
  • spring注解如何为bean指定InitMethod和DestroyMethod

    spring注解如何为bean指定InitMethod和DestroyMethod

    这篇文章主要介绍了spring注解如何为bean指定InitMethod和DestroyMethod,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • PowerJob AbstractSqlProcessor方法工作流程源码解读

    PowerJob AbstractSqlProcessor方法工作流程源码解读

    这篇文章主要为大家介绍了PowerJob AbstractSqlProcessor方法工作流程源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Java基础知识之成员变量和局部变量浅显易懂总结

    Java基础知识之成员变量和局部变量浅显易懂总结

    从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制修饰符及static所修饰
    2021-09-09
  • Java正则表达式之Pattern类实例详解

    Java正则表达式之Pattern类实例详解

    Pattern类的作用在于编译正则表达式后创建一个匹配模式,下面这篇文章主要给大家介绍了关于Java正则表达式之Pattern类的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • Java保留两位小数的实现方法

    Java保留两位小数的实现方法

    这篇文章主要介绍了 Java保留两位小数的实现方法的相关资料,需要的朋友可以参考下
    2017-06-06
  • springboot的切面应用方式(注解Aspect)

    springboot的切面应用方式(注解Aspect)

    文章总结:Spring Boot提供了三种拦截器:Filter、Interceptor和Aspect,Filter主要用于内容过滤和非登录状态的非法请求过滤,无法获取Spring框架相关的信息,Interceptor可以在获取请求类名、方法名的同时,获取请求参数,但无法获取参数值
    2024-11-11

最新评论