Secondary NameNode从它的名字上来看,给人的感觉是NameNode的备份。但实际上不是这样。那到底Secondary NameNode在HDFS中扮演的是什么角色呢?
从名字上来看Secondary NameNode与NameNode,都包含着NameNode,这两者是不是存在某种关系呢,先来看下NameNode是干什么的。
NameNode
NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,快信息等。当它运行的时候,这些信息会保存在内存中。同时这部分信息也会持久化到磁盘上。
- fsimage:是在NameNode启动时对整个文件系统的快照
- edits:在NameNode启动后,对文件系统改动序列
只有在NameNode重启时,edits才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edits文件会变得很大。就会面临如下问题:
- edits文件会变的很大,怎么去管理这个文件是一个挑战
- NameNode的重启会花费很长时间,因为有很多edits中改动要合并到fsimage文件上。
- 如果NameNode挂掉了,就会丢失了很多改动,因为此时的fsimage文件非常旧。
这个时候Secondary NameNode就出场了,Secondary NameNode可以来帮助解决上面问题,它的职责就是用来合并NameNode的edits到fsimage中。
Secondary NameNode
HDFS文件系统的写操作不是直接被修改到fsimage中,而是edits中,Secondary NameNode节点负责将两者进行整合。
checkpoint过程如下:
- Secondary Namenode请求Namenode停止使用edits文件,暂时将新的写操作记录到一个新文件中,如edits.new。
- Secondary Namenode节点从Namenode节点获取fsimage和edits文件(采用HTTP GET)
- Secondary Namenode将fsimage文件载入到内存,逐一执行edits文件中的操作,创建新的fsimage文件
- Secondary Namenode将新的fsimage文件发送回Namenode(使用HTTP POST)
- Namenode节点将从Secondary Namenode节点接收的fsimage文件替换旧的fsimage文件,用步骤1产生的edits.new文件替换旧的edits文件(即改名)。同时更新fstime文件来记录检查点执行的时间
注:从Hadoop0.21.0开始,辅助Namenode已经放弃不用,由checkpoint节点取而代之,功能不变。新版本同时引入一种新的Namenode,名为BackupNode。
Secondary NameNode的整个目的在HDFS中提供一个Checkpoint Node,它只是NameNode的一个助手节点
现在,我们明白Secondary NameNode所做的是在文件系统这设置一个Checkpoint来帮助NameNode更好的工作;它不是取代NameNode,也不是NameNode的备份。
Secondary NameNode的检查点进程启动,是由两个配置参数控制的:
- fs.checkpoint.period,指定连续两次检查点的最大时间间隔, 默认值是1小时。
- fs.checkpoint.size定义了edits日志文件的最大值,一旦超过这个值会导致强制执行检查点(即使没到检查点的最大时间间隔)。默认值是64MB。
关于NameNode是什么时候将改动写到edit logs中的?
这个操作实际上是由DataNode的写操作触发的,当我们往DataNode写文件时,DataNode会跟NameNode通信,告诉NameNode什么文件的第几个block放在它那里,NameNode这个时候会将这些元数据信息写到edit logs文件中。