这是我参与「第四届青训营 」笔记创作活动的的第4天
之前看了GFS的论文,感觉HDFS和GFS非常想,一些处理的理念也十分相似。
HDFS结构
-
HDFS组件
- Client/SDK:读写操作的发起点,HDFS很多读写逻辑都是在SDK中实现的。
- NameNode:元数据节点,是HDFS的中枢节点,也是服务的入口。(对应GFS的master)
- DataNode:数据节点,存放实际用户数据。(对应GFS的Chunkserver)
-
分布式存储系统的基本概念,这些概念基本上每个分布式存储系统都会涉及到。
- 容错能力
- 一致性模型
- 可扩展性
- 节点体系模式
- 数据放置策略
- 单机存储引擎
NameNode
目录树维护
fsimage:文件系统的目录树,完整的存放在内存中,定时存放到硬盘上,修改只会修改内存中的目录树
定期将目录树保存到硬盘上,同时使用Log来记录目录树的修改日志(EditLog)
数据放置
-
数据块信息维护
- 目录树保存每个文件的块id
- NameNode维护了每个数据块所在的节点信息
- NameNode根据DataNode汇报的信息动态维护位置的信息
- NameNode不会持久化数据块的位置信息
-
数据放置策略
- 数据均衡(在GFS中使用master节点来进行负载均衡)
DataNode
存储以Block为单位(在GFS中即Chunksize)进行存取
每一个节点需要知道本机存放了哪些数据块
启动时把本机硬盘上的数据块加载在内存中
Lease Recovery
问题:在写过程中mclient自己挂了
可能副本不一致,lease无法释放
和GFS中租约是一样的,对每个文件master管理租约,租约可以是一个有时间限制的锁
HDFS写异常
问题:文件写入,有DataNode出现问题
GFS中的解决方案:利用租约以及控制流和数据流分离,对副本划分primary和secondarys,对不同的节点出现问题的情况进行重试,或者回退。
GFS问题中提出的问题值得注意:为了加速,client中请求master中的信息后,会缓存在自己的内存中,这时候就这涉及到了对master中的记录和client中之前请求的内容出现不一致的情况
HDFS读
读文件过程中,出现DataNode异常——有多个副本,进行切换
旁路系统
Balancer
负载均衡,使得各个DataNode节点存储使用尽量均衡
同时均衡还包括每个节点的IO均衡,带宽等多个系统
Mover
数据放置策略——为了可靠性需要有数据分散的副本,分布在不同的机架上
控制面建设:保障系统稳定运行
- HouseKeeping组件:比如Balancer,Mover等, 这些组件不运行不会马上影响读写操作,但是长时间会积累系统性问题,例如读写不均衡导致IO热点等。
- 可观测性设施:比如系统指标监控设施等,帮助快速发现定位问题。
- 运维体系建设:从最基本的命令行手工操作,脚本自动化再到完善的运维平台。