每个fsimage文件包含文件系统中的所有目录和文件inode的序列化信息。每个inode是一个文件或者目录的元数据的内部描述方式。 数据块block存储在datanode中,但是fsimage文件并不描述datanode。但是namenode会将数据块的映射关系放在内存中。当DataNode加入集群时,namenode想datanode索取块列表以建立块映射关系。
如果namenode发生故障,最近的fsimage文件将被载入到内存中,以重构元数据的最近状态,再从相关点开始向前 执行**编辑日志(edits文件)**中的每个事务。如上所述,编辑日志edits会无限增长,尽管这种情况对于namenode的运行没有任何影响,但是由于需要恢复编辑日志的各种事务,namenode的重启操作比较耗时。在这段时间内,文件系统(HDFS)将处于离线状态,服务不可用。为了解决namenode重启耗时问题,引入了 secondarynamenode1. Secondary Namenode的目录结构
Secondary Namenode的检查点目录结构与namenode相同,这种设计的好处是,在主namenode发生故障时,可以从Secondary Namenode恢复数据。2. Secondary Namenode作用
解决namenode重启耗时问题,减少namenode的工作压力,定期合并fsimage文件和编辑日志。为namenode内存中的文件元数据创建检查点。3. 创建检查点,合并流程
① Secondary Namenode 请求 namenode停止使用正在进行中的edits文件,这样以后新的编辑操作记录到一个新文件中,namenode还会更新所有存储目录中的seen_txid文件。② Secondary Namenode 从 namenode获取最近 fsimage 和 edits文件。③ Secondary Namenode将 fsiamge文件载入内存,逐一执行edtis文件的事务操作。创建新的合并后的fsimage文件(_.ckpt结尾)④ Secondary Namenode 将新的fsimage发送回namenode ,namenode其保存为临时的.ckpt文件。⑤ namenode重新命名临时的fsimage文件,便于日后使用。最终,那么namenode拥有新的fsimage文件和一个小的正在进行中的edtis文件。Secondary Namenode 和 namenode 拥有相近的内存需求,因此Secondary Namenode需要运行在一台专用机器上,与 namenode 分开。
4. 创建检查点的条件