HDFS高可用性

时间:2020-01-09 10:34:31  来源:igfitidea点击:

在这篇文章中,我们将了解什么是HDFS高可用性,高可用性架构以及Hadoop集群中HDFS高可用性所需的配置。

HDFS高可用性的一些背景

在Hadoop 2之前,NameNode是HDFS集群中的单点故障(SPOF)。在HDFS群集中,只有一个Namenode,如果该计算机或者进程出现故障,则整个群集将不可用,直到Namenode重新启动或者在另一台计算机上启动。

拥有辅助Namenode将有助于使fsimage文件与编辑日志合并,从而减少Namenode的启动时间并有助于数据丢失,但是如果Namenode故障转移,它不能迅速代替Namenode。简而言之,没有提供文件系统的高可用性。

这通过以下方式影响了HDFS群集的总可用性:

  • 任何计划外的事件(例如系统崩溃)都将导致群集不可用,直到操作员重新启动Namenode。
  • 任何计划中的事件,例如NameNode计算机上的软件或者硬件升级,都将导致群集停机。

在任何计划外或者计划外的情况下,管理员都必须启动一个新系统作为namenode \ Restart Namenode,该系统将保持安全模式,同时-

  • 它将使用fsimage和编辑日志将文件系统状态加载到内存中。
  • 从数据节点获取足够的阻止报告。

在大型群集中,这可能需要长达半小时的时间,在此期间Namenode将无法处理请求。

HDFS高可用性尝试通过在主动/被动配置中的同一群集中具有两个Namenode来解决此问题。

HDFS高可用性架构

在HDFS HA群集中,两个系统被配置为Namenode。在任何给定时间,只有一个Namenode处于活动状态,并在其他Namenode保持待机状态的情况下服务于客户端请求。

处于备用状态的Namenode不会处理任何客户端请求,只需要使其与活动Namenode保持状态同步即可在必要时提供快速故障转移。

为了在两个名称节点之间同步状态,使用了高可用性共享存储。两个节点都与此共享存储进行通信。当活动节点执行任何名称空间修改时,它将记录修改记录以编辑存储在该共享存储中的日志。备用节点还与共享存储进行通信,并将编辑日志中的更改应用于其自己的名称空间。

两个Namenode也应在Datanodes中具有所有块的位置。由于该信息不会持久保存在Namenode内存中,因此Datanode必须将块位置发送到两个Namenode。为此,为DataNode配置了两个NameNode的位置。

如果发生故障转移,备用名称节点将确保在将自身提升为活动状态之前,已从共享存储中读取了所有编辑内容。这样可确保在发生故障转移之前,名称空间状态已完全同步。

HDFS HA中使用的共享存储的类型

HDFS高可用性可以将共享的NFS或者Quorum Journal Manager用作两个Namenode都使用的共享存储。

对于NFS,要求两个Namenode都可以访问共享存储设备上的目录,在该目录中可以写入和读取编辑日志更改。

在QJM的情况下,两个Namenode都与一组称为" JournalNodes"(JN)的单独守护程序进行通信。名称空间修改的任何记录都记录到这些Jns的大多数中。
在典型的QJM实现中,有三个日记帐节点,因此即使其中一个日记帐节点不可用,它也仍然可用。

名称节点故障转移

在HDFS高可用性中发生活动的Namenode故障转移的情况下,必须确保备用Namenode处于活动状态,而先前活动的Namenode过渡到备用状态。

我们可以使用hdfs haadmin -failover子命令在HDFS HA中手动启动故障转移。

此子命令导致从第一个提供的NameNode到第二个的NameNode故障转移。如果第一个NameNode处于Standby状态,则此命令仅将第二个NameNode转换为Active状态而不会出现错误。如果第一个NameNode处于"活动"状态,则将首先尝试将其正常过渡到"待机"状态。如果失败,将按顺序尝试防护方法(由dfs.ha.fencing.methods配置),直到成功为止。仅在此过程之后,第二个NameNode才会转换为Active状态。

如果要自动触发从活动NameNode到备用NameNode的故障转移,则当活动节点发生故障时,可以配置自动故障转移。

Hadoop框架随附的默认实现使用ZooKeeper进行自动故障转移。有一个ZooKeeper客户端ZKFailoverController(ZKFC),它也监视和管理NameNode的状态。

运行NameNode的每台计算机还运行ZKFC。 ZKFC监视其本地Namenode的运行状况,并基于此标记其运行状况是否良好。

当本地NameNode运行状况良好时,ZKFC会在ZooKeeper中保持一个打开的会话。如果本地NameNode处于活动状态,则它还将持有一个特殊的"锁定" znode。如果会话到期(当Namenode标记为不正常时),则锁定节点将被自动删除。

如果ZKFC看到锁znode未被任何节点持有,它将自己尝试获取该锁。如果成功,它将负责运行故障转移以使其本地NameNode处于活动状态。在故障转移过程中,如果需要,首先隔离先前的活动节点,然后本地NameNode转换为活动状态。

HDFS HA中的防护方法

在高可用性集群中,一次只有一个Namenode应该处于活动状态才能正确运行集群。否则,两个名称节点都将变为活动状态,并尝试处理客户端请求,从而导致数据损坏和数据丢失。

作为示例由于网络速度较慢,即使先前处于活动状态的Namenode仍然处于活动状态,活动的Namenode也无法通过运行状况检查并开始故障转移转换。

如果无法进行故障转移,则如果无法验证先前的活动节点已放弃其活动状态,则隔离过程负责切断先前活动的名称节点对共享编辑存储的访问。这样可以防止对名称空间进行任何进一步的编辑。

具有Quorum Journal Manager的HA仅允许一个NameNode写入JournalNodes,因此不会损坏文件系统元数据。但是,当发生故障转移时,以前的Active NameNode仍然有可能向客户端提供读取请求,这可能已过时。

配置高可用性群集

在HDFS高可用性群集中,为了配置HA NameNode,我们需要向hdfs-site.xml配置文件中添加几个配置选项。

dfs.nameservices为此名称服务选择一个逻辑名称,例如" mycluster"

<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>

dfs.ha.namenodes。[nameservice ID]为nameservice中的每个NameNode提供唯一的标识符。例如,如果我们以前使用" mycluster"作为名称服务ID,并且想要使用" nn1"和" nn2"作为NameNodes的各个ID。

<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>

然后,我们需要对其他配置使用完全限定名称。例如,如果我们必须为每个Namenode配置HTTP地址以进行侦听。

<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>machine1.example.com:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>machine2.example.com:50070</value>
</property>

对于防护,Hadoop附带了两种方法:shell和sshfence。

将SSH SSH到Active NameNode并终止该进程。

<property>
   <name>dfs.ha.fencing.methods</name>
   <value>sshfence</value>
</property>

shell运行一个任意的shell命令来隔离Active NameNode

shell防护方法运行一个任意的shell命令。可以这样配置:

<property>
  <name>dfs.ha.fencing.methods</name>
  <value>shell(/path/to/my/script.sh arg1 arg2 ...)</value>
</property>