HDFS原理 | 青训营笔记

118 阅读3分钟

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

我们小组经过讨论,大家的对大项目3-分布式存储系统实现较为感兴趣,因此将其作为我们奋斗的目标。

经过我们的分析基本就是实现一个HDFS青春版。大致概括就是实现分布式存储并向外暴露HTTP接口,并且也可以监控接口的流量。其实说的简单,分布式系统的设计与实现要比单体应用难很多,一些意想不到的error也会出现。希望我们能完成这个项目。

HDFS基本介绍

HDFS的Hadoop生态里的分布式文件系统,其为存储层。 相对于单机文件系统其有很多优点\

  1. 大容量,可扩展性强
  2. 高可用,容错能力强
  3. 低成本,可以将异构硬盘组合

分布式存储系统有很多,比如ceph,OSS,HDFS,TiDB,Cassandra等

HDFS的实现

HDFS可以说是GFS的开源实现版本,它是用Java实现的。HDFS组件分为Client,Datanode,Namenode.

Namenode

Namenode是元数据节点,它负责维护目录树(维护目录树的增删改查操作,保证所有修改都能持久化),维护文件与数据块以及数据库存储位置的信息,分配新文件存放节点(Cient创建新的文件时候,需要有NameNode来确定分配目标DataNode)

Datanode

Datanode是数据节点,它负责数据块的物理存取,heartbeat,replica(数据写入时Pipe line IO操作 机器故障时补全副本)

系统中的关键设计

NameNode目录树维护

目录树是完整的存放在mem中,并且会定期持久化到磁盘上,修改只会修改内存里的目录树。对目录树的修改会生成日志。client在更新目录树时需要等待修改日志持久化成功(这个思想类似于WAL)EditLog(目录树修改日志)可存放在本地文件系统,也可存放在专用系统上。如何实现EditLog共享这是一个优化。

NameNode数据放置

目录树中保存每个文件的ID,NameNode维护了每个数据块所在的节点信息,NameNode根据DataNode汇报的信息动态维护位置信息,NameNode不会持久化数据块位置信息(仅仅在内存中)。
数据放置策略,比如新数据存放到哪写节点(局部性原理,可以利用IP算出距离,将新来的数据放在尽可能离产生该数据的节点近的地方)
数据均衡 需要怎么合理迁移数据 3个副本怎么合理放置(3副本应该尽可能将其打散开,在GFS论文中,有提到针对热点数据会维护更多的备份,我们可以维护一个有限LRU队列,开一个goroutine来扫这个队列,增加其中的数据的副本数量)