淘宝分布式文件存储系统( 二 ) -TFS

news2025/2/28 12:10:17

淘宝分布式文件存储系统( 二 ) ->>TFS

目录 :
  • 大文件存储结构
  • 哈希链表的结构
  • 文件映射原理及对应的API
  • 文件映射头文件的定义
大文件存储结构 :

在这里插入图片描述

    1. 采用块(block)文件的形式对数据进行存储 , 分成索引块,主块 , 扩展块 。所有的小文件都是存放到主块中的 ,扩展块用来保存溢出的数据,也就是当我们的主快存储不下的时候,数据就会保存到扩展块中。
    2. 每一个块都有一个唯一的编号 , 块在使用之前所用到的存储空间都会被预先分配和初始化。
    3. 每个索引文件都存放对应块的信息和小文件的索引信息,所索引文件会在服务器启动时映射(mmap)到内存中,大大提高索引效率。
    4. 每一个文件都有对应的编号,文件编号从1 开始 依次递增,同时作为哈希表的key来定位小文件在主块和扩展块的偏移量。
  • 关键的数据结构 ,1 每一个块的结构

struct BlockInfo    //每一个块的结构
  {
  	uint32_t block_id_ ;   //块编号1 , 2 ...
  	int32_t version_ ;     //块当前版本号
  	int32_t file_count_;   //当前已保存文件总数
  	int32_t size_;         //当前已保存文件数据的大小
  	int32_t del_file_count_;  //已删除文件的数量
  	int32_t del_size_ ;    // 已删除的文件数据总大小  
  	uint32_t  seq_no_;      //下一个可分配的文件编号1 , 2 ....
  }

补充: 在整个系统里面,删除文件并不是说当用户点击删除之后,就立刻执行删除,事实上我们的系统会对要删除的文件进行标记,表示已经删除,如果不这样,本来磁盘都会进行频繁的读写,再加上立刻删除文件,它会吃不消的,效率也会大大降低,实际上我们服务器的瓶颈就在磁盘。 当系统中删除的文件达到一定量时,会在夜深人静的时候进行数据删除。

  • 小文件的索引信息(数据文件,图片,文字,等等)
struct RawMeta
  {
       uint64_t  fileid_;  //文件编号
  	 struct{
  		 int32_t inner_offset_;  //文件在快内部的偏移量
  		 int32_t size_;          //文件大小
  	 } location_;
  }
  • 这一个结构体,将我们的所有“小文件”,链在一起。
struct MetaInfo
{
	struct RawMeta raw_meta_  ;    //文件数据
	int32_t next_meta_offset_;     //当前哈希链下一个节点在索引文件中的偏移
}

哈希链表

在这里插入图片描述


哈希链表结构的定义 :

#define HXSIZE  5                //哈希桶的大小

//定义一个链表结点结构
typedef struct _LinkNode {
	void * key;                 //键值
	void* data;                //保存的数据,   采用void *  可以提高代码的兼容性(兼容更多的数据类型),和可维护性
	struct NodeList* next;    //指向下一个结点的指针
}LinkNode;

/**************\
*方便区分,本质上都是一样的
***************/
typedef LinkNode* List;     
typedef LinkNode* elment;   //表示数据的结点 

typedef struct _HxTable {
	int size;               //桶的大小
	List* list;             //这里实质上是一个二级指针,(我们可以想象成二维数组)         
}HxTable;
文件映射 :

磁盘的速度,和内存的速度比较,相当于是 : 一个走路,一个坐火箭。

内存映射
提示: 红色框起的部分,我们可以先不看, 内存映射简单来说就是把磁盘上的文件,映射到内存中.

  • 应用场景:

  •             1.    实现进程之间共享信息 
                2.   实现数据从磁盘到内存的映射,提高应用程序访问文件的速度. 
    
  • 对应的API接口 , 参数很多,但是不用担心,很多都用不上,都是默认的

#include<sys/mmanp>    //包含的头文件
//两者配套使用   
void *mmap(void *addr , size_t length , int prot , int flags , int fd , size_t offset );  //建立映射
int munmap(void *addr  ,size_t length);        //解除映射 

参数addr : 指向欲映射内存的起始地址 , 一般情况设置为 NULL ,让系统自动选定

参数lenght : 代表文件中多大的部分映射到内存(注意: 大小一般是4kb的整数倍)

参数prot : 映射区域的保护方法
{
​ PROT_EXEC 执行
​ PROT_READ 读取
​ PROT_WRITE 写入
​ PROT_NONE 不能存取
}

参数flags : 影响映射区域的各种特征,必须指定为 MAP_SHARED / MAP_PRIVATE(修改不同步文件)

参数fd : 要映射到内存中文件的描述符

参数offset : 文件映射映射的偏移量,通常设置为0,代表从文件的开始位置开始对应

进程之间的通信 mmap 之 msync

