【送书活动】揭秘分布式文件系统大规模元数据管理机制——以Alluxio文件系统为例

news2025/1/21 7:21:31

前言

在这里插入图片描述
「作者主页」:雪碧有白泡泡
「个人网站」:雪碧的个人网站
「推荐专栏」

java一站式服务
React从入门到精通
前端炫酷代码分享
★ 从0到英雄,vue成神之路★
uniapp-从构建到提升
从0到英雄,vue成神之路
解决算法,一个专栏就够了
架构咱们从0说
★ 数据流通的精妙之道★
★后端进阶之路★

请添加图片描述

文章目录

  • 前言
  • 送书福利
  • 01 分布式文件系统元数据的常见类型
    • 文件(inode)元数据
    • 数据块(block)元数据
    • MountTable
    • Worker元数据
  • 02 分布式文件系统元数据的存储模式
    • 2.1 元数据存储在堆上(HEAP模式)
    • 2.2 元数据存储在堆外(ROCKS模式)
    • 2.3 堆外存储的内存和磁盘占用
    • 2.4 对堆外存储的缓存加速和调优

送书福利

  • 🎁本次送书1~5本【取决于阅读量,阅读量越多,送的越多】👈
  • ⌛️活动时间:截止到2023-9月 13 号
  • ✳️参与方式:关注博主+三连(点赞、收藏、评论)
  • 评论可最多评论三条
    私信我进送书互三群有更多福利哦
    请添加图片描述

当今,我们的世界已经进入一个数据时代。随着互联网、物联网、5G、大数据、人工智能、自动驾驶、元宇宙等信息技术的快速发展,人们在产生、收集、存储、治理和分析的数据的总量呈快速增长的趋势。形态多样、格式复杂、规模庞大、产生迅速的行业领域大规模数据驱动了底层新型基础支撑计算支撑技术的快速变革。通过过去10多年来工业界和学术界先行者的指引和实践,分布式并行计算和分布式数据存储的技术生态不断演进、丰富繁荣。其中,分布式数据存储管理在这个海量数据处理技术栈中处于基础地位,是众多行业大数据应用分析的基石。

分布式文件系统是从高性能计算到大数据计算时代一直广为应用的主流分布式数据存储管理系统。近些年随着云计算技术的持续发展,分布式对象存储存储、键值存储等技术的应用也开始大行其道。在这个背景下,很多分布式文件系统开始走上对数据存储进行统一高效管理的技术路线。其中,被用户知晓和普遍应该的一款系统是诞生于加州大学伯克利分校的AMPLab的Alluxio,它可以被看作一种统一化大数据虚拟文件系统,不同种类的分布式存储系统(文件系统、对象存储系统)都可以挂载到Alluxio目录中,对提供提供高效统一的访问模式和接口。元数据是一个存储系统中关于数据信息最为重要、正常访问最为频繁的一类关键信息。为了有效地管理来自底层不同分布式存储系统的大规模数据文件和对象,Alluxio需要提供一种高效可扩展的大规模元数据管理机制。

本文以开源版本的Alluxio 2.8为例,揭秘分布式文件系统中常见的大规模元数据管理机制。对Alluxio用户而言,用户通过文件元信息和Alluxio文件系统接口进行互动,通过数据块元信息来读写数据和缓存。文件和数据块元信息由Alluxio Master统一存储和管理。

01 分布式文件系统元数据的常见类型

Alluxio Master管理的元数据中,最重要的是文件元数据、数据块元数据、挂载点元数据和Alluxio Worker元数据几类。

文件(inode)元数据

