HDFS关键设计和优势

53 阅读6分钟

HDFS关键设计和优势

分布式存储系统基本概念

  • 01.容错能力:能够处理绝大部分异常场景,例如服务器宕网络异常、磁盘故障、网络超时等。机,、
  • 02.一致性模型:为了实现容错,数据必须多副本存放,一致 性要解决的问题是如何保障这多个副本的内 容都是一致的
  • 03.可扩展性:分布式存储系统需要具备横向扩张scale-out的能力
  • 04.节点体系:常见的有主从模式、对等模式等,不管哪种模式,高可用是必须的功能。数据放置系统是由多个节点组成,数据是多个副本存放时,需要考虑数据存放的策略。
  • 06.单机存储引擎:在绝大部分存储系统中,数据都是需要落盘持久化,单机引擎需要解决的是根据系统特点,如何高效得存取硬盘数据。

一、NameNode 目录树设计

fsimage(文件系统镜像)

  • 文件系统目录树
  • 完整的存放在内存中
  • 定时存放到硬盘上
  • 修改是只会修改内存中的目录树

EditLog(编辑日志)

  • 目录树的修改日志
  • client更新目录树需要持久化EditLog后才能表示更新成功
  • EditLog可存放在本地文件系统,也可存放在专用系统上
  • NameNode HA方案一个关键点就是如何实现EditLog共享

fsimage 和 EditLog 紧密相关

  • 初始状态下,NameNode 会创建一个初始的 fsimage 文件,记录当时文件系统的初始状态(可能是一个空的文件系统或者是在格式化等操作后形成的初始结构)。
  • 随着文件系统的运行,各种操作不断发生,EditLog 不断累积这些操作记录。当达到一定条件(如经过一定时间间隔、EditLog 达到一定大小等),NameNode 会基于当前的 fsimage 和 EditLog 中的所有记录,通过一个合并(checkpoint)过程生成一个新的 fsimage,这个新的 fsimage 将反映出经过一系列操作后的最新文件系统状态,同时原来的 EditLog 可以被清空(或进行合适的归档处理),以便重新开始记录后续的操作。
  • 这种设计使得 NameNode 能够高效地管理文件系统元数据,既能够通过 fsimage 快速恢复到某个已知状态,又能够通过 EditLog 准确记录期间发生的所有变化,从而保证文件系统在长期运行过程中始终保持元数据的准确和完整。

二、NameNode 副本放置

数据块信息维护

  • 目录树保存每个文件的块id
  • NameNode维护了每个数据块所在的节点信息
  • NameNode根据DataNode汇报的信息动态维护位置信息
  • NameNode不会持久化数据块位置信息

数据放置策略

  • 新数据存放到哪写节点
  • 数据均衡需要怎么合理搬迁数据
  • 3个副本怎么合理放置

三、DataNode 设计

数据块的硬盘存放

  • 文件在NameNode已分割成block
  • DataNode以block为单位对数据进行存取

启动扫盘

  • DataNode需要知道本机存放了哪些数据块
  • 启动时把本机硬盘上的数据块列表加载在内存中

四、Client 读写流程异常处理

1. HDFS 写异常处理Lease Recovery

image-20241124110231303.png

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

情景: 文件写了一半,client 自己挂掉了,可能产生的问题

  • 副本不一致
  • Lease无法释放

解决方法: Lease Recovery(租约恢复)

  • 比较系统中三个副本内容大小长度,长度不一样选择最小的,更新,返回给namenode

  • 客户端拿到后续租,10分钟后没续约namenode判断已死,将租约强制回收

2. HDFS 写异常处理Pipeline Recovery

image-20241124105914974.png

情景: 文件写入过程中,DataNode 侧出现异常挂掉了,

异常出现的时机:

  • 创建连接时
  • 数据传输时
  • complete阶段

解决方法: Pipeline Recovery(管道恢复)

  • 创建连接时:当创建连接时 DataNode 异常挂掉,客户端与 NameNode 的通信会检测到连接失败。NameNode 会依据可用 DataNode 资源重新规划数据传输管道,选其他健康 DataNode 替代,新管道构建成功后更新相关状态记录,以确保数据能继续传输
  • 数据传输时:数据传输时若 DataNode 挂掉,上游 DataNode 会察觉传输中断。客户端先尝试局部修复管道,跳过故障节点与下一个健康 DataNode 重连形成新路径。若局部修复不够,会告知 NameNode 调整整个管道。同时要处理数据一致性问题,保证已传数据后续不出差错。
  • complete阶段:在 complete 阶段 DataNode 异常挂掉,会确认完成状态异常。先对已传数据进行完整性检查,若有不完整或损坏情况,视情况利用其他副本修复或重建。完成相关工作后更新状态记录并重新确认文件写入是否真正完成,保障文件系统稳定运行。

3. Client 读异常处理

image-20241124105934673.png

请景: 读取文件的过程,DataNode 侧出现异常挂掉了 解决方法: 节点 Failover

  • 客户端与故障 DataNode 连接中断后反馈给 NameNode,NameNode 选健康节点替换故障节点,通知客户端重定向数据读取到新节点并更新相关状态记录。

增强情景: 节点半死不过,读取很慢

  • 客户端或 NameNode 监测到 DataNode 读取很慢,NameNode 综合考虑决定是否进行 Failover,若进行则选健康节点替换,通知客户端重定向数据读取到新节点,之后 NameNode 还会做后续优化及更新状态记录。

五、HDFS 旁路系统

image-20241124114014336.png

异步去解决可能出现的问题

  • HDFS 的 Balancer 主要负责对 DataNode 的容量进行均衡处理,以保障集群存储资源的合理分配。
  • HDFS 的 Mover 着重于确保副本放置严格符合相关策略要求,维持副本布局的规范性和有效性。

六、HDFS 控制面建设

可观测性设施

  • 指标埋点
  • 数据采集
  • 访问日志
  • 数据分析

运维体系建设

  • 运维操作需要平台化
  • NameNode 操作复杂
  • DataNode 机器规模庞大
  • 组件控制面 API