实现磁盘文件与共享内存区的内容一致(同步操作,共享区域文件的内容发生改变,磁盘上的文件内容也会发生改变)
函数原型 : int msync (void *addr , size_t len , int flags ) ; 成功返回0 ,失败返回-1

参数 addr : 调用mmap(… )返回的地

参数flags : 刷新的参数设置

  1. MS_ASYNC (异步),调用会立即返回,不等到更新的完成
  2. MS_SYNC (同步)
映射 mmap_file.h 头文件的实现
#ifndef _MMAP_FILE_H_
      #define _MMAP_FILE_H_

      #include<unistd.h>        //包含很多常规的接口(作为标准库的存在)
//这里我们定义一个命名空间 , 里面的数据我们可以   qiniu::...   这样访问
      namespace qiniu {        
      	struct MMapOption {    //设置初始映射大小,后序可以增加
      		int32_t max_mmap_size_;     //最大的映射大小
      		int32_t frist_mmap_size_;   //第一次分配的大小
      		int32_t pri_mmap_size_;     //每次追加的大小
      	};
      	namespace largefile {
      		class MMapFile {
      		public:
      		MMapFile();    //无参构造
      		explicit MMapFile(const int fd);    //fd文件句柄
      		MMapFile(const MMapOption& mmp_option, const int fd);

      		~MMapFile();        //析构函数
      	
      		bool sync_file();    //同步文件
      		bool map_file(const bool write = false);   //将文件映射到内存,同时设置保护方法
      		void* get_data()const;       //获取映射到内存的数据的首地址
      		int32_t get_size()const;     //返回映射区域的大小
      		
      		bool munmap_file();          //解除映射
      		bool remap_file();           //重新映射
      	
      		private:
      			bool ensure_flie_size(const int32_t size);    //调整大小,仅供内部调用
      		
      		private:
      			int32_t size_;    //映射的大小
      			int fd_;          //映射文件的句柄
      			void* data_;       //映设到内存数据的起始地址
      	
      			struct MMapOption mmap_file_option_;
      
      		};
      	}
      }
      #endif

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

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

相关文章

湖南湘潭家具3D轮廓扫描测量家居三维数字化外观逆向设计-CASAIM中科广电

随着科技的不断进步&#xff0c;CASAIM三维扫描技术在各个行业中得到了广泛应用&#xff0c;家具行业也不例外。传统的家具设计和展示方式已经无法满足现代消费者的个性化、多元化需求&#xff0c;而三维扫描技术的出现为家具行业带来了新的机遇和可能性。 家具表面有雕刻图案…

Selenium和Requests搭配使用

Selenium和Requests搭配使用 前要1. CDP2. 通过requests控制浏览器2. 1 代码一2. 2 代码2 3. 通过selenium获取cookie, requests携带cookie请求 前要 之前有提过, 用selenium控制本地浏览器, 提高拟人化,但是效率比较低,今天说一种selenium和requests搭配使用的方法 注意: 一定…

企业该如何选择数字化转型工具?_光点科技

随着科技的不断进步和数字化的浪潮席卷全球&#xff0c;企业数字化转型已经成为了保持竞争力和持续增长的关键因素之一。无论企业规模大小&#xff0c;数字化转型都可以提高效率、降低成本、改善客户体验&#xff0c;从而实现更好的业务结果。然而&#xff0c;要成功进行数字化…

Unity云原生分布式运行时

// 元宇宙时代的来临对实时3D引擎提出了诸多要求&#xff0c;Unity作为游戏行业应用最广泛的3D实时内容创作引擎&#xff0c;为应对这些新挑战&#xff0c;提出了Unity云原生分布式运行时的解决方案。LiveVideoStack 2023上海站邀请到Unity中国的解决方案工程师舒润萱&#x…

iPhone辐射超标,发布三年突然禁售了

昨晚 iPhone 15 预售大家抢到了吗&#xff1f; 虽然13日发布会后大家的反应十分冷静&#xff0c;但身体还是很诚实&#xff0c;官网都排到6-7周以后了... 在大伙都争着第一波尝鲜的时候&#xff0c;有一个地方正准备禁售 iPhone 。 不用想肯定是欧盟某个国家啦&#xff0c;这…

python正则表达(06)

