Hadoop2.6 Namenode的高可用原理可以表示为以下过程:
NN-HA原理下面把各个组件的作用说明如下:
-
Active NameNode 和 Standby NameNode:两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。主 NameNode 把EditLog写入 JN中,备 NameNode 从JN中获取EditLog合并到FSImage中。
-
主备切换控制器 ZKFailoverController:ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。
ZKFailoverController 进程是HA中比较核心的组件,它一方面监控着NaneNode进程(通过HealthMonitor线程),另一方面监控这Zookeeper进程(通过ActiveStandbyElector线程)。涉及到监控就会有超时时间设置。在笔者运维过的Hadoop系统中,出现过NameNode的Active节点经常发生切换的现象,都是因为ZKFailoverController监控Zookeeper和NameNode的超时时间设置过短导致的。
ZKFailoverController监控NameNode的超时配置项是:ha.health-monitor.rpc-timeout.ms,默认是50000ms,可以适当调长一些
<!-- HealthMonitor check namenode 的超时设置,默认50000ms,改为5mins -->
<property>
<name>ha.health-monitor.rpc-timeout.ms</name>
<value>300000</value>
</property
ZKFailoverController监控Zookeeper的超时配置项是:ha.zookeeper.session-timeout.ms,默认是5000ms,也可以适当调长一些
<!-- zk failover的session 超时设置,默认5000ms,改为3mins -->
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>180000</value>
</property>
-
Zookeeper 集群:为主备切换控制器提供主备选举支持。
-
共享存储系统JournalNode:共享存储系统是实现 NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 EditLog。主 NameNode 和备NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务。
-
DataNode 节点:除了通过共享存储系统共享 HDFS 的元数据信息之外,主 NameNode 和备 NameNode 还需要共享 HDFS 的数据块和 DataNode 之间的映射关系。DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。
Hadoop的ResourceManager也实现了HA的功能,但是相对比较简单:
RM HARM的HA只是利用Zookeeper来实现主从切换,但是大体原理跟NameNode的原理差不多。
在自动故障转移方面,RM不需要运行单独的守护进程ZKFC,因为RM有内置的基于ZooKeeper的ActiveStandbyElector类用于在active RM宕机或者无响应时自动选择哪个standbyRM将做为active RM,因为该类实现了ZKFC的功能。
网友评论