NameNode和SecondaryNameNode工作机制

1.简单介绍?

众所周知NameNode记录着DataNode的元数据信息,但是我们每时每刻都在对DataNode进行着操作,那么它是如何保证元数据信息的准确性的呢?

2.图解

在这里插入图片描述

2.1原理介绍

NameNode启动时,先滚动Edits并生成一个空的edits.inprogress,然后加载Edits和Fsimage到内存中,此时NameNode内存就持有最新的元数据信息。Client开始对NameNode发送元数据的增删改的请求,这些请求的操作首先会被记录到edits.inprogress中(查询元数据的操作不会被记录在Edits中,因为查询操作不会更改元数据信息),如果此时NameNode挂掉,重启后会从Edits中读取元数据的信息。然后,NameNode会在内存中执行元数据的增删改的操作。由于Edits中记录的操作会越来越多,Edits文件会越来越大,导致NameNode在启动加载Edits时会很慢,所以需要对Edits和Fsimage进行合并(所谓合并,就是将Edits和Fsimage加载到内存中,照着Edits中的操作一步步执行,最终形成新的Fsimage)。

1.看到这里我相信很多人会问Edits 和Fsimage 究竟是什么?好吧给你简单的介绍下!
Fsimage:NameNode内存中元数据序列化后形成的文件
Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算出元数据)

详解:NameNode 中的 Fsimage 和 Edits 解析

2.你能看到的问题官方肯定也是看的到的啊!所以针对启动加载慢的问题,也就出现了SecondaryNameNode,所以接下来我们来说一说SecondaryNameNode在干嘛?有时怎么干的!

SecondaryNameNode首先会询问NameNode是否需要CheckPoint(触发CheckPoint需要满足两个条件中的任意一个,定时时间到和Edits中数据写满了)。 如果需要,则首先会让NameNode滚动Edits并生成一个空的edits.inprogress,滚动Edits的目的是给Edits打个标记,以后所有新的操作都写入edits.inprogress,其他未合并的Edits和Fsimage会拷贝到SecondaryNameNode的本地,然后将拷贝的Edits和Fsimage加载到内存中进行合并,生成fsimage.chkpoint,然后将fsimage.chkpoint拷贝给NameNode,重命名为Fsimage后替换掉原来的Fsimage。NameNode在启动时就只需要加载之前未合并的Edits和Fsimage即可,因为合并过的Edits中的元数据信息已经被记录在Fsimage中。(ok,大概也就是这样的一个过程了!!!)
1.默认触发条件1小时100W次读写操作

介绍:默认触发条件设置

2.2流程介绍

2.2.1 第一阶段 NameNode启动

1.第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
2.客户端对元数据进行增删改的请求。
3.NameNode记录操作日志,更新滚动日志。
4.NameNode在内存中对数据进行增删改。

2.2.2 第二阶段 Secondary NameNode工作

1.Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode检查结果。
2.Secondary NameNode请求执行CheckPoint。
3.NameNode滚动正在写的Edits日志。
4.将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
5.Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
6.生成新的镜像文件fsimage.chkpoint。
7.拷贝fsimage.chkpoint到NameNode。
8.NameNode将fsimage.chkpoint重新命名成fsimage。

版权声明:本博客为记录本人自学感悟,转载需注明出处!
https://me.csdn.net/qq_39657909

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页