python正则表达(06) 文章目录 python正则表达(06)1 正则表达式概念2 正则的三个基础方法2.1 match、search、findall三个基础方法2.2 re.match() 函数2.2.1 re.match(匹配规则&#xff0c;被匹配字符串)2.2.2验证是否开头匹配&#xff0c;match是匹配开头&#xff0c;后面的是不…

Ingress Controller

什么是 Ingress Controller &#xff1f; 在云原生生态中&#xff0c;通常来讲&#xff0c;入口控制器( Ingress Controller )是 Kubernetes 中的一个关键组件&#xff0c;用于管理入口资源对象。 Ingress 资源对象用于定义来自外网的 HTTP 和 HTTPS 规则&#xff0c;以控制进…

Ae 效果:CC Ball Action

模拟/CC Ball Action Simulation/CC Ball Action CC Ball Action &#xff08;CC 球体动作&#xff09;基于源图像转换为网格&#xff0c;并基于网格生成一个个继承源图像像素颜色的具有 3D 深度的小球体。 效果名称左侧出现的立方体图标&#xff0c;表示本效果支持 3D 摄像机。…

2023_Spark_实验七:Scala函数式编程部分演示

1、Scala中的函数 在Scala中&#xff0c;函数是“头等公民”&#xff0c;就和数字一样。可以在变量中存放函数&#xff0c;即&#xff1a;将函数作为变量的值&#xff08;值函数&#xff09;。 def myFun1(name:String):String"Hello " nameprintln(myFun1("…

EasyExcel导出转换@ExcelProperty注解中converter不生效,以及EasyExcel导入日期转换失败问题

用EasyExcel做导出&#xff0c;需要用ExcelProperty做格式转换&#xff0c;比如日期转换&#xff0c;枚举类转换 然后新建一个转换类 里面有两个实现方法&#xff0c;converToJavaData是导入时&#xff0c;数据转换定义格式&#xff0c;converToExcelData是导出时做数据转换的。…

Python爬虫基础(三):使用Selenium动态加载网页

文章目录 系列文章索引一、Selenium简介1、什么是selenium&#xff1f;2、为什么使用selenium3、安装selenium&#xff08;1&#xff09;谷歌浏览器驱动下载安装&#xff08;2&#xff09;安装selenium 二、Selenium使用1、简单使用2、元素定位3、获取元素信息4、交互 三、Phan…

3D WEB引擎HOOPS Commuicator助力Naval Architect Jumpstart快速启动船舶信息建模平台开发

行业&#xff1a;造船业 挑战&#xff1a;新公司希望将创新的船舶信息建模产品推向市场-基于浏览器的产品需要支持高级可视化和强大的数据转换&#xff0c;以处理大型、复杂的造船项目-小型开发团队的任务是雄心勃勃的平台发布计划。 解决方案&#xff1a; Tech Soft 3D提供领…

ubuntu x86_64 源码编译 rust 1.48.0

源码地址 GitHub - rust-lang/rust: Empowering everyone to build reliable and efficient software. git clone https://github.com/rust-lang/rust cd rust git checkout 1.48.0 ./configure ./x.py build 安装前执行cargo vendor yeqiangyeqiang-MS-7B23:~/Downloads/sr…

PyTorch框架中torch、torchvision、torchaudio与python之间的版本对应关系(9月最新版)

随着python语言和pytorch框架的更新&#xff0c;torch\torchvision\torchaudio与python之间的版本对应关系也在不断地更新。 最新版本torch与torchvision对应关系如下&#xff1a; 稍旧版本torch与torchvision对应关系如下&#xff1a; 最新版本torch与torchaudio对应关系如下…

js字符串转时间戳

完整代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><script>// 字符串转时间戳const charToTime (dateStr) > {let date dateStr.substring(0, 19);date dat…

ES6之Map和Set有什么不同?

一、Map 1.定义 Map是ES6提供的一种新的数据结构&#xff0c;它是键值对的集合&#xff0c;类似于对象&#xff0c;但是键的范围不限于字符串&#xff0c;各种类型的值都可以当做键。 Object结构是“字符串-值”的对应&#xff0c;Map结构则是“值-值”的对应 2.代码示例 M…

【Linux】Linux环境配置安装

目录 一、双系统&#xff08;特别不推荐&#xff09; 安装双系统的缺点&#xff1a; 安装双系统优点&#xff08;仅限老手&#xff09;&#xff1a; 二、虚拟机centos7镜像&#xff08;较为推荐推荐&#xff09; 虚拟机的优点&#xff1a; 虚拟机的缺点&#xff1a; ​ …

3dsmax模型烘焙光照贴图并导入unity流程详解

目录 前言 软件环境 前置知识储备 一、模型场景搭建 二、模型材质处理 三、vray渲染准备 四、烘焙至贴图 五、unity场景准备 六、贴图与材质 前言 该流程针对某些固定场景&#xff08;模型发布、无法使用实时渲染引擎等&#xff09;情况下的展示&#xff0c;本文记录烘…

高云FPGA系列教程(9):cmd-parser串口命令解析器移植

文章目录 [toc]cmd-parser库简介cmd-parser库源码获取GW1NSR-4C移植cmd-parser实际测试cmd-parse命令解析器优化 本文是高云FPGA系列教程的第9篇文章。 上一篇文章介绍片上ARM Cortex-M3硬核处理器串口外设的使用&#xff0c;演示轮询方式和中断方式接收串口数据&#xff0c;并…

数据导入hudi报错,错将字段写到hdfs路径上

报错信息 Error trying to save partition metadata (this is okay, as long as atleast 1 of these succced), file:/qiche/hudi_table/冬天续航要打个八折的样子&#xff0c;能接受。高速相对市区还要耗电一些。不过这个车最主要是也就是在市区里面跑&#xff0c;而且最多会…