架构师必知必会系列:分布式文件系统与存储

发布于:2023-09-27 ⋅ 阅读:(76) ⋅ 点赞:(0)

作者:禅与计算机程序设计艺术

1.简介

分布式文件系统(Distributed File System,DFS)是指在网络中跨越多个计算机或设备进行文件的共享、保存和管理的一套技术体系。DFS能够提供高可靠性和容错能力,适用于海量数据、分布式环境、多用户场景等各种应用领域。本文将从分布式文件系统的整体架构、特性及其发展方向、使用场景、技术优势、扩展性、管理工具等方面对分布式文件系统进行详细阐述。

阅读本文需要具备相关的知识背景,如操作系统、计算机网络、数据库、编程语言、缓存机制、并发控制、锁等。并且需要掌握Linux/Unix下文件系统相关命令,如ls、cd、mkdir、rm、mv、cp等。另外,对HDFS、NFS、Ceph、GlusterFS、AthenaFS、Swift等一系列主流分布式文件系统有一定的了解也非常有帮助。

2.DFS概述

2.1 DFS简介

分布式文件系统(Distributed File System,DFS),是指在网络中跨越多个计算机或设备进行文件的共享、保存和管理的一套技术体系。它提供了高可靠性和容错能力,适用于海量数据、分布式环境、多用户场景等各种应用领域。目前市面上主要有以下几种分布式文件系统:

  1. HDFS:Hadoop Distributed File System (HDFS) 是 Hadoop 的核心组件之一。它是一个开源的分布式文件系统,由Apache基金会开发维护,支持超大文件(超过100PB)和高吞吐量的数据访问。HDFS通过它自带的名字节点(NameNode)和数据节点(DataNode)实现分布式文件存储。HDFS具有高度容错能力,能够自动处理机器故障,并通过复制机制确保文件数据的安全和完整性。
  2. NFS:Network File System(NFS)是一种远程文件协议,基于标准的BSD sockets,被广泛地应用于各类Unix平台。它允许客户端通过网络文件系统的方式来访问文件,具有很高的性能和灵活性。NFS在客户端-服务器架构中运行,其中客户端通过访问服务器上的共享目录来读写文件。NFS可以提供高性能和低延迟的文件共享服务。
  3. Ceph:Ceph是一个高度可用的、基于分布式存储技术的开源文件系统,由CNCF基金会管理。它支持POSIX兼容的文件系统接口,可以方便地部署到私有云、公有云、大数据中心等各种分布式环境中。Ceph的文件存储系统具有优秀的扩展性和高可用性,可以有效解决大规模数据存储和计算的问题。
  4. GlusterFS:GlusterFS是一个分布式文件系统,它将网络存储和计算资源组合成一个统一的存储池。通过这种存储池,用户可以透明地访问不同的存储设备,而不需要考虑底层的存储技术。GlusterFS的文件系统接口与Linux FUSE模块兼容,使得它可以在现有的集群环境中无缝集成。GlusterFS可以在单个服务器上安装,也可以配置成一组服务器构成的集群。
  5. AthenaFS:AthenaFS是华为自研的分布式文件系统,支持POSIX兼容的文件系统接口,通过两级数据校验保证数据完整性,并提供数据副本功能。AthenaFS具有良好的可靠性、可用性和扩展性。它可以在不同的数据中心之间同步数据,使得用户的使用感受不到任何延迟。
  6. Swift:Swift是一个面向对象的云存储系统,旨在满足客户在线存储需求。它采用了对象存储、多租户、RESTful API等设计理念,具有较高的可靠性、可用性和扩展性。Swift独特的设计理念使得其可以很好地应对实时分析、大数据、移动设备等应用场景。Swift支持多种认证方式,包括Keystone、OAuth2.0、tempauth、静态密钥和令牌认证等。

2.2 DFS架构

2.2.1 通用架构

一般来说,分布式文件系统都有如下的架构:

