本节主要介绍了HDFS HA(High Availability)的原理、主备切换过程以及基于JournalNode的共享存储系统。
在当初介绍Hadoop2.0时,我们简单提到了Hadoop框架中MapReduce的不足与改进。(即设计了新的资源管理框架YARN)。
那么,Hadoop2.0针对HDFS在Hadoop1.0的存在的问题如何改进了呢?
HDFS在Hadoop1.0中主要存在以下两个问题:
① 单一名称节点,所以可能产生单点失效问题。
② 单一名称节点,所以无法实现资源隔离。
所以针对HDFS以上两个问题,Hadoop2.0进行以下改进:
① 设计了HDFS HA,提供名称节点热备机制。
② 设计了HDFS Federation,管理多个命名空间。
本节主要对HDFS HA进行介绍。
namenode
负责管理分布式文件系统的命名空间namespace
,保存了两个核心的数据结构:FsImage和EditLog。 datanode
是分布式文件系统HDFS的工作节点,负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送所存储的块的列表。两者功能如下图:
HDFS运行原理如下图:
① 第二名称节点SecondaryNameNode
会定期和Namenode通信。
② 从Namenode上获取到FsImage和EditLog文件,并下载到本地的相应目录下。
③ 执行EditLog和FsImage文件合并。
④ 将新的FsImage文件发送到Namenode节点上。
⑤ Namenode使用新的FsImage和EditLog(缩小了)。
所以,我们可以发现,SecondaryNameNode不是热备份,主要是防止日志文件EditLog过大,导致名称节点失败恢复时消耗过多时间,同时附带冷备份功能。
可以得出结论,SecondaryNameNode无法解决单点故障问题。
因此,HDFS2.0提供了HDFS HA的解决方案。
HDFS HA(High Availability)如其名,高可用性,是为了解决单点故障问题。
主要用以下方法进行解决:
① HA集群设置了两个名称节点:Active
和Standby
,即活跃和待命。
② 两种名称节点的状态同步,可以借助一个共享存储系统来实现。
③ 一旦活跃名称节点Active
出现故障,就可以立即切换到待命名称节点Standby
。
④ Zookeeper确保一个名称节点在对外服务。(主备切换控制)
⑤ 名称节点维护映射信息,数据节点同时向两个名称节点汇报信息。
HDFS HA架构如以下两个图:
主要就是以下几个组件:
这是主Namenode,处于Active
状态。只有主名称节点才能对外提供读写服务。
这是备Namenode,处于Standby
状态。
这是主备切换器,作为独立的进程运行。对Namenode的主备切换进行整体控制。ZKFC能够及时监测到节点的健康状况。在主Namenode故障的时候,借助Zookeeper这个集群去实现自动的主备选举和切换。
这是实现Namenode高可用性的关键。它把一部分元数据存储在这里面。主Namenode和备Namenode通过它实现共享元数据的同步。
数据节点功能和之前类似。唯一的区别是之前只需要向一个Namenode汇报信息,现在需要向主备namenode都汇报信息。
ZKFailoverControllar
、HealthMonitor
和ActiveStandByElector
这三个组件协同完成的。HealthMonitor
主要负责监测namenode健康状态,可以理解为ZKFC直接去监测namenode的健康状态。如果namenode状态发生变化,它会回调ZKFC的相应方法,进行自动的主备选举。
ActiveStandbyElector
主要负责完成自动的主备选举,它内部封装了Zookeeper的处理逻辑,一旦Zookeeper主备选举完成,就会回调ZKFC的相应方法来进行namenode的主备切换。
作用主要为:
共享存储把一部分元数据存储在这里面,主、备Namenode通过它实现共享元数据的同步。
参看前面介绍的架构图。
Namenode在执行HDFS的客户端提交、创建文件或者移动文件这样操作的时候。会首先把这些操作日志写入EditLog
,然后在更新内存中的文件系统镜像。
文件系统镜像用于namenode向客户端提供读服务,而EditLog
只是在数据恢复时候起作用。
Namenode也会定期对内存中的文件系统镜像进行Checkpoint,在磁盘上生成FsImage
文件。
在namenode启动的时候,会进行数据恢复,首先把FsImage文件加载到内存中,形成文件系统镜像。
基于JournalNode
的共享存储主要用于保存EditLog
,并不保存Fsimage
文件,FsImage
还是在本地磁盘上。
JournalNode
集群共享存储的基本思想是来自Paxos
算法。采用多个成为JournalNode
节点组成,JouranlNode
集群来存储EditLog
,每个JournalNode
保存同样的EditLog
副本,每个JouranlNode
写EditLog
的时候除了向本地磁盘写EditLog
之外,也会并行的向JournalNode
集群之中的每一个JournalNode
发送写请求。只要大多数的节点返回成功,就认为向Journalnode
集群写入EditLog
成功。
一般,Journalnode
建立配置奇数个。如果Journal
有2n+1
台,那么根据大多数的原则,最多容忍n
台journalnode
节点挂掉。
当处于Active
状态的namenode
会同时向本地磁盘目录和journalnode
集群的共享存储目录写入EditLog
。写入JournalNode
集群通过并行调用每个Journal
的RPC接口和方法去实现的。如果大多数写成功了,即提交EditLog
成功,否则说明提交失败。
当Namenode
进入Standby
状态时候,会定期地调用从JournalNode
集群上同步的EditLog
,是并行地去调用,然后把同步的EditLog
放回内存中文件系统镜像上,虽然Active nodenode
向Journalnode
集群上提交EditLog
是同步的,但Standbynamenode
采用的是定时的从Journalnode
集群上同步EditLog
。
那么Standbynamenode
内存中的文件系统镜像就很大可能会落后于Activenamenode
,所以当Standbynamenode
切换为Activenamenode
的时候,就需要把落后的EditLog
补上来。同时,由于主备切换,有可能Activenamenode
发生异常退出,那么Journalnode
的数据很可能处于不一致状态,所以首先让Journalnode
上的EditLog
恢复成一致,这样,就需要补齐落后的EditLog
。
这两步完成之后,这样才能正式成为一个Active
,从而对外提供服务。
本节主要介绍了HDFS HA(High Availability)的原理、主备切换过程以及基于JournalNode的共享存储系统。
概念性的定义较多,需要进一步的熟悉。下一节介绍搭建企业级的Hadoop
。
参考资料
林子雨 - 大数据技术原理和应用
王滨 - 网易云课程
Hadoop NameNode 高可用 (High Availability) 实现解析- https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-name-node/