1
在Hadoop 1.x 中,Namenode是集群的单点故障,一旦Namenode出现故障,整个集群将不可用,重启或者开启一个新的Namenode才能够从中恢复。
这里注意一下,SecondaryNamenode并没有提供故障转移的能力。
那么这里怎么避免这种单点故障呢?不可否认我们会遇到这种突然在namenode节点上的主机突然down掉。或者在升级维护时,要停止一段时间namenoode。然而,namenode掌握着整个hdfs的元数据信息,一旦namenode挂掉,这个hdfs就无法访问,同时依赖于hdfs的各个组件也无妨正常工作。
于是在Hadoop2.0中,HDFS NameNode 和 YARN ResourceManger(JobTracker 在 2.0 中已经被整合到 YARN ResourceManger 之中) 的单点问题都得到了解决。
2
既然是解决单点故障,那么只要使用多个namenode不就可以了吗?但这里要保证多个namenode中只能有一个在工作,其他的不工作,但是要时时同步,工作的namenode节点上的元数据,以便在工作的namenode挂掉时候能够及时补上。这里两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。
具体的结构请看。
主备切换控制器 ZKFailoverController:ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。
Zookeeper 集群:为主备切换控制器提供主备选举支持。
DataNode 节点:除了通过共享存储系统共享 HDFS 的元数据信息之外,主 NameNode 和备 NameNode 还需要共享 HDFS 的数据块和 DataNode 之间的映射关系。DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。
这里再强调一次,NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务。
3
这里看看主备切换流程。
NameNode 主备切换主要由 ZKFailoverController、HealthMonitor 和 ActiveStandbyElector 这 3 个组件来协同实现。
这边就不仔细讲述了。具体可见:https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-name-node/,这个文章写得真的是好!!太详细了!!