Alluxio文件系统中的每一个文件或文件夹都由一个inode代表,这个inode存储着这个文件所有的属性和元信息,包括文件基本属性、权限信息、管理属性、时间戳、包含的数据块及每一个数据块的元数据等。“inode”这一概念来源于Unix类型的文件系统,在Linux和HDFS等文件系统中被广泛使用,一个inode代表着文件系统目录树上的一个节点。因为Alluxio管理着多个底层存储,所以Alluxio命名空间中的潜在文件数量实际上是所有底层存储中文件的总和。元数据服务作为Alluxio集群中最重要的服务,直接决定了系统的规模、性能和稳定性。值得一提的是,Alluxio文件系统中的inode不一定在底层存储中存在。例如,如果这个路径是用MUST_CACHE方式写入Alluxio,那么Alluxio并不会在底层存储中创建这个文件。此外,如果底层存储是一个对象存储,因为对象存储没有文件夹的概念,所以Alluxio中的文件夹并不会在底层存储中对应实际存在的对象。

总体来说,Alluxio Master对inode的管理可以抽象地分为以下几类:

  • 使用一个InodeTree存储所有的inode信息及inode之间的树状结构(文件夹和文件之间的父子关系),Alluxio Master维护着文件系统的树状结构。

  • 实现文件系统操作的接口并支持所有对文件的操作。Alluxio Master开放了一系列文件系统操作接口,并且对每一个操作提供了并发安全和持久化保证,通过这样的方式向上层应用提供了一个分布式文件系统。

  • 通过Journal日志维护一个持久化的状态,保证每一个inode操作的持久性和原子性。Alluxio Master通过保证inode信息和每一个操作记录在Journal日志中,从而保障在任何情况下inode信息和更改都不会丢失。

  • Alluxio的InodeTree通过将锁粒度精细到每一个inode,支持inode级别的读写并发访问。对每一个inode通过锁进行并发控制,保证在并发读写中inode的线程安全。

数据块(block)元数据

如果inode对应一个文件,则它有0个(空文件)或多个数据块。对一个新建文件而言,所有数据块大小都由 alluxio.user.block.size.bytes.default 设置,只有最后一个数据块除外。只有1个数据块的文件也算作是最后一个数据块。数据块的元信息管理相对inode而言比较简单,因为数据块之间不具有树状的结构或者亲子关系。

Alluxio Master保存着数据块的元信息以及数据块缓存的当前位置,并对外提供了对这些信息的读写接口。Alluxio Master管理的数据块元数据可以简要地被看作两个键值存储:

(1)<BlockID, BlockMetadata>

(2)<BlockID, List>

其中,BlockMetadata记录了数据块的长度。BlockLocation记录了这个数据块(缓存)存在的Alluxio Worker节点地址,和这个数据块在Alluxio Worker节点上的具体存储位置。

这两个不同的信息被分开存储主要是因为它们的生命周期不同。Block Metadata是不变的(Immutable)。Alluxio不支持对已经写完的数据块进行随机更改或追加。如果这个文件被重写,它会得到新的FileID(即InodeID)和新的BlockID,旧的数据块会被舍弃。相反,BlockLocation列表是会不断变化的,比如当这个数据块被加载进一个新的Alluxio Worker,或者被从某一个Alluxio Worker上驱逐之后,这个列表信息都会对应地改变。

MountTable

MountTable管理着所有Alluxio文件系统中的挂载点,提供了诸如挂载点的创建和更改操作。同时Alluxio文件路径和底层存储的文件路径也通过MountTable互相解析对应。

Worker元数据

Alluxio Master对Alluxio Worker元数据的管理包括了追踪当前有哪些正在工作的Alluxio Worker,并且不断更新Alluxio Worker上的缓存列表。Alluxio Master记录的信息主要包括:

(1)Alluxio Worker的地址、启动时间等不变信息。

(2)Alluxio Worker的空间使用情况,包括多层缓存中每层的使用量,随每次心跳更新。

(3)Alluxio Worker中被缓存的所有BlockID和将要从Alluxio
Worker中移除的所有BlockID。这些信息随着每一次心跳和数据块操作(加载、驱逐等)而改变。

02 分布式文件系统元数据的存储模式

分布式文件系统的元数据存储通常包括堆上存储和堆外存储两种。其中,堆上存储访问高效,但是空间有限,而堆外存储空间大,但如果设计不当会造成性能损失。