上图展示了一个分布式文件系统的典型架构,其中包括客户端、名字节点(NameNode)、数据节点(DataNode)、数据复制模块(Data Replication Module)。分布式文件系统由多个数据节点组成,每个数据节点负责存储集群中的一块物理磁盘。文件系统的元数据信息都记录在名字节点中,并通过心跳检测保持正常连接状态。客户端可以通过名字节点来获取文件系统的元数据信息,并通过数据复制模块把文件数据复制到其他数据节点,实现数据的冗余备份。

2.2.2 Namenode & Datanode架构

HDFS的主要模块是名称节点(NameNode)和数据节点(DataNode)。HDFS的名称节点通常部署在HDFS集群的主服务器上,它是文件系统的中心枢纽,负责管理文件系统的命名空间以及客户端的所有元数据。

名称节点的职责如下:

  1. 命名空间管理:名称节点主要负责维护整个文件系统的目录结构、数据块映射信息,并做相应的权限控制和数据流转操作。

  2. 数据复制与失效恢复:名称节点负责监控数据节点健康状况,同时也会根据集群情况对文件进行复制,确保数据的高可用性。

  3. 客户端接口与日志解析:名称节点提供客户端查询文件系统元数据的接口,并接收客户端写入或读取文件系统的请求,日志文件记录了对文件系统执行过的所有的操作,客户端可以通过日志文件来追溯历史变更操作。

数据节点的职责如下:

  1. 数据存储:数据节点主要用来存储HDFS文件系统的数据块。

  2. 数据服务:数据节点定期向名称节点发送心跳信号,以报告自己是否正常工作。

  3. 数据操作:数据节点在接收到客户端的读写请求后,会直接对本地磁盘进行读写,并通过网络传输给其他数据节点进行数据复制。

3.DFS概念术语

3.1 文件

在分布式文件系统中,文件(File)是分布式存储的文件单位,相对于传统的文件,它拥有更丰富的特性,例如可以动态修改,可以进行权限控制,可以进行版本管理。文件存储在数据节点上,并以数据块的形式存储。数据块大小通常是64MB,但是可以调整,具体取决于文件系统设置。

3.2 数据块(Block)

数据块是HDFS中最小的存储单元。HDFS默认块大小为64MB,这意味着如果写入的数据小于64MB,则写入的数据占用整个块的空间。当数据大于64MB的时候,剩下的部分才会成为另一个数据块。

3.3 文件切片(Fragment)

文件切片(Fragment)是HDFS中次级存储单元。由于数据块的限制,实际上无法写入任意大小的数据。HDFS在写入之前,首先会把数据分割成固定大小的切片,然后再存入对应的DataNode中。

3.4 副本(Replica)

副本(Replica)是HDFS中文件数据冗余备份的重要手段。每个文件可以有多个副本,存储在不同的DataNode上,以提高数据可靠性。副本数量通常建议设置为3,但可以根据业务情况调整。副本的创建、删除和重新平衡都是自动完成的。

3.5 数据节点(DataNode)

数据节点(DataNode)是HDFS中负责存储和检索文件的节点。HDFS中的所有数据都存储在数据节点上,包括数据块、索引和元数据信息。数据节点是HDFS集群的计算和存储资源主要保障。数据节点主要职责如下:

  1. 数据存储:数据节点主要用来存储HDFS文件系统的数据块。

  2. 数据服务:数据节点定期向名称节点发送心跳信号,以报告自己是否正常工作。

  3. 数据操作:数据节点在接收到客户端的读写请求后,会直接对本地磁盘进行读写,并通过网络传输给其他数据节点进行数据复制。

3.6 冗余类型(Replication Type)

冗余类型(Replication Type)是HDFS中用于描述副本的复制策略。HDFS支持两种类型的副本:标准类型和完全类型。标准类型副本的拷贝数目等于集群中DataNode的数量,完全类型副本的拷贝数目永远为1。

3.7 文件属性(File Attribute)

