HDFS 高可用性 + 容错机制

上一篇博客介绍了 HDFS 的基本概念,读写流程以及NameNode,SecondaryNameNode 以及 DataNode 的工作机制。这篇博客介绍 HDFS 的高可用性和容错机制。

HDFS 的高可用性

HDFS的高可用指的是HDFS持续对各类客户端提供读、写服务的能力,因为客户端对HDFS的读、写操作之前都要访问name node服务器,只有从name node获取元数据之后才能继续进行读、写。所以HDFS的高可用的关键在于name node上的元数据持续可用。

在 hadoop 1.x 的 HDFS 框架中只存在一个 namenode 节点,当这个 namenode 节点出现内存溢出、宕机等意外情况之后,整个系统就会停止服务,直到我们重启这个 namenode 节点。为了解决这个问题,在 hadoop2.x 的 HDFS 框架中,实现了 HA 的机制。

在高可用配置下,edit log不再存放在名称节点,而是存放在一个共享存储的地方,这个共享存储由奇数个Journal Node组成,一般是3个节点(JN小集群), 每个JN专门用于存放来自NN的编辑日志,编辑日志由活跃状态的名称节点写入JN小集群。

HDFS 高可用性 + 容错机制
解释:

  • Active NameNode 和 Standby NameNode:两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。

  • 主备切换控制器 ZKFailoverController:ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。

  • Zookeeper 集群:为主备切换控制器提供主备选举支持。

  • 共享存储系统:共享存储系统是实现 NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 HDFS 的元数据。Active NameNode 和 Standby NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务。
    可以看出,这里的核心是共享存储的实现,下面为大家介绍一种基于 QJM(Quorum Journal Manager)的默认存储方案。方案合并到 HDFS 的 trunk 之中并且作为默认的共享存储实现。

共享存储系统QJM

基于 QJM 的共享存储系统主要用于保存 EditLog,并不保存 FSImage 文件。FSImage 文件还是在 NameNode 的本地磁盘上。

QJM 共享存储的基本思想来自于 Paxos 算法,采用多个称为 JournalNode 的节点组成的 JournalNode 集群来存储 EditLog。每个 JournalNode 保存同样的 EditLog 副本。每次 NameNode 写 EditLog 的时候,除了向本地磁盘写入 EditLog 之外,也会并行地向 JournalNode 集群之中的每一个 JournalNode 发送写请求,只要大多数 (majority) 的 JournalNode 节点返回成功就认为向 JournalNode 集群写入 EditLog 成功。

如果有 2N+1 台 JournalNode,那么根据大多数的原则,最多可以容忍有 N 台 JournalNode 节点挂掉。

数据同步机制

HDFS 高可用性 + 容错机制

Active NameNode 提交 EditLog 到 JournalNode 集群

Standby NameNode 从 JournalNode 集群同步 EditLog

虽然 Active NameNode 向 JournalNode 集群提交 EditLog 是同步的,但 Standby NameNode 采用的是定时从 JournalNode 集群上同步 EditLog 的方式,那么 Standby NameNode 内存中文件系统镜像有很大的可能是落后于 Active NameNode 的,所以 Standby NameNode 在转换为 Active NameNode 的时候需要把落后的 EditLog 补上来。

HDFS 容错机制

HDFS 是具有很好的容错性的分布式存储系统,它利用复制技术实现数据容错能力,数据会被复制多份并存储在集群的不同节点。这样,集群中的某些机器宕机了,数据还可以从其他正常运行的机器获取。如果有一个机器宕机了,HDFS 会在其他可用的机器创建数据的副本,来保证该数据的副本数与集群的副本因子是一致的。

故障类型

我们来看看出现的故障类型。
• 节点失败:即DataNode节点失败。
• 网络故障:无法发送和接收数据。
• 数据损坏:数据在不稳定的网络传输中或在硬盘中存储出错。

故障检测机制

针对这三类故障的检测机制是这样的。

  1. 节点失败检测机制
    • 每个DataNode以固定的周期向NameNode 发送心跳信号,通过这种方法告诉 NameNode 它们在正常工作。如果在一定的时间内 NameNode 没有收到 DataNode 心跳,就认为该 DataNode 宕机了。
  2. 通信故障检测机制
    • 只要发送了数据,接收方就会返回确认码。如果经过几次重试之后,还是没有收到确认码,发送方会认为主机挂了或网络发生故障。
  3. 数据错误检测机制
    • 在传输数据的时候,同时会发送总和检验码,当数据存储到硬盘时,总和检验码也会被存储。
    • 所有的 DataNode 都会定期向 NameNode 发送数据块的存储状况。
    • 在发送数据块报告前,会先检查总和校验码是否正确,如果数据存在错误就不发送该数据块的信息。