EMR入门学习之NameNode HA(十四)

2019-11-22 19:20:10 浏览数 (1)

一、HA的原理和架构

NameNode 保存了整个 HDFS 的元数据信息,一旦 NameNode 挂掉,整个 HDFS 就无法访问。为了提高HDFS的高可用性,在 Hadoop2.0 中,HDFS NameNode支持了高可用架构,如下图。

从上图中,我们可以看出 NameNode 的高可用架构主要分为下面几个部分:

Active NameNode 和 Standby NameNode:两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。

主备切换控制器 ZKFailoverController:ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。

Zookeeper 集群:为主备切换控制器提供主备选举支持。

共享存储系统:共享存储系统是实现 NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 HDFS 的元数据。主 NameNode 和NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务,主要有JournalNode 。

DataNode 节点:除了通过共享存储系统共享 HDFS 的元数据信息之外,主 NameNode 和备 NameNode 还需要共享 HDFS 的数据块和 DataNode 之间的映射关系。DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。

二、故障切换

当Active NN故障时,Zookeeper创建的临时节点ActiveStandbyElectorLock将要被删除,其他NN节点注册的Watcher 来监听到该变化,NN节点的ZKFailoverController 会马上再次进入到创建/hadoop-ha/${dfs.nameservices}/ActiveStandbyElectorLock 节点的流程,如果创建成功,这个本来处于 Standby 状态的 NameNode 就选举为主 NameNode 并随后开始切换为 Active 状态。

新当选的Active NN将确保从QJM(Quorum Journal Manager)同步完所有的元数据文件EditLog文件,然后切换为主节点,并向外提供服务。

备注:

  1. Active NN节点通过QJM组件Standby NN同步EditLog文件。
  2. Standby 节点定时checkpoint生成Fsimage文件,并通过http协议传给Active NN节点。

三、验证Failover

在active master节点上,通过jps命令

找到master进程PID,执行kill -9 $PID,然后hdfs haadmin -getServiceState nn1 如下:

则证明已经切换成standby状态

触发 failover 需要的时间通过ha.zookeeper.session-timeout.ms 配置项,默认为 5 秒。

四、冷备份节点secondarynamenode操作

背景

SecondaryNameNode是namenode的冷备份,而namenode的HA高可用才是namenode的热备份。区别是SecondaryNameNode中存储的元数据不是实时的,滞后于namenode主节点。

NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息、表名字等。当它运行的时候,这些信息是存在内存中的。但是这些信息也可以持久化到磁盘上。

  • fsimage:它是NameNode启动时对整个文件系统的快照。
  • edits:它是在NameNode启动后,对文件系统的改动序列。

由于NameNode合并FsImage和edits只在启动时,edits日志文件会变得很大在一段时间内并运行在繁忙的集群上 ,一个副作用是一个更大的edits文件会使NameNode在下次重新启动时需要更长的时间

Secondary NameNode定期合并FsImage和edits日志文件,并保持edits日志文件大小在一定限度。

命令介绍

代码语言:javascript复制
hdfs secondarynamenode [-checkpoint [force]] | [-format] | [-geteditsize]

参数

说明

-checkpoint [force]

检查SecondaryNameNode,如果EditLog的大小超过fs.checkpoint.size,则更新EditLog到fsimage上。 如果使用force参数,则忽略目前EditLog大小,直接更新fsimage

-format

在启动时候,格式化本地存储

-geteditsize

打印Namenode上没有合并入fsimage操作命令条数

0 人点赞