文件属性(File Attribute)是HDFS中用于描述文件属性的元数据信息。HDFS中的文件属性包括文件名、文件大小、权限、最后修改时间、创建时间、副本数目等。文件属性的元数据信息保存在名称节点上。

3.8 分区(Partition)

分区(Partition)是HDFS中用于划分存储空间的逻辑概念。在存储空间比较大的情况下,为了便于管理,可以将同一群文件夹放在一起,这样就可以降低DataNode之间的通信开销,提升集群的整体性能。

3.9 数据编码(Encoding)

数据编码(Encoding)是HDFS中用于描述数据块的编码方式。HDFS中的数据块以字节序列的形式存储在磁盘上。在实际的使用过程中,会对数据块做压缩、加密等编码处理,以减少存储空间和加速数据传输过程。

3.10 数据校验(Checksum)

数据校验(Checksum)是HDFS中用于确认数据完整性的重要工具。HDFS会在写入数据前计算数据块的MD5码作为校验值,确保数据完整性。

3.11 数据管道(Pipeline)

数据管道(Pipeline)是HDFS中用于减少网络通信的一种优化方法。HDFS支持利用数据管道来提升客户端写文件的性能。在默认情况下,HDFS一次性写入多个数据块,而不是逐个数据块写入。

3.12 客户端(Client)

客户端(Client)是访问HDFS的主要途径。客户端通过与名称节点通信,获取文件系统的元数据信息,并通过数据复制模块把文件数据复制到其他数据节点,实现数据的读写。

3.13 授权(Authorization)

授权(Authorization)是HDFS中用于对用户进行权限控制的功能。HDFS通过文件系统的ACL(Access Control List)机制来实现授权管理。ACL定义了一系列访问控制规则,可以指定某个用户或者某组用户对特定文件系统操作的权限。

3.14 增量备份(Incremental Backup)

增量备份(Incremental Backup)是HDFS中用于支持文件变化增量备份的机制。当文件发生变化时,只需备份变化的内容,不必备份整个文件。增量备份可以显著节省磁盘和网络IO资源,并可以加快文件恢复速度。

4.核心算法原理及操作步骤详解

4.1 文件创建流程

创建新的文件,需要先申请一个唯一的inode号,在将inode写到硬盘中,创建一个数据块来存储该文件数据,最后向文件系统表(文件目录树)中添加一条记录。

4.2 文件追加流程

如果要往已存在的文件中追加新的数据,则需要定位文件的最后数据块,并将新的数据追加到此数据块后面,然后在表项中更新文件的长度。如果当前数据块已经满了,则需要创建一个新的数据块,并把数据追加到这个新的块里。

4.3 文件重定位流程

如果文件被重命名了,或是父目录发生了移动,则需要修改表项中的路径信息。在修改路径时,HDFS要保证父目录中的条目是最新的,因此需要对路径信息和条目的缓存进行同步。

4.4 数据块合并流程

如果多个数据块因为过期或空间不足而不能在同一个DataNode中,HDFS会将这些数据块合并成一个更大的数据块。这样可以避免产生大量的小文件,提高查询效率。数据块合并的过程如下:

  1. 找到相同的文件夹中距离现在最近的一个数据块。

  2. 将需要合并的数据块找出来。

  3. 在内存中构建一个新的数据块。

  4. 使用CRC校验来检查数据块的完整性。

  5. 把新的数据块写到磁盘。

  6. 更新原来的数据块的引用次数。

  7. 删除旧的数据块。

4.5 数据块分配流程

当数据块被创建、追加或合并之后,还需要选择一个DataNode去保存这些数据块。HDFS通过维护一个Balancer线程,周期性地扫描DataNode的健康状况,并将过载的DataNode上的数据块迁移到其它节点上,以平衡集群的数据分布。

5.代码实例

import os
from hdfs import InsecureClient


client = InsecureClient('http://localhost:50070', user='root') # 创建InsecureClient实例

file_name = '/data/file'      # 指定文件路径及文件名

