HDFS关键设计|青训营笔记

144 阅读4分钟

这是我参与【第四届青训营】笔记创作活动的第2天。

分布式存储系统基本概念

1)容错能力:能够处理绝大部分异常场景,例如服务器宕机、网络异常、磁盘故障、网络超时等。

2)一致性模型:为了实现容错,数据必须多副本存放,一致性要解决的问题时如何保障这不同机器多个副本的内容都是一致的

3)可扩展性:分布式存储系统需要具备横向扩张scale-out的能力,容量不够,可以通过加节点做一些扩展等。

4)节点体系:常见的有主从模式、对等模式等,无论是哪种模式,高可用是必须的功能

5)数据防止:系统是由多个节点组成,数据是多个副本存放时,需要考虑数据存放的策略

6)单机存储引擎:在绝大部分存储系统中,数据都是需要落盘持久化,单机引擎需要解决的是根据系统特点,如何高效的存取硬盘数据

1.NameNode目录树维护

fsimage

1)文件系统目录树

2)完整的存放在内存中

3)定时存放在硬盘上

4)修改是只会修改内存中的目录树

Editlog

1)目录树的修改日志,修改时实时的刷到硬盘上,掉电时可以通过Editlog构建出完整一致的目录树

2)client更新目录树需要持久化Editlog后才能表示更新成功

3)Editlog可循环在本地文件系统,也可存放在专用系统上

4)NameNode HA方案一个关键点就是如何实现Editlog共享

2 .NameNode数据放置

数据块信息维护

1)目录树保存每个文件的块id

2)NameNode维护了每个数据块所在节点信息

3)NameNode不会持久化数据块位置信息,启动时DataNade告诉NameNode有这些块,NameNode再去在内存中构建map信息

第二个更合理,第一个挂了之后所有数据都丢失,第二个挂了一个节点,还有两个副本可以读

数据放置策略

1)新数据存放到哪写节点

2)数据均衡需要怎么合理搬迁数据

3)3个副本怎么合理放置

3.DataNode

数据块的硬盘存放

1)文件在NameNode已分割成block

2)DataNode以block为单位对数据进行存取

这个块在DataNode上是怎么存放的

第一个绿框是硬盘盘符,第二三个绿色框是他的blockid是通过某种哈希算法算出来的,红色的第一个 框是他存的本身内容,第二个是元数据,描述块的校验码之类的

启动扫盘

1)DataNode需要知道本机存放了哪些数据块

2)启动时把本机硬盘上的数据块列表加载在内存中

4.HDFS写异常处理:Lease Recovery

情景:文件写了一半,client自己挂掉了。可能产生的问题:没有ACK,副本不一致;Lease无法释放

租约:Client要修改一个文件时,需要通过NameNode上锁,这个锁就是租约(Lease)

解决方法:Lease Recovery(租约恢复)副本不一致,比较三个副本大小长度,选择最小的作为最终版本去更新,返回给Name Node作为最终结果 租约无法释放,客户端拿到租约需要定期续租,挂掉了无法续约,客户端就会判断他死了,如果有别的进程想拿租约,就会把原来的踢掉。

5.HDFS写异常处理:Pipeline Recovery

情景:文件写入过程中,DataNode侧出现异常挂掉了,服务端出错了 异常出现的时机:

1)创建连接时

2)数据传输时

3)complete阶段

解决方法:Pipeline Recovery

6.Client读异常处理

情景:读取文件的过程,DataNode侧出现异常挂掉了

解决方法:节点Failover,和第二个节点连接读取副本

增强情景:节点半死不过,读取很慢(怎么检测是慢?)(客户端本身的网络环境导致的慢会导致无谓的切换)

7.旁路系统

Balancer:均衡DataNode的容量

Mover:确保副本放置符合策略要求

8.控制面建设

可观测性设施

1)指标埋点

2)数据采集

3)访问日志

4)数据分析

运维体系建设

1)运维操作需要平台化

2)NameNode操作复杂

3)DataNode机器规模庞大

4)组件控制面API