NameNode
NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息等。当它运行的时候,这些信息是存在内存中的。但是这些信息也可以持久化到磁盘上。
namenode的管理主要由image和editlog完成。image是namenode元数据的镜像。editlog记录对元数据的修改,并时时flush到磁盘。因为如果直接flush到image,性能太低,可能你只改了一条数据却要flush整个image。
当namenode启动时,先将editlog中的log同步到image,然后加载image到内存
当有请求需要修改元数据时,先在内存中修改。然后将这修改条记录记入editlog,editlog是时时flush到磁盘的。所以即使这时候当机了也不会丢失数据
随着运行时间越长,可能editlog会领先image很多。所以需要有一个机制定时将editlog中的修改同步到image中,这也就是secondnode做的事情(否则editlog太大不好管理,而且下次启动要花很长时间,因为要同步editlog)
Secondary NameNode
SecondaryNameNode就是来帮助解决上述问题的,它的职责是合并NameNode的edit logs到fsimage文件中。
上面的图片展示了Secondary NameNode是怎么工作的。
首先,它定时到NameNode去获取edit logs,并更新到自己的fsimage上,一旦更新成功,将其拷贝回NameNode中。NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。
Secondary NameNode的整个目的是在HDFS中提供一个检查点。它只是NameNode的一个助手节点。这也是它在社区内被认为是检查点节点的原因。