基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

什么是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 真正具备了企业级的高可用和容灾能力。

00:00
00:00