2.1 元数据存储在堆上(HEAP模式)

以Alluxio为例,在HEAP模式下,所有元信息都以Java对象的形式存储在JVM的堆中。每一个文件在堆上的内存占用大约为2KB4KB。因此,当Alluxio文件系统中有大量的文件时,堆上元信息将会给JVM带来大量内存压力。不难算出,系统中有1亿文件时,JVM上仅仅是存储这些文件的元信息就会占用200GB400GB。加上Master JVM必须承担的大量RPC操作内存开销,这个JVM对内存的需求是普通服务器很难承受的。

此外,对大部分JVM版本而言,如此数据规模下的GC会变得非常难以管理。Alluxio Master JVM中的这些元信息都是长久存在的对象,尤其会给老年代的GC效率带来很大的影响。尽管有一些商业版JVM可以避免部分或大部分JVM带来的性能和管理问题,但是对大多数用户来说,JVM占用过多还是一个十分棘手的痛点,尤其是Alluxio Master 的JVM可能在未来随着业务扩展可能超出物理机内存的上限。

2.2 元数据存储在堆外(ROCKS模式)

针对HEAP模式难以扩展的问题,Alluxio优化了设计方向。Alluxio 在2.0版本中引入了ROCKS模式,将元信息存储挪到了JVM之外。在ROCKS模式下,Alluxio Master内嵌了一个RocksDB,将文件(和数据块)的元信息从之前的JVM堆上挪到了RocksDB中,而RocksDB的存储介质实际是硬盘而非内存。使用RocksDB存储元数据只需要配置元数据存储模式并指定RocksDB存储的路径:


alluxio.master.metastore=ROCKS

alluxio.master.metastore.dir=${alluxio.work.dir}/metastore

Alluxio内嵌的RocksDB会使用 alluxio.master.metastore.dir 配置的路径作为自己的元数据存储。以下示例中,我们查看一个运行中的Alluxio集群的RocksDB存储,可以见到Alluxio在RocksDB中保存的Inode和Block元数据各有一个存储目录,并维护了由RocksDB管理的数据文件。RocksDB的存储目录结构在本书中不做赘述,读者可以查看RocksDB的官方文档。

$ ls -al -R metastore/

metastore/:

total 8

drwxrwxr-x. 2 alluxio-user alluxio-group 4096 May 21 03:20 blocks

drwxrwxr-x. 2 alluxio-user alluxio-group 4096 May 21 03:33 inodes

 

metastore/blocks:

total 4264

-rw-r--r--. 1 alluxio-user alluxio-group     0 May 21 03:20 000005.log

-rw-r--r--. 1 alluxio-user alluxio-group    16 May 21 03:20 CURRENT

-rw-r--r--. 1 alluxio-user alluxio-group    36 May 21 03:20 IDENTITY

-rw-r--r--. 1 alluxio-user alluxio-group     0 May 21 03:20 LOCK

-rw-r--r--. 1 alluxio-user alluxio-group 52837 May 21 03:30 LOG

-rw-r--r--. 1 alluxio-user alluxio-group   176 May 21 03:20 MANIFEST-000004

-rw-r--r--. 1 alluxio-user alluxio-group 13467 May 21 03:20 OPTIONS-000009

-rw-r--r--. 1 alluxio-user alluxio-group 13467 May 21 03:20 OPTIONS-000011

 

metastore/inodes:

total 4268

-rw-r--r--. 1 alluxio-user alluxio-group     0 May 21 03:20 000005.log

-rw-r--r--. 1 alluxio-user alluxio-group  1211 May 21 03:33 000012.sst

-rw-r--r--. 1 alluxio-user alluxio-group    16 May 21 03:20 CURRENT

-rw-r--r--. 1 alluxio-user alluxio-group    36 May 21 03:20 IDENTITY

-rw-r--r--. 1 alluxio-user alluxio-group     0 May 21 03:20 LOCK