if client.status(file_name, strict=False):     # 判断文件是否存在
    print("file exists!")
else:
    with open('/path/to/localfile', 'rb') as f:   # 打开本地文件
        data = f.read()                            # 读取文件数据

    client.write(file_name, data)                  # 上传文件至hdfs

    if client.status(file_name):                   # 判断文件是否成功上传
        print("upload success!")

with client.read(file_name) as reader:              # 从hdfs下载文件
    chunk = reader.read(1024*1024)                 # 以1MB为单位下载文件
    while len(chunk) > 0:                          # 当还有数据时循环读取
        process(chunk)                              # 对数据进行处理
        chunk = reader.read(1024*1024)               # 继续下载

for _ in client.list(directory='/'):                # 列出hdfs根目录文件列表
    print(_)                                       # 打印文件名

os.remove(filename)                                  # 删除hdfs文件
client.delete(file_name)                             # 删除hdfs文件

6.未来发展趋势与挑战

随着技术的发展,分布式文件系统也在不断改进升级,下面是一些常见的分布式文件系统的发展趋势:

  1. 大规模文件系统:HDFS在今年的3月份开源,并在国内得到推广应用。虽然HDFS目前已经接近顶尖,但还是面临着巨大的发展瓶颈,主要有两个因素造成的:

    • 大文件读取速度慢:HDFS是面向大数据量的存储系统,目前HDFS只能通过字节码的方式来读取大文件。而字节码的方式对于大的文本和视频文件来说,效率太低,大大影响了用户体验。
    • 小文件存储问题:HDFS是面向大规模数据集的分布式文件系统,但小文件问题一直困扰着HDFS的开发者。当遇到小文件时,HDFS的存储效率很差。
  2. 动态部署:目前HDFS的部署架构仍然是固定的,即客户端通过TCP/IP端口与NameNode通信,与DataNode通信。这就使得HDFS在局限于一定的部署规模和网络带宽的情况下,无法满足现代化的计算环境需求。大型企业或组织希望能够弹性部署HDFS,并根据实时的业务需要动态调整HDFS的存储规格和集群规模。

  3. 弹性扩展:HDFS的可伸缩性一直是HDFS面临的最大挑战。很多公司担心HDFS的扩展性不够,导致集群出现性能瓶颈。HDFS的存储容量、计算能力、网络带宽、数据节点个数等参数都是可以动态调整的。而弹性扩展又需要配合自动调度算法,否则会引入新的复杂性。

  4. 更智能的压缩与缓存:当前HDFS采用的压缩格式主要为 gzip 和 snappy,但这两种压缩方式都存在一些缺陷,比如解压效率低,加载耗时长。而新的更高效的压缩方式如 LZO、LZ4、ZSTD、DEFLATE,它们的压缩率和解压率都比 gzip 和 snappy 有所提升,而且加载速度更快。不过,这些格式的支持需要依赖于底层的文件系统,HDFS可能需要与操作系统厂商协作才能实现这一点。

  5. 可信存储:由于HDFS的计算节点和存储节点分别承担计算任务和数据存储任务,这就要求HDFS具有高度的可靠性。HDFS当前使用的一种机制是 Journal Node,它作为独立的服务器,维护HDFS的元数据,并向 NameNode 发送事务日志。但是这种机制有一个明显的缺陷,就是性能比较低。所以,目前还没有看到大型公司或组织采用这种可信存储架构。

7.总结与展望

本文主要对HDFS分布式文件系统进行了整体介绍,并详细分析了HDFS的各种特性和功能,以及HDFS的各种核心算法及其操作步骤,并且给出了HDFS的Python客户端库的简单使用示例。随着HDFS在企业级环境的应用日渐普遍,分布式文件系统的发展也在不断推进。未来,随着大数据技术的不断革新和深度应用,分布式文件系统还将呈现出更多的惊喜与挑战。


网站公告

今日签到

点亮在社区的每一天
去签到