当前位置: 首页 > 科技观察

研究所的一篇文章说,分布式文件系统

时间:2023-03-22 13:54:08 科技观察

文件系统是我们每天直接或间接使用的最熟悉的技术,但是谈到文件系统的定义,我们会显得有些模糊。任何技术的出现都是为了解决实际问题,那么文件系统解决的是什么问题呢?本质上,文件系统是一种为了简化用户对磁盘等存储设备的使用而出现的系统管理软件。它有效地组织了磁盘中的数据,并以更生动的方式呈现给用户。Ext4、XFS等传统文件系统只能在本地使用,但随着数据量的不断增加和资源共享需求的出现,分布式文件系统技术应运而生。1.概述分布式文件系统(DFS)是一种分布在多个服务器节点上的存储系统。其本质是通过统一多个服务节点的本地文件系统,构建一个名称统一的“联合”文件系统。通过分布式文件系统提供的接口,用户可以像传统文件系统一样使用其中的数据。当用户向分布式文件系统中写入文件时,分布式文件系统负责将文件划分并保存在不同的节点上。这意味着一个文件会分布在不同的节点上,用户可以并行读写这个文件,从而提高文件处理效率。2.元数据管理对于分布式文件系统来说,最关键的问题是维护数据的逻辑位置和物理位置的关系。我们通常称这部分数据为元数据。元数据的管理方式对整个系统的性能、可扩展性和部署模型起着决定性的作用。主流的分布式文件系统的元数据管理通常有以下几种方式:集中式元数据:传统的横向扩展系统大多采用独立的元数据节点来解决数据索引问题。元数据节点存储所有文件的名称和位置等属性,其他优点是实现简单、成本低,但存在性能瓶颈和单点故障两个不可避免的问题。当我们访问数据时,其元数据往往需要同步更新。随着文件数量的增加和集群规模的扩大,元数据服务将成为制约集群规模和影响集群性能的重要因素。另外,在集中式元数据架构中,元数据服务器是最核心的。一旦发生故障,整个系统将失去可用性,需要额外引入。分布式元数据:分布式元数据将元数据分布在多个服务器中,每个服务器可以独立提供元数据服务。元数据同步在集群内执行。分布式元数据解决了集中式元数据的问题。性能瓶颈和单点故障问题,反而让整个系统变得更加复杂,带来大量的性能开销。无元数据服务:在没有独立元数据服务的架构中,无论是客户端还是系统节点,只要知道文件的路径名和文件名,就可以根据算法定位到数据,因为每个节点具有独立解决元数据问题的能力,因此这种实现方式无需同步元数据,避免了元数据带来的一切问题,真正实现了系统的线性扩展。缺点是会消耗一定的计算能力。3、GlusterFS下面以GlusterFS为例,进一步了解分布式文件系统的架构、实现方法和测试方法。GlusterFS是一个开源的可伸缩分布式文件系统。它通过TCP或InfiniBand高速网络,有效整合多台服务器上的磁盘资源,提供统一的全局命名空间。GlusterFS具有强大的水平扩展能力,可以扩展到数PB空间,支持大量客户端并发访问。它是纯软件实现,可以在标准服务器上运行。并且兼容POSIX,应用可以平滑迁移。其架构如下图所示。它主要由服务器和客户端组成。所有服务器节点都称为可信存储池。可信存储池甚至可以只包含一个节点。每个节点可以有多个Brick。Bricks可以是Ext4、xfs、btrfs等文件系统,多个Bricks可以组合成几种不同类型的volume。图1GlusterFS架构图分布式Glusterfs卷(DistributedGlusterfsVolume):这类卷以文件为单位分布到各个brick中,其主要作用是扩展整个文件系统的空间。其数据没有任何冗余保护,可以信任。池中任何一个节点发生故障都会导致数据丢失,数据可靠性完全依赖于底层。下图是由两块砖组成的分布式卷。图2ReplicatedGlusterfsVolume:为了避免分布式卷中数据丢失的风险,复制卷将数据复制到其他节点。创建卷时可以指定副本数。一个(取决于卷副本的数量)brick中的数据丢失并且仍然可以通过剩余的bricks访问。下图是由三块砖组成的复制体。图3分布式复制Glusterfs卷(DistributedReplicatedGlusterfsVolume):该卷在分布式卷和复制卷的基础上重新组合,文件分布在多个复制卷上,同时满足高可用性和可扩展性。图为一个由4块brick组成的2-copy分布式复制卷。图4分散卷(DispersedGlusterfsVolume):分散卷是基于纠删码实现的。创建分散卷时,可以通过指定冗余值来调整整个卷的可靠性。它决定了在不影响数据访问的情况下,可以丢砖的数量。下图是一个冗余度为2的分散卷,由6块砖组成。它的可用空间是所有砖块空间的三分之一。即使2块brick损坏,也不会影响对volume中数据的访问。分散的卷在冗余和可用容量之间提供了一种更平衡的解决方案。图5DistributedDispersedGlusterfsVolume:类似于分布式复制卷,只是它的子卷是分散卷。下图显示了一个由6个砖块组成的分布式分散卷。图6GlusterFS客户端实现原理:GlusterFS原生客户端是基于fuse(Userspace中的Filesystem)实现的。fuse作为Linux内核的一个模块,实现了VFS与用户应用程序的交互,使得用户空间文件系统成为可能。如下图,用户执行ls命令后,请求通过glibc到达VFS,VFS将请求传递给fuse模块。最终请求由hello程序处理并返回结果。本机客户端是首选方法。此外,GlusterFS还支持NFS等访问方式。图7GlusterFS客户端4.分布式文件系统测试功能测试文件系统功能测试主要涉及POSIX语义的兼容性测试,包括文件读取和访问控制、元数据操作、锁操作等功能。文件系统的POSIX语义不同,实现的文件系统API也不同。功能测试必须能够覆盖文件系统实现的API和功能点。非功能测试数据一致性测试:这里的数据一致性是指文件系统中的数据与写入前的数据一致,即写入数据和读取数据始终一致。数据一致性是指文件系统能够保证数据的完整性,不会造成数据丢失或数据错误。这是文件系统最基本的功能。部署方案测试:分布式文件系统通常具备水平扩展能力,可以构建大规模、高性能的文件系统集群。对于不同的应用和解决方案,文件系统的部署方式会有所不同。部署方式测试需要测试系统在不同场景下的部署方式,包括自动安装配置、卷管理、集群管理、自动负载均衡、高可用等可用性测试:高可用是分布式文件系统必须具备的特性之一以确保业务连续性。分布式文件系统的可用性主要包括两部分:元数据服务和数据。元数据服务的高可用性通常采用故障转移机制或集群,数据可用性主要包括复制和纠删码等机制。文件系统的高可用性至关重要,需要进行严格的测试和验证。可扩展性测试:弹性可扩展性对于分布式文件系统尤为重要。文件系统扩展性测试主要包括测试系统的弹性扩展能力(扩展和收缩),以及扩展过程中带来的性能影响,验证是否具有线性扩展能力。稳定性测试:分布式文件系统一旦投入运行,通常会持续运行很长时间。稳定性的重要性不言而喻。稳定性测试主要验证系统在长时间(7/30/180/365x24)运行下是否仍能正常运行,功能是否正常。性能测试:性能是评估分布式文件系统的一个关键维度。根据文件系统在不同场景下的表现,可以判断文件系统是否适合特定的应用场景,为系统性能调优提供依据。此外,当系统过载时,系统可能会出现性能下降、功能异常、拒绝访问等问题。性能测试是验证系统是否处于高压状态,包括数据多客户端、高OPS压力、高IOPS/吞吐量压力,系统是否还能正常运行,功能是否正常,系统资源消耗等,所以为生产经营提供依据。测试用例性能测试FIO是一个开源的IO压力测试和验证工具,可以模拟和生成不同类型的I/O负载。IO负载通常可以分为两类:顺序读写和随机读写。分布式文件系统典型测试场景及作业生成如下(以4K为例):图8测试实验本测试环境采用10个节点组成存储池,构建8+2分散卷(如如图9),IO模型选择rand_rw_70read_4k,测试数据输出如图10(限于篇幅,省略部分输出信息)。如图9和图10所示,根据测试结论,randrw_70read_4k的负载模型工作在diffuse-volume上,性能不是很好。不同的IO负载类型和不同的volume类型会导致测试数据出现比较大的偏差。在实际工作中,需要结合实际应用需求,对各种场景进行组合测试,找到最合适的解决方案。小结本文介绍了分布式文件系统的一些基本概念,并以GlusterFS为例详细讲解了分布式文件系统的一些原理。最后介绍了分布式文件系统的测试思路。限于篇幅,一些技术细节没有详述。注意,对于分布式文件系统的使用,应充分考虑当前的基础设施和应用场景等因素,谨慎、合理地选择。