1.问题背景
通过各种备份namenode的元数据和通过备用namenode 创建监测点能防止数据丢失,但是依旧无法实现文件系统的高可用性。
namenode依旧存在单点失效(SPOF, single point of failure)的问题。如果namenode失效了,那么所有的客户端,包括MapReduce 作业,均无法读、写或列举(list)文件,因为namenode是唯一存储 元数据与文件到数据块映射的地方。在这一情况下,Hadoop系统无法提供服务直到有新的namenode上线。
在这样的情况下,要想从一个失效的namenode 恢复,系统管理员得启动一个 拥有文件系统元数据副本的新的namenode, 并配置datanode 和客户端以便使用这个新的namenode。新的namenode 直到满足以下情形才能响应服务:
(1)将命名空间的映像导入内存中;
(2)重演编辑日志;
(3)接收到足够多的来自datanode 的数据块报告并退出安全模式。对于一个大型并拥有大量文件和数据块的集群,namenode 的冷启动需要30分钟,甚至更长时间。
这样等到namenode失效后再恢复,时间长而且复杂,所以这基本就是灾难性的,Hadoop2针对上述问题增加了对HDFS高可用性(HA)的支持。在这一实现中,配置了一对活动-备用(active-standby) namenode。 当活动namenode失效,备用namenode就会接管它的任务并开始服务于来自客户端的请求,不会有任何明显中断。实现这一目标需要在架构上做如下修改:
- namenode之间需要通过高可用共享存储实现编辑日志的共享。当备用namenode接管工作之后,它将通读共享编辑日志直至末尾,以实现与活动namenode的状态同步,并继续读取由活动namenode写人的新条目。
- datanode需要同时向两个namenode发送数据块处理报告,因为数据块的映射信息存储在namenode的内存中,而非磁盘。
- 客户端需要使用特定的机制来处理namenode 的失效问题,这一机制对用户是透明的。
- 辅助namenode的角色被备用namenode所包含,备用namenode为活动的namenode命名空间设置周期性检查点。
2.HDFS HA高可用的实现QJM
HDFS可以从两种高可用性共享存储做出选择:NFS过滤器或群体日志管理器(QJM,quorum journal manager)。NFS并不能很好的切换namenode,所以首选QJM.
QJM是一个专用的HDFS实现,为提供一个高可用的编辑日志而设计,被推荐用于大多数HDFS部署中。QJM以一组日志节点(journalnode)的形式运行,每一次编辑必须写入多数日志节点。一般有三个journal节点,所以系统能够忍受其中任何一个的丢失。这种安排与ZooKeeper 的工作方式类似,当然必须认识到,QJM的实现并没使用ZooKeeper。
系统中有一个称为故障转移控制器(failovercontroller)的新实体,管理着将活动namenode转移为备用namenode 的转换过程。有多种故障转移控制器,但默认的一种是使用了ZooKeeper 来确保有且仅有一个活动namenode。 每一个namenode运行着一个轻量级的故障转移控制器,其工作就是监视宿主namenode是否失效(通过一个简单的心跳机制实现)并在namenode失效时进行故障切换。
管理员也可以手动发起故障转移,例如在进行日常维护时。这称为“平稳的故障转移”(graceful failover), 因为故障转移控制器可以组织两个namenode 有序地切换角色。
但在非平稳故障转移的情况下,无法确切知道失效namenode是否已经正真停止运行。例如,在网速非常慢或者网络被分割的情况下,同样也可能激发故障转移,但是先前的活动namenode依然运行着并且依旧是活动namenode。高可用实现做了更进一步的优化,以确保先前活动的namenode不会执行危害系统并导致系统崩溃的操作,该方法称为“规避”(fencing)。
同一时间QJM仅允许一个namenode 向编辑日志中写入数据。然而,对于先前的活动namenode 而言,仍有可能响应并处理客户过时的读请求,因此,设置一个SSH规避命令用于杀死namenode的进程是一个好主意。当使用NFS过滤器实现共享编辑日志时,由于不可能同一时间只允许一个namenode 写入数据(这也是为什么推荐QJM的原因)
3.HDFS HA高可用配置
前面讲了那么多理论这里说一下如何配置,但也不想费笔,因为官方的文章已经整理得够好了
NameNode HA With QJM 配置
参考官方配置:
https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
NameNode HA With NFS 配置
参考官方配置:
https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithNFS.html