-rw-r--r--. 1 alluxio-user alluxio-group 58083 May 21 03:33 LOG

-rw-r--r--. 1 alluxio-user alluxio-group   247 May 21 03:33 MANIFEST-000004

-rw-r--r--. 1 alluxio-user alluxio-group 13679 May 21 03:20 OPTIONS-000009

-rw-r--r--. 1 alluxio-user alluxio-group 13679 May 21 03:20 OPTIONS-000011

2.3 堆外存储的内存和磁盘占用

在ROCKS模式下,元信息被存储在堆外的RocksDB中,这样会极大地降低元信息存储对Alluxio Master进程的内存压力。与HEAP模式相比,所有的元信息读写从内存速度降低到了硬盘速度,这将会很大程度上影响Alluxio Master的性能和吞吐量。因此Alluxio Master在内存中加入了一个缓存来加速对RocksDB的访问。换言之,在ROCKS模式下,元信息存储的内存占用变成了这部分缓存的内存占用。与HEAP模式下的内存占用估算类似,缓存中每一个文件的元信息存储占用同样的2KB~4KB。

缓存的大小由 alluxio.master.metastore.inode.cache.max.size 控制。这个配置项的值根据Alluxio版本可能有所不同。Alluxio Master会先写入缓存,当缓存达到一定使用量之后才开始写入RocksDB(磁盘)。RocksDB的磁盘占用情况如下:大约100万个文件的元信息占用约4GB的硬盘空间。值得注意的是,当Alluxio命名空间内文件数量未触发基于 alluxio.master.metastore.inode.cache.max.size 的驱逐时,所有文件元信息都在基于内存的缓存内,未写入RocksDB,此时这些文件的元信息磁盘占用接近于0。

2.4 对堆外存储的缓存加速和调优

当内存空间充足时,适当调大 alluxio.master.metastore.inode.cache.max.size 可以将更多文件元信息缓存在内存中来提升性能。同时需注意,Alluxio Master上的RPC操作也会消耗内存。即使没有进行中的RPC操作,Alluxio Master上仍然会有一些定期的文件扫描等内部管理逻辑会消耗内存。在估算Alluxio Master进程中内存时,需要一定要预留足够内存给这些操作,不要让元信息存储占用了所有的内存。这和在服务器上不能把100%的内存都分配给应用而不给操作系统预留内存空间的道理是一样的。元信息缓存的管理是基于水位机制的,用户配置一个高水位参数和一个低水位参数,比如以下是默认配置:

alluxio.master.metastore.inode.cache.high.water.mark.ratio=0.85

alluxio.master.metastore.inode.cache.low.water.mark.ratio=0.8

在缓存使用达到 0.85 * alluxio.master.metastore.inode.cache.max.size时,缓存数据会开始驱逐,将缓存中的数据内容写入RocksDB存储。在缓存占用率降低到0.8时停止驱逐。

2.5在HEAP和ROCKS模式间切换
使用HEAP模式和ROCKS模式下Journal日志的格式不同,因此从一种模式切换到另一种不能通过简单的更改配置并重启Alluxio Master进程来完成。元数据存储模式的切换可以通过从备份中启动集群完成,见4.5章节。

本文以Alluxio为例,简要介绍了分布式文件系统的元数据基本类型及其管理和优化方法,更多的数据访问优化细节可以进一步参考查阅Alluxio开源社区代码,也欢迎阅读最近机械工业出版社出版的技术书籍《分布式统一大数据虚拟文件系统——Alluxio原理、技术与实践》:请添加图片描述
本书以广泛使用的Alluxio 2.8.0开源版本为基础编写,深入介绍Alluxio相关分布式统一大数据文件系统的技术原理与实践案例,主要内容包括系统入门与使用、内核组件设计实现原理,同时详细介绍了大型企业应用案例与实践,并附有Alluxio的开源社区开发者指南。本书为Alluxio开源社区用户、高校大数据系统课程师生以及潜在企业用户提供了较为完整的技术指南和实用教程,既可作为大数据专业方向的专业教材,也可作为大数据从业者和研究者的重要专业资料。

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/996849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Modelsim仿真问题解疑二:ERROR: [USF-ModelSim-70]

