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 重启恢复数据的资料请关注脚本之家其它相关文章!

相关文章

  • Spring拦截器之HandlerInterceptor使用方式

    Spring拦截器之HandlerInterceptor使用方式

    这篇文章主要介绍了Spring拦截器之HandlerInterceptor使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java 解决读写本地文件中文乱码的问题

    Java 解决读写本地文件中文乱码的问题

    这篇文章主要介绍了Java 解决读写本地文件中文乱码的问题的相关资料,需要的朋友可以参考下
    2017-01-01
  • Mybatis 动态sql的编写与开启二级缓存

    Mybatis 动态sql的编写与开启二级缓存

    二级缓存是Mapper级别的缓存,多个SqlSession去操作同一个Mapper中的SQL语句,则这些SqlSession可以共享二级缓存,即二级缓存是跨SqlSession的,这篇文章主要介绍了Mybatis 动态sql的编写|开启二级缓存,需要的朋友可以参考下
    2023-02-02
  • Java 字符串拼接竟然有这么多姿势(收藏版)

    Java 字符串拼接竟然有这么多姿势(收藏版)

    这篇文章主要介绍了Java 字符串拼接竟然有这么多姿势,很值得大家收藏,需要的朋友可以参考下
    2019-11-11
  • SpringBoot在IDEA中实现热部署的步骤

    SpringBoot在IDEA中实现热部署的步骤

    这篇文章主要介绍了SpringBoot在IDEA中实现热部署的步骤,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-11-11
  • java中文传值乱码问题的解决方法

    java中文传值乱码问题的解决方法

    这篇文章主要为大家详细介绍了java中文传值乱码问题的解决方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Java使用wait和notify实现线程之间的通信

    Java使用wait和notify实现线程之间的通信

    Java 线程通信是将多个独立的线程个体进行关联处理,使得线程与线程之间能进行相互通信,下面这篇文章主要给大家介绍了关于Java使用wait和notify实现线程之间通信的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • java二叉树的遍历方式详解

    java二叉树的遍历方式详解

    这篇文章主要为大家详细介绍了java实现二叉树遍历的四种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-08-08
  • idea在运行期间,实现让修改的页面实时生效

    idea在运行期间,实现让修改的页面实时生效

    这篇文章主要介绍了idea在运行期间,实现让修改的页面实时生效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • IntelliJ IDEA的数据库管理工具实在太方便了(推荐)

    IntelliJ IDEA的数据库管理工具实在太方便了(推荐)

    这篇文章主要介绍了IntelliJ IDEA的数据库管理工具实在太方便了,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09

最新评论