我们了解HDFS的HA和Federation是从Hadoop1.0和Hadoop2.0的区别开始的。那么HA是代表什么?
HA即为High Availability(高可用),用于解决NameNode单点故障的问题。该特性通过以热备的方式为NameNode提供一个备用者,一旦主NameNode出现故障,可以很快切换到备用的NameNode,从而实现对外提供服务。
Federation即为联邦,该特性允许一个HDFS集群中存在多个NameNode,这些NameNode分管一部分目录(水平切分),彼此之间相互隔离,但共享底层的DataNode存储资源。
之前的单点故障问题
hadoop2.x NameNode是HDFS集群的单点故障点,每一个集群只有一个NameNode,如果这个机器或进程不可用,整个集群就无法使用,直到重启NameNode或者新启动一个NameNode节点。影响HDFS集群不可用主要包括以下两种情况:
1)第一种情况是如机器宕机这样的意外情况,将导致集群不可用,只有在重启NameNode之后才可使用。
2)第二种情况是计划内的软件或硬件升级(NameNode节点),将导致集群在短时间范围内不可用。
HA给出的解决方案
HDFS的HA就是为了解决上述问题,通过提供选择运行在同一集群中的一个热备用的“主/备”两个冗余NameNodes。这允许在机器宕机或系统维护的时候,快速的转移到另一个NameNode.
一个典型的HA集群,两个单独的机器配置为NameNodes,在任何时候,一个NameNode处于活动状态,另一个处于待机状态,活动的NameNode负责处理集群中所有客户端的操作,待机时仅仅作为一个slave,保持足够的状态,如果有必要提供一个快速的故障转移.
为了保持备用节点与活动节点状态的同步,目前的实现需要两个节点同时访问一个共享存储设备(例如从NASNFS挂载)到一个目录。将有可能在未来的版本中放宽此限制。当活动节点对命名空间进行任何修改,它将把修改记录写到共享目录下的一个日志文件,备用节点会监听这个目录,当发现更改时,它会把修改内容同步到自己的命名空间。备用节点在故障转移时,它将保证已经读取了所有共享目录内的更改记录,保证在发生故障前的状态与活动节点保持完全一致。
为了提供快速的故障转移,必须保证备用节点有最新的集群中块的位置信息,为了达到这一点,Datanode节点需要配置两个nameNode的位置,同时发送块的位置信息和心跳信息到两个nameNode。
任何时候只有一个namenode处于活动状态,对于HA集群的操作是至关重要的,否则两个节点之间的状态就会产生冲突,数据丢失或其它不正确的结果,为了达到这个目的或者所谓的“裂脑场景”出现,管理员必须为共享存储配置至少一个(fencing)方法。在宕机期间,如果不能确定之间的活动节点已经放弃活动状态,fencing进程负责中断以前的活动节点编辑存储的共享访问。这可以防止任何进一步的修改命名空间,允许新的活动节点安全地进行故障转移。
HDFS HA 架构
在典型的HA集群中,将两台独立的计算机配置为NameNodes。在任何时间点,其中一个NameNodes处于活动状态,另一个处于待机状态。Active NameNode负责集群中的所有客户端操作,而Standby仅作为从站,维护足够的状态以在必要时提供快速故障转移。
为了使备用节点保持与Active节点同步的状态,两个节点都与一组名为“JournalNodes”(JN)的独立守护程序进行通信。当Active节点执行任何命名空间修改时,它可以将修改的记录持久记录到大多数这些JN。备用节点能够读取JN的编辑,并且不断地观察它们对编辑日志的更改。当待机节点看到编辑时,它将它们应用于自己的命名空间。在故障切换的情况下,待机将确保它已经读取了JounalNodes的所有编辑,然后再将其自身升级到Active状态。这将确保名称空间状态在发生故障转移之前完全同步。
为了提供快速故障切换,还需要备用节点具有有关集群中块的位置的最新信息。为了实现这一点,DataNodes配置有两个NameNodes的位置,并向两者发送块位置信息和心跳。
对于HA群集的正确操作至关重要,因此一次只能有一个NameNodes处于活动状态。否则,命名空间状态将在两者之间快速分离,冒着数据丢失或其他不正确的结果。为了确保这种属性并防止所谓的“脑裂”,JournalNodes将只允许一个NameNode作为一个作者。在故障切换期间,要变为活动状态的NameNode将简单地接管写入JournalNodes的角色,这将有效地防止其他NameNode继续处于活动状态,允许新的Active安全地进行故障转移。
网友评论