doCheckpoint分析
1、通过namenode协议rollEditLog(滚动日志,日志流量切换到edits.new,并且会记录fstime);
2、调用ingest类,消化所有日志到从节点内存;
3、从节点调用rollEditLog滚动日志;
4、保存命名空间到磁盘上(本地+nfs)saveNamespace;
5、putFSImage操作到主节点(primary本地+nfs);
6、通过namenode协议rollFsImage,滚动primary镜像;
putFSImage分析
1、通过http先调用主节点GetImageServlet的分支putImage;
2、主节点通过http方式到从节点的current目录获取fsimage,写入到current的文件fsimage.ckpt;
3、校验获取到的fsimage.ckpt文件内容是否完整(是否由于网络有损坏);
rollFsImage分析
1、判断是否已经滚动过日志;
if (ckptState != CheckpointStates.UPLOAD_DONE) {
throw new IOException("Cannot roll fsImage before rolling edits log.");
}
2、判断edits.new文件是否存在;
if (!editLog.existsNew()) {
throw new IOException("New Edits file does not exist");
}
3、判断fsimage.ckpt文件是否存在;
4、重命名edits.new ->edits;(将之前的edits删除,将edits.new重命名,打开日志流)
5、将fsimage.ckpt重命名为fsimage;
6、清除image目录与edits目录下不属于2者的文件;
7、将版本写入到current版本文件;