基于本文回答

播面 播面

文解图解播客视频,多维讲透八股文

什么是HDFS HA(高可用)架构?它的提出主要是为了解决HDFS的什么痛点?

知识点图片

HDFS HA(High Availability,高可用)架构是 Hadoop 2.x 版本引入的一种集群架构设计,旨在保证 HDFS 分布式文件系统在面临硬件故障或软件升级时,依然能够持续对外提供服务。

要深入理解 HA 架构,我们首先需要知道它解决了什么痛点


一、 HDFS HA 主要解决的痛点是什么?

HDFS HA 提出的根本原因是解决早期 Hadoop 1.x 版本中 HDFS 的单点故障(SPOF, Single Point of Failure)问题

在 Hadoop 1.x 时代,HDFS 集群中只有一个 NameNode(名称节点):

  1. NameNode 的核心地位:NameNode 掌握着整个文件系统的元数据(目录树、文件属性、文件到数据块的映射等)。客户端所有的读写请求都必须先经过 NameNode。
  2. 致命的单点故障:如果这台唯一的 NameNode 机器发生硬件损坏、系统崩溃或断电,整个 HDFS 集群将瞬间瘫痪,无法进行任何读写操作。
  3. 恢复时间漫长:虽然 Hadoop 1.x 提供了 Secondary NameNode (SNN),但 SNN 并不是 NameNode 的热备。SNN 的主要作用仅仅是定期合并元数据(EditLog 和 FsImage)以防止日志过大。如果 NameNode 宕机,管理员需要手动将 SNN 上的数据拷贝到新的机器上并重新启动服务。这个过程可能需要几十分钟甚至几个小时,且如果在宕机瞬间有未同步的数据,还会造成数据丢失
  4. 日常维护的停机时间:即使没有故障,当需要对 NameNode 所在的服务器进行硬件升级、打补丁或重启时,也必须停机,这在企业级 24x7 不间断运行的生产环境中是无法接受的。

总结来说,HA 架构的提出就是为了消除 NameNode 的单点故障,实现故障的秒级/分钟级自动切换,保证集群的持续可用。


二、 什么是 HDFS HA 架构?

为了解决单点故障,HDFS HA 架构引入了双 NameNode(或多 NameNode) 的设计。在一个典型的 HA 集群中,会有两台配置相同的机器运行 NameNode 服务:

  • Active NameNode(活跃状态):负责处理客户端的所有读写请求。
  • Standby NameNode(备用状态):作为热备节点,随时保持与 Active 节点的状态同步。一旦 Active 节点宕机,Standby 节点会迅速接管,成为新的 Active 节点。

HDFS HA 架构的核心组件与机制

为了让 Active 和 Standby 无缝切换,HA 架构设计了以下几个关键机制:

1. 元数据同步机制(共享存储)

Standby 必须实时拥有和 Active 完全一致的元数据。HDFS 引入了共享存储系统(通常是 QJM - Quorum Journal Manager,即一组 JournalNode 进程):

  • 当 Active NameNode 执行任何修改文件系统状态的操作(如创建文件、删除目录)时,它会将这些操作记录(EditLog)写入到多数派的 JournalNodes (JN) 中。
  • Standby NameNode 会持续监听这些 JournalNodes,一旦发现有新的 EditLog 写入,就会拉取并在自己的内存中回放这些操作。
  • 这样,Standby 的内存状态就能时刻与 Active 保持一致。

2. 数据块位置同步机制

HDFS 的元数据只记录“文件包含哪些块”,但不记录“这些块具体存在哪台 DataNode 上”,块位置信息是由 DataNode 启动时汇报给 NameNode 的。

  • 在 HA 架构下,所有的 DataNode 都会同时向 Active 和 Standby 两个 NameNode 发送心跳和块状态报告(Block Report)
  • 这确保了 Standby 节点不仅拥有最新的目录树,还拥有最新的数据块物理分布信息,接管时无需等待 DataNode 重新汇报。

3. 自动故障转移机制(Auto Failover)

虽然有了热备,但谁来决定什么时候切换?如果靠人工发现并切换,依然会有较长的服务中断。HDFS HA 引入了 ZooKeeper 来实现自动故障转移:

  • ZKFailoverController (ZKFC):在每台运行 NameNode 的机器上,都会运行一个 ZKFC 进程。
  • ZKFC 负责监控本地 NameNode 的健康状态,并在 ZooKeeper 中保持一个“排他锁”。
  • 如果 Active NameNode 崩溃,其对应的 ZKFC 会断开与 ZooKeeper 的连接,释放锁。
  • Standby NameNode 的 ZKFC 监测到锁被释放,就会立刻去竞争这把锁。竞争成功后,它会触发本地的 Standby NameNode 转换为 Active 状态。

4. 脑裂(Split-Brain)防护机制:Fencing(隔离)

在分布式系统中,最怕出现“脑裂”——即由于网络分区或延迟,原本的 Active 没有死,但 Standby 以为它死了并接管了服务。如果两个 NameNode 同时认为自己是 Active 并向集群写入数据,会导致元数据严重损坏。

  • 为了防止脑裂,HA 架构引入了 Fencing(隔离/击打)机制
  • 当 Standby 准备切换为 Active 之前,它必须先“干掉”或隔离原来的 Active 节点。
  • 常见 Fencing 方式
    1. QJM 层面:JournalNode 采用了 Epoch (纪元) 机制,新的 Active 产生后,旧的 Active 就再也没有权限向 JournalNodes 写入数据了。
    2. SSH Fencing:新的 Active 通过 SSH 登录到旧 Active 所在的服务器,直接 kill 掉 NameNode 进程。
    3. 电源 Fencing:直接通过智能电源管理(如 IPMI)切断旧 Active 机器的电源(STONITH)。

总结

HDFS HA 架构通过 Active/Standby 机制 + JournalNodes 共享日志 + DataNode 双向汇报 + ZooKeeper 自动切换 + Fencing 防脑裂,完美解决了早期 HDFS NameNode 的单点故障痛点,使得 Hadoop 真正具备了企业级的高可用和容灾能力。