HDFS原理与高可用|青训营笔记

110 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第7天

本文目标是介绍HDFS基本架构和读写原理,再简单了解一下HDFS高可用和高扩展

HDFS架构

这里直接默认用过HDFS了,就不讲HDFS是个什么东西了 ,直接讲解架构原理

首先HDFS三个组件:Client/SDK、NameNode(NN)、DataNode(DN)

  • Client:读写HDFS一般是通过SDK的形式来访问
  • NameNode:管DataNode,字节就是几个NN管几万个DN
  • DataNode:存用户数据的

HDFS写数据


image.png 看着很复杂,其实只要记住两个关键点

  • Client写数据之前,先要给NN发一个写请求,NN告诉client数据存在哪里(3个副本)
  • Client写数据的时候使用的是pipeline写

HDFS读数据


image.png 步骤就三步:

  1. Client发读请求给NN
  2. NN返回数据的DN列表(3个副本)
  3. Client读,只要读一个就好了

HDFS存数据


文件会在NN里切成多个数据块,然后DN把这些数据块存好,告诉NN数据块的节点位置,NN会动态更新数据块的位置


至此,我们学习了HDFS的架构和读写原理,现在我们学习一下HDFS是怎么保证高可用、高扩展的

HDFS高可用

什么是高可用?就是故障发生后仍能正常工作的能力,特别是如果NN挂了,整个HDFS都要瘫痪了,怎么去应对这种故障。

首先我们想到处理故障的方法可能是备份:这里有两个备份的概念

  • 冷备份:服务故障发生时,我用备份数据重启这个服务
  • 热备份:我主服务和备服务同时跑,主服务挂了,我切成备服务

这里热备份中主备服务的切换有两种方式,要么我手动去切,要么机器自己识别故障去切

那么HDFS里是怎么做的呢?

image.png HDFS使用的是热备份,起几个NN,只用一个NN(active),其他NN做备份(standby),也就是一个acitve多个standby。DN要同时给active NN和standby NN汇报自己的数据块信息,但是只有active NN会发请求。active NN在做了一些数据变更操作后,会往一个高可用的系统里写日志,然后standby NN用这个日志跟activeNN做同样的操作,保证NN之间的一致性。

然后当故障来临时,ZKFC会检测到,然后zookeeper去切换NN

HDFS存储高可用

有几种方案可以实现存储高可用

  • RAID:几块硬盘组合到一起,逻辑上表示一块盘,有多种不同的组成方式

  • HDFS多副本:我每个数据块分多个副本存放在多个DN上

  • 或者用Erasure Coding等方案