现象&#xff1a;在Vivado中已配置modelsim为仿真工具后&#xff0c;运行仿真&#xff0c;报错USF-ModelSim-70和ERROR: [Vivado 12-4473] 详细报错内容如下 ERROR: [USF-ModelSim-70] compile step failed with error(s) while executing C:/Users/ZYP_PC/Desktop/verilog_t…

多线程与高并发——并发编程(7)

文章目录 七、JUC并发工具1 CountDownLatch应用&源码分析1.1 CountDownLatch介绍1.2 CountDownLatch应用1.3 CountDownLatch源码分析1.3.1 有参构造1.3.2 await 方法1.3.3 countDown方法2 CyclicBarrier应用&源码分析2.1 CyclicBarrier介绍2.2 CyclicBarrier应用2.3 Cy…

python DVWA文件上传POC练习

首先&#xff0c;构造POC我们首先要明白漏洞利用的流程&#xff0c;然后要知道请求包的格式&#xff0c;然后才能针对性的POC 这里先选择低难度的文件上传&#xff0c;低难度的是没有任何过滤可以直接上传的&#xff0c;先上传一个php一句话木马&#xff0c;使用burpsuite抓包 …

go channel实践与源码探索(初始化、发送消息、接收消息、关闭)

文章目录 概要一、并发编程1.1、Actor模型1.2、CSP模型 二、Go Channel实践三、源码分析3.1、初始化3.2、发送消息3.3、接收消息3.4、关闭通道 总结 概要 通道&#xff08;Channel&#xff09;是Go语言提供的协程之间通信与同步的方式。我们知道在并发编程&#xff08;多进程、…

mysql检查表、分析表、优化表

MySQL提供了分析表、检查表和优化表的语句。分析表主要是分析关键字的分布&#xff0c;检查表主要是检查表是否存在错误&#xff0c;优化表主要是消除删除或者更新造成的空间浪费。 文章目录 概述分析表检查表优化表 概述 对数据库的管理常规就是进行预防性的维护&#xff0c;…

SSM - Springboot - MyBatis-Plus 全栈体系(五)

第二章 SpringFramework 四、SpringIoC 实践和应用 2. 基于 XML 配置方式组件管理 2.5 实验五&#xff1a;高级特性&#xff1a;FactoryBean 特性和使用 2.5.1 FactoryBean 简介 FactoryBean 接口是Spring IoC容器实例化逻辑的可插拔性点。 用于配置复杂的Bean对象&#x…

前端list.push,封装多个对象

js var fruit [apple, banana];fruit.push(pear);console.log(fruit); // [apple, banana, pear]现在为对象 data1:{addUser: 1,editUser: 1,addTime: null,editTime: 1527410579000,userId: 3,systemNo: mc,userName: zengzhuo,userPassword: e10adc3949ba59abbe56e057f20f88…

Qt点亮I.MX6U开发板的一个LED

本篇开始将会介绍与开发版相关的Qt项目&#xff0c;首先从点亮一个LED开始。I.MX6U和STM32MP157的相关信息都会用到&#xff0c;但是后期还是将I.MX6U的学习作为重点。当然其他开发版的开发也可以参考本博文。 文章目录 1. Qt是如何操控开发板上的一个LED2. 出厂内核设备树中注…

linux修改最大线程数却未生效的原因

可能是没有重新对新文件进行编译 更改一个进程所能创建的最大进程数之前 更改一个进程所能创建的最大进程数之后 测试代码 #include <iostream> #include <unistd.h> #include <sys/wait.h> #include <string.h> #include <stdio.h> #include…

学生信息系统(python实现)

