欢迎光临
我们一直在努力

一、hdfs—架构

一、整体架构角色(先把人认全)

– Active NameNode(主 NN):对外提供读写服务,写元数据到 EditLog,再同步到 JournalNode。

– Standby NameNode(备 NN):不对外服务,只从 JournalNode 拉 EditLog 并回放,保持和主 NN 元数据一致;同时负责做 Checkpoint。

– JournalNode(JN):共享 EditLog 存储,Active 写多数派,Standby 从中拉取。

– ZooKeeper(ZK):负责选主、保活、锁、状态记录、防脑裂。

– ZKFC(ZK Failover Controller):每个 NN 对应一个独立进程,是 NN 和 ZK 之间的唯一桥梁。

 

二、谁和谁直接通信?(关键链路)

– NN ↔ ZKFC:本地通信(心跳、健康状态)

– ZKFC ↔ ZK:直接通信(抢锁、心跳、监听)

– NN ↔ JN:Active 写、Standby 读

– NN ↔ Client / DataNode:只有 Active 对外服务

NN 永远不直接和 ZK 说话,全靠 ZKFC 传话。

 

三、正常运行时整套流程(完整连贯)

1) 元数据写入流程(写文件/改元数据)

1. Client 写请求发给 ActiveNN。

2. ActiveNN 先写本地 EditLog,再同步到 JN 多数派。

3. 写成功后返回 Client 成功。

4. StandbyNN 持续从 JN 拉取新 EditLog,逐条回放,保持元数据和 Active 一致。

2) Checkpoint 怎么做(由 Standby 执行)

1. 满足时间或事务阈值,Standby 触发 Checkpoint。

2. Standby 把自己内存里最新的元数据保存为新 FsImage。

3. 把新 FsImage 传给 ActiveNN。

4. ActiveNN 替换旧 FsImage,EditLog 被截断。

Checkpoint 目的:控制 EditLog 大小,加快重启速度。

 

四、ZK + ZKFC 的核心作用(通俗但完整)

ZK + ZKFC 做四件事:

1. 提供“唯一主锁”

ZK 上有一个临时节点:

 /ActiveStandbyElectorLock 

– 谁创建它,谁就是主

– 谁持有它,谁就能写

– 锁丢了,就不能写

这是防止脑裂的核心。

2. 监控 NN 健康

ZKFC 定期给 NN 发心跳:

– 若 NN 卡死/无响应 → ZKFC 认为 NN 不健康

– 若 ZKFC 与 ZK 会话超时 → 锁自动释放

3. 触发故障转移

– 旧主挂 → 锁释放

– 备的 ZKFC 竞争锁

– 成功后通知 StandbyNN 变 Active

– ZK 更新主状态

4. 防脑裂(保证只有一个主)

– 锁唯一性

– 旧主一旦丢锁,必须停止写

– 必要时通过 Fencing 杀掉旧主进程

 

五、为什么“主 NN 写数据要经过 ZK 同意”?

这句话的真实含义是:

ActiveNN 要想合法对外提供写服务,必须持续持有 ZK 主锁。

没有锁 → 不能写。

锁丢了 → 立即停止写。

不是每次写文件都问 ZK,而是:

– 启动时抢锁

– 运行时保持锁

– 写 EditLog 前检查锁

ZK 是“主身份授权者”,没有授权,NN 不能写。

 

六、故障转移完整流程(连贯版)

1. ActiveNN 挂掉或网络断连。

2. ZKFC 检测到 NN 不健康,ZK 会话超时,锁自动删除。

3. Standby 的 ZKFC 竞争锁成功。

4. StandbyNN 先拉取 JN 剩余所有 EditLog,确保无数据丢失。

5. StandbyNN 切换为 Active。

6. ZK 更新主状态。

7. 旧主恢复后自动变为 Standby,并从 JN 同步。

 

七、最终一句话总览(最浓缩版)

ActiveNN 写 EditLog 到 JN,StandbyNN 从 JN 拉取并回放,ZK + ZKFC 负责选主、保活、锁和防脑裂,Checkpoint 由 Standby 执行,整个系统保证元数据一致、高可用、不脑裂。

 

赞(0)
未经允许不得转载:171主机测评 » 一、hdfs—架构
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址