这是我参与「第四届青训营 」笔记创作活动的第7天
本文目标是介绍HDFS基本架构和读写原理,再简单了解一下HDFS高可用和高扩展
HDFS架构
这里直接默认用过HDFS了,就不讲HDFS是个什么东西了 ,直接讲解架构原理
首先HDFS三个组件:Client/SDK、NameNode(NN)、DataNode(DN)
- Client:读写HDFS一般是通过SDK的形式来访问
- NameNode:管DataNode,字节就是几个NN管几万个DN
- DataNode:存用户数据的
HDFS写数据
看着很复杂,其实只要记住两个关键点
- Client写数据之前,先要给NN发一个写请求,NN告诉client数据存在哪里(3个副本)
- Client写数据的时候使用的是pipeline写
HDFS读数据
步骤就三步:
- Client发读请求给NN
- NN返回数据的DN列表(3个副本)
- Client读,只要读一个就好了
HDFS存数据
文件会在NN里切成多个数据块,然后DN把这些数据块存好,告诉NN数据块的节点位置,NN会动态更新数据块的位置
至此,我们学习了HDFS的架构和读写原理,现在我们学习一下HDFS是怎么保证高可用、高扩展的
HDFS高可用
什么是高可用?就是故障发生后仍能正常工作的能力,特别是如果NN挂了,整个HDFS都要瘫痪了,怎么去应对这种故障。
首先我们想到处理故障的方法可能是备份:这里有两个备份的概念
- 冷备份:服务故障发生时,我用备份数据重启这个服务
- 热备份:我主服务和备服务同时跑,主服务挂了,我切成备服务
这里热备份中主备服务的切换有两种方式,要么我手动去切,要么机器自己识别故障去切
那么HDFS里是怎么做的呢?
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等方案