#codingutf-8 import os.path filenamestudent.txtdef menm():#菜单界面print(学生管理系统)print(-----------------------------功能菜单-----------------------------)print(\t\t\t\t\t\t1.录入学生信息)print(\t\t\t\t\t\t2.查找学生信息)print(\t\t\t\t\t\t3.删除学生信息…

合宙Air724UG LuatOS-Air LVGL API控件-图片(Gif)

图片&#xff08;Gif&#xff09; GIF图片显示&#xff0c;core版本号要>3211 示例代码 方法一 -- 创建GIF图片控件 glvgl.gif_create(lvgl.scr_act()) -- 设置显示的GIF图像 lvgl.gif_set_src(g,"/lua/test.gif") -- gif图片居中 lvgl.obj_align(g, nil, lvgl…

软件测试行业35岁职场魔咒,你准备怎么应对?

以前就流传一种说法“IT行业职场35岁危机”&#xff0c;那时我半信半疑。 或许那时觉得还离我比较遥远&#xff0c;也或许那时每天都重复着996&#xff0c;工作上的任务已经应接不暇&#xff0c;每天都处在忙碌中&#xff0c;也没精力花时间去过多思考这个问题。休息的时候能好…

机器学习实战-系列教程7:SVM分类实战2线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读

&#x1f308;&#x1f308;&#x1f308;机器学习 实战系列 总目录 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 SVM分类实战1之简单SVM分类 SVM分类实战2线性SVM SVM分类实战3非线性SVM 3、不同软间隔C值 3.1 数据标准化的影响 如图左边是没…

GLSL ES着色器 精度限定字

目录 前言 WebGL支持的三种精度 数据类型的默认精度 float类型没有默认精度 预处理指令 在GLSL ES中常用的三种预处理指令。 预定义的内置宏 前言 GLSL ES新引入了精度限定字&#xff0c;目的是帮助着色器程序提高运行效率&#xff0c;削减内存开支。顾名思义&#xf…

Kafka3.0.0版本——消费者(自动提交 offset)

目录 一、自动提交offset的相关参数二、消费者&#xff08;自动提交 offset&#xff09;代码示例 一、自动提交offset的相关参数 官网文档 参数解释 参数描述enable.auto.commi默认值为 true&#xff0c;消费者会自动周期性地向服务器提交偏移量。auto.commit.interval.ms如果…

《TCP/IP网络编程》阅读笔记--I/O复用

1--基于I/O复用的服务器 多进程服务器端具有以下缺点&#xff1a;当有多个客户端发起连接请求时&#xff0c;就会创建多个进程来分别处理客户端的请求&#xff0c;创建多个进程往往需要付出巨大的代价&#xff1b; I/O复用的服务器端可以减少进程数&#xff0c;无论连接多少个客…

Ubuntu22.04_如何调试ROS2_humble的源代码

这里的源码&#xff0c;是指的ros2 humble的官方源码。如果是自己手撸的节点或相关源码&#xff0c;请参考本人以前的贴子&#xff0c; Ubuntu20.04vscode快速调试ROS通用程序_ubuntu20.04vscode那个版本和ros 兼容_高精度计算机视觉的博客-CSDN博客 Ubuntu20.04&#xff0b;…

【pygame】01 pygame制作游戏的最小系统

这次使用sublimepython进行pygame的游戏开发&#xff0c;目的是学习使用python的基本操作和常用模块 添加一个文件夹到工程 最小系统 import pygame import sys ##导入sys模块 主要是为了 exit函数 from pygame.locals import * #导入一些常用的函数和常量pygame.init() …

计算机网络第四章——网络层(上)

提示&#xff1a;朝碧海而暮苍梧,睹青天而攀白日 文章目录 网络层是路由器的最高层次&#xff0c;通过网络层就可以将各个设备连接到一起&#xff0c;从而实现这两个主机的数据通信和资源共享&#xff0c;之前学的数据链路层和物理层也是将两端连接起来&#xff0c;但是却没有网…