hdfs高可用
HDFS高可用
什么是HDFS高可用
NameNode存在单点失效的问题。如果NameNode失效了,那么所有的客户端——包括MapReduce作业均无法读、写文件,因为NameNode是唯一存储元数据与文件到数据块映射的地方。在这种情况下,Hadoop系统无法提供服务,为了减少由计算机硬件和软件易错性所带来的损失而导致NameNode节点失效的问题,可以通过搭建HDFS高可用集群来实现NameNode的高可用性。
HDFS高可用是配置了一对活动-备用(active-standby)NameNode。当活动NameNode失效,备用NameNode就会接管它的任务并开始服务于来自客户端的请求,不会有任何明显的中断。
在这样的情况下,要想从一个失效的NameNode中恢复,系统管理员需要启动一个拥有头文件系统元数据副本的新NameNode,并配置DataNode和客户端以便使用这个新的NameNode。新的NameNode直到满足以下情形后才能响应服务:
·将命名空间的映像导入内存中。
·重做编辑日志。
·接收到足够多的来自DataNode的数据块报告并退出安全模式。对于一个大型并拥有大量文件和数据块的集群,NameNode的冷启动需要30分钟甚至更长时间。
·系统恢复时间太长,也会影响到日常维护。
HDFS高可用实现原理
在高可用的实现中,主要配置了活动-备用(active-standby)NameNode。当活动NameNode失效,备用NameNode就会接管它的任务并响应来自客户端的服务请求,不会有任何明显中断。实现这一目标需要在架构上作如下修改。
在活动NameNode失效之后,备用NameNode能够快速(几十秒的时间)实现任务接管,因为最新的状态存储在闪存中:包括最新的编辑日志条目和最新的数据块映射信息。实际观察到的失效时间略长一点(需要1分钟左右),这是因为系统需要保守地确定活动NameNode是否真的失效了,如图4.8所示。
通过双NameNode消除单点故障,其协调工作的要点如下。
元数据管理方式需要改变,内存中各自保存一份元数据,edits日志只能有一份,只有Active状态的NameNode节点可以做写操作,两个NameNode都可以读取edits,共享的edits放在一个共享存储中进行管理,通常使用Journal Node实现。
当备用NameNode接管工作之后,它将通读共享编辑日志直至末尾,以实现与活动NameNode的状态同步,并继续读取由活动NameNode写入的新条目。
需要一个状态管理功能模块,实现一个ZKFailover,常驻在每一个NameNode所在的节点上。每一个ZKFailover负责监控自己所在的NameNode节点,利用ZK进行状态标识。当需要进行状态切换时,由ZKFailover来负责切换,切换时需要防止分裂混乱现象的发生。
DataNode需要同时向两个NameNode发送数据块处理报告,因为数据块的映射信息存储在NameNode的内存中,而非磁盘上。
客户端需要使用特定的机制来处理NameNode的失效问题,这一机制对用户是透明的。
Secondary NameNode的角色被备用NameNode所包含,备用NameNode为活动的NameNode命名空间设置周期性检查点。
HDFS高可用实现
HDFS高可用的架构图如图4.9所示。
在高可用架构图中的节点包括NameNode、FailoverController、JournalNode、DataNode和ZooKeeper,下面分别介绍每个节点。
1.NameNode(NN)节点
NameNode节点主要有两种状态:active和standby。
2.FailoverController(ZKFC)节点
FailoverController节点用于监控和控制NameNode的状态切换,当一个集群中的Active NameNode“挂掉”后,会把Standby NameNode状态切换成active。
3.JournalNode(JN)节点
JournalNode节点共享edits日志文件,因为edits文件一旦丢失,就会导致元数据丢失,数据也就丢失了,这里的JN往往是一个集群,来保障edits不会丢失。
4.DataNode(DN)
DataNode节点定时和NameNode进行通信,接受NameNode的指令就会导致元数据丢失,同时DataNode之间还会相互通信,执行数据块复制任务。
5.ZooKeeper(ZK)
选择其中一个备用的NameNode为active。在这里需要注意的是,在搭建HA(HDFS高可用)时,可以没有SecondaryNameNode节点,在搭建完全分布式时的SecondaryNameNode合并edits文件的功能由Standby的NameNode替代了。
前面我们已经提到,HDFS高可用实现方式是通过配置了一对活动-备用(active-standby)NameNode。如果主NameNode发生故障,则切换到备用的NameNode上,通过双NameNode消除单点故障,同时:
·Active NN会把edits文件写到JN集群中的每一台机器上,active和standby的NN都可以读取edits文件,共享的edits文件放在一个共享存储中管理。fsimage文件会在格式化时产生并会被推送给其他的NN节点。
·FailoverController Active和FailoverController Standby分别对Active NN和Standby NN进行健康检查,把心跳数据传给ZooKeeper。如果Active NN掉线了,ZooKeeper会进行选举,选举出来后,由FailoverController进行切换。
·DN中的信息会同时发给Active NN和Standby NN。