这是我参与「第四届青训营 」笔记创作活动的的第1天
HDFS基本介绍
常见文件系统
Windows单机文件系统
Linux文件系统
BTRFS,ZFS,XFS,EXT4 Linux目前支持近一百种文件系统
分布式文件系统
优点 大容量 高可靠 低成本
目前的分布式文件系统
HDFS功能特性
分布式
HDFS是收到GFS启发,用java实现的开源系统,没有实现完整的POSIX文件系统语义
容错
自动处理、规避多种错误场景,例如常见的网络错误、机器宕机等。
高可用
一主多备模式实现元数据高可用,数据多副本实现用户数据的高可用
高吞吐
Client直接从Data Node读取用户数据,服务端支持海量client并发读写。
可扩展
支持联邦集群模式,DataNOde数量可以达10w级别
廉价
只需要统一硬件,无需定制高端的昂贵硬件设备
架构原理
HDFS组件
client 访问HDFS的机器。
NameNode HDFS的中枢节点,三大件中最为复杂的。
DataNode 储存信息的结点。
Client写流程
Client读流程
元数据节点NameNode
维护目录树
维护文件和数据块的关系
维护文件块存放节点信息
分配新文件存放节点
数据节点DataNode
数据块存取 心跳汇报 副本复制
关键设计
分布式存储系统的基本概念
容错能力
能处理绝大部分异常场景。
一致性模型
为实现容错,数据必须多副本存放,一致性要解决的问题是如何保障副本的内容一致。
可扩展性
具备横向扩张能力
节点体系
常见有主从模式,对等模式,不管是哪种模式,都要保持高可用。
数据放置
系统由多个节点组成,数据是多个副本存放时,要考虑数据存放的策略。
单机存储引擎
在绝大部分存储系统中,数据都是需要落盘持久化,单机引擎需要解决根据系统特点,如何高效存取硬盘数据。
NameNode目录树维护
fsimage
- 文件系统目录树
- 完整的放在内存上
- 定时存放到硬盘上
- 修改只修改内存中的目录树
Editlog
- 目录树的修改日志
- client更新目录树需要持久化EditLog后才能表示更新成功
- EditLog可存放在本地文件系统。
- 关键点在于如何实现EditLog共享。
NameNode数据放置
数据块信息维护
- 目录树保存每个文件的块id
- NameNode维护了每个数据块所在的节点信息
- NameNode根据DataNode汇报的信息动态维护位置信息
- NameNode不会持久化数据块位置信息
数据放置策略
- 新数据存放到哪个节点
- 数据均衡需要怎么合理搬迁数据
- 三个副本如何合理放置
DataNode
数据块的硬盘存放
- 文件在NameNode已分割成block
- DataNode以block为单位对数据进行存取
启动扫盘
DataNode需要知道本机存放了哪些数据块 启动时吧本机硬盘上的数据块列表加载到内存中
HDFS写异常处理:Lease Recovery
文件写入时client挂了会发生什么
- 副本不一致
- Lease无法释放,Client要修改一个文件时,要通过NameNode上锁,就是Lease
解决方法
Lease Recovery: 对于副本不一致的解决方法的思想 选择三个副本中最小的副本作为最终结果。 Lease无法释放的解决方法 设置租约时间。
HDFS写异常处理:Pipeline Recovery
文件写入过程中,DataNode挂了
出现时间
创建连接时 数据传输时 complete时
解决方法
Pipeline Recovery
Client读异常
DataNode出现异常
解决方法
切换另外一个Failover
旁路系统
Balancer:均衡DataNode的容量。 Mover:确保副本放置符合策略要求。
控制面建设
可观测性设施
指标埋点 数据采集 访问日志 数据分析
运维体系建设
运维操作需要平台化 NameNode操作复杂 DataNode机器规模庞大 组件控制面API