1.概述

何为文件系统?
文件系统由文件名、元数据(Metadata)和数据块(Block)组成,文件系统好比一本新华字典,不同的是字典通过部首、检字表、索引来找到所需要的字,而这些正是这个字的属性;而文件系统中,元数据指的是系统中数据的数据,包括文件创建的时间、大小、位置等,数据块则为实际存储时的一个位置和大小。

image.png

2.架构

client:负责外界请求的响应,通过与NameNode,DataNode的交互来反馈给外界,给出响应;
NameNode:存储元数据,Metadata,包括一些位置信息,文件的大小等等;
DataNode:实际存储数据的部分,Block位于这一部分中,而一个block有存储上限(128M);
image.png

  • NameNode与Client之间存在元数据心跳(Metadata ops),NameNode与DataNode存在block心跳,这些心跳持续地以一定间隔来向上反馈。
  • HDFS存储时数据以3副本(默认)的形式存放,在DataNode内部执行Replication的复制操作,以block为单位复制。
  • NameNode存储是基于内存的,会在内存中存储一份完整的元数据,在机房下电、重启时这些元数据会进行落盘,落于磁盘上,来确保元数据不会消失;DataNode存储是基于磁盘的。

3.流程

1)写入

image.png

  • 2.create是在NameNode中新建1个节点,用于之后自身元数据的存储;
  • 重复的第4、5步,是为了遵循存储的3副本机制,4为以数据包形式写入数据,5为对数据写入的答复;
  • 6.close:将所有的连接关闭
  • 7.complete是在NameNode当中将元数据补充完整;

    2)读取

    image.png

  • NameNode是基于内存的,存储大量小文件会受到内存的限制,众多的元数据容易造成内存频繁的溢出,使得无法保存完整的元数据。

4.关键特性

image.png

1)高可靠性(High Availability)

image.png

  • 主要通过zookeeper组件完成,zookeeper为其他所有组件提供分布式协调服务的,目的是为了达到集群的高可靠性;
  • 在一个HDFS集群当中,只存在一个active的NameNode,但会有备用的NameNode(stand by),多个DataNode和Client。主备NameNode的管理和切换由Zookeeper进行监控,其切换操作主要由ZKFC实例来控制,主备切换过程涉及元数据持久化;
  • JN主要存储EditLog,EditLog是元数据操作的日志文件;

    2)元数据持久化

    image.png

  • 元数据持久化其意义在于将内存中的元数据同步于磁盘,下点、重启后可重新将元数据由磁盘提取出来;

  • 备NameNode是不进行具体的元数据的操作的,只存储于磁盘来进行备份,是不存在于内存中的;
  • Fsimage:某一时间戳下内存中的元数据的一个快照,存在于磁盘上主NameNode的备份位置,t0时刻的Fsimage是可以和t0时刻内存中的Meatdata划等号的;
  • EditLog:记录元数据操作的日志文件,存在于JN上;
  • 例如t0时间点做了元数据持久化,经过一段时间后到了t1时刻,此时磁盘中的Fsimage仍处于t0时刻,内存中的Metadata为t1时刻,而由t0至t1时刻过程中元数据的变化会记录在EditLog中,磁盘上主NameNode节点的EditLog和Fsimage合并生成Fsimage.ckpt文件,这份新生成的快照文件会传回主节点,并回滚到主节点t0时刻Fsimage快照文件上,更新文件为t1时刻的Fsimage。在这一切完成后时间为t2时刻,而t1至t2这一段时间内元数据新的操作日志就记录在步骤1时创建的EditLog.new文件中,并在第5步回滚到EditLog上,更新后的EditLog文件用于下一次的元数据持久化;

    3)联邦特性(Federation)

    image.png

  • 由于NameNode基于内存存储,HDFS的水平拓展易受到内存限制,如无法新建DataNode节点,使得性能无法提升;

  • 通过设置不同的Namespace,即建立与对应的NameNode和每一个NameNode对应的资源池pool。pool资源池被各自的NameNode单独使用,NameNode和pool一起称为Namespace;
  • 与HA不同,联邦机制提供了若干个彼此独立的NameNode,所有Namespace彼此相互独立但可以共同操作底层的DataNode;
  • HDFS联邦机制适用于100PB以上的数据量存储的场景;

    4)数据副本机制

    image.png

  • HDFS默认有3副本机制,因此进行数据读写时会有先后数据;

  • 机架感知原理:同一服务器内distance=0,同一机架不同服务器之间distance=2,不同机架之间distance=4。如,Client与B1距离为0,与B3距离为2,与B2、B4距离为4;
  • 读操作:读取遵循就近原则;
  • 写操作:先写最近,再写最远,最后写中间距离的;