淘宝分布式文件存储系统( 二 ) -TFS
淘宝分布式文件存储系统( 二 ) ->>TFS
目录 :
- 大文件存储结构
- 哈希链表的结构
- 文件映射原理及对应的API
- 文件映射头文件的定义
大文件存储结构 :
-
- 采用块(block)文件的形式对数据进行存储 , 分成索引块,主块 , 扩展块 。所有的小文件都是存放到主块中的 ,扩展块用来保存溢出的数据,也就是当我们的主快存储不下的时候,数据就会保存到扩展块中。
- 每一个块都有一个唯一的编号 , 块在使用之前所用到的存储空间都会被预先分配和初始化。
- 每个索引文件都存放对应块的信息和小文件的索引信息,所索引文件会在服务器启动时映射(mmap)到内存中,大大提高索引效率。
- 每一个文件都有对应的编号,文件编号从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 : 刷新的参数设置
- MS_ASYNC (异步),调用会立即返回,不等到更新的完成
- 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
相关文章:
淘宝分布式文件存储系统( 二 ) -TFS
淘宝分布式文件存储系统( 二 ) ->>TFS 目录 : 大文件存储结构哈希链表的结构文件映射原理及对应的API文件映射头文件的定义 大文件存储结构 : 采用块(block)文件的形式对数据进行存储 , 分成索引块,主块 , 扩展块 。所有的小文件都是存放到主块中的 ,扩展块…...
Java中synchronized:特性、使用、锁机制与策略简析
目录 synchronized的特性互斥性可见性可重入性 synchronized的使用方法synchronized的锁机制常见锁策略乐观锁与悲观锁重量级锁与轻量级锁公平锁与非公平锁可重入锁与不可重入锁自旋锁读写锁 synchronized的特性 互斥性 synchronized确保同一时间只有一个线程可以进入同步块或…...
记一次clickhouse手动更改分片数异常
背景:clickhouse中之前是1分片1副本,随着数据量增多,想将分片数增多,于是驻场人员手动添加了分片数的节点信息 <clickhouse><!-- 集群配置 --><clickhouse_remote_servers><feihuang_ck_cluster><sha…...
深度学习论文: ISTDU-Net:Infrared Small-Target Detection U-Net及其PyTorch实现
深度学习论文: ISTDU-Net:Infrared Small-Target Detection U-Net及其PyTorch实现 ISTDU-Net:Infrared Small-Target Detection U-Net PDF: https://doi.org/10.1109/LGRS.2022.3141584 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTo…...
图像识别-YOLO V8安装部署-window-CPU-Pycharm
前言 安装过程中发现,YOLO V8一直在更新,现在是2023-9-20的版本,已经和1月份刚发布的不一样了。 eg: 目录已经变了,旧版预测:在ultralytics/yolo/v8/下detect 新版:ultralytics/models/yolo/detect/predict.py 1.安…...
js禁用F1至F12、禁止缩放、取消选中并且取消右键操作、打印、拖拽、鼠标点击弹出自定义信息、禁用开发者工具js
禁用js //禁止缩放 //luwenjie hualun window.addEventListener(mousewheel, function (event) {if (event.ctrlKey true || event.metaKey) {event.preventDefault();} }, {passive: false});//firefox window.addEventListener(DOMMouseScroll, function (event) {if (even…...
Zabbix5.0_介绍_组成架构_以及和prometheus的对比_大数据环境下的监控_网络_软件_设备监控_Zabbix工作笔记
z 这里Zabbix可以实现采集 存储 展示 报警 但是 zabbix自带的,展示 和报警 没那么好看,我们可以用 grafana进行展示,然后我们用一个叫睿象云的来做告警展示, 会更丰富一点. 可以看到 看一下zabbix的介绍. 对zabbix的介绍,这个zabbix比较适合对服务器进行监控 这个是zabbix的…...
百度SEO优化TDK介绍(分析下降原因并总结百度优化SEO策略)
TDK是SEO优化中很重要的部分,包括标题(Title)、描述(Description)和关键词(Keyword),为百度提供网页内容信息。其中标题是最重要的,应尽量突出关键词,同时描述…...
搭建自动化 Web 页面性能检测系统 —— 设计篇
页面性能对于用户体验、用户留存有着重要影响,当页面加载时间过长时,往往会伴随着一部分用户的流失,也会带来一些用户差评。性能的优劣往往是同类产品中胜出的影响因素,也是一个网站口碑的重要评判标准。 一、名称解释 前端监控…...
记一次 mysql 数据库定时备份
环境:Centos 7.9 数据库:mysql 8.0.30 需求:生产环境 mysql 数据(约670MB)备份。其中存在大字段、longblob字段 参考博客:Linux环境下使用crontab实现mysql定时备份 - 知乎 一、数据库备份 1. 备份脚本。创…...
淘宝分布式文件存储系统(一) -TFS
淘宝分布式文件存储系统( 一 ) ->>TFS 目录 : 什么是文件系统文件存储的一些概念文件的结构系统读取文件的方式为什么采用大文件结构的原因 文件系统 : 将我们的数据整合成目录或者文件,提供对文件的存取接口,基于文件的权限进行访问,简单的说,文件系统就是对文件进行…...
LLM各层参数详细分析(以LLaMA为例)
网上大多分析LLM参数的文章都比较粗粒度,对于LLM的精确部署不太友好,在这里记录一下分析LLM参数的过程。 首先看QKV。先上transformer原文 也就是说,当h(heads) 1时,在默认情况下, W i Q W_i…...
linux ansible(三)
ansible 配置详解 3.1 ansible 安装方式 ansible安装常用两种方式,yum安装和pip程序安装 3.1.1 使用 pip(python的包管理模块)安装 需要安装一个python-pip包,安装完成以后,则直接使用pip命令来安装我们的ansible包 …...
Anaconda和Pycharm详细安装 配置教程
Anaconda:是一个开源的Python发行版本,其中包含了conda、Python等180多个科学包及其依赖项。【Anaconda下载】 PyCharm:PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。【PyCharm下载】…...
利用Linux虚拟化技术实现资源隔离和管理
在现代计算机系统中,资源隔离和管理是非常重要的,特别是在多租户环境下。通过利用Linux虚拟化技术,我们可以实现对计算资源(如CPU、内存和存储)的隔离和管理,以提供安全、高效、稳定的计算环境。下面将详细…...
12基于MATLAB的短时傅里叶变换( STFT),连续小波变换( CWT),程序已调通,可以直接运行。
基于MATLAB的短时傅里叶变换( STFT),连续小波变换( CWT),程序已调通,可以直接运行...
k8s使用时无法ping通服务器From IP地址 icmp_seq=1 Destination Host Unreachable
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
两种风格的纯CSS3加载动画
<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>加载动画</title><style>.loader {w…...
Spring Cloud Eureka:服务注册与发现
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Spring Cloud Eureka:服务注册与发现 Spring Cloud Eureka是Spring Cloud生态系统中的一个组件,它是用于实现服务注册与发现的服务治理组件。在…...
安防监控视频云存储平台EasyNVR对接EasyNVS时,一直不上线该如何解决?
视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。 近期有用户在使用安防视频平台EasyNVR对接上级平台EasyNVS时,出现了一直不上线…...
【完美解决】GitHub连接超时问题 Recv failure: Connection was reset
问题: 已经开了梯子但是在Idea中使用git(GitHub)还是连接超时Recv failure: Connection was reset。此时需要让git走代理。 解决方案: 1.对右下角网络点击右键 -> 打开网络和Internet设置 2.代理 -> 查看到地址和端口号…...
cpolar内网穿透
1、下载地址 https://www.cpolar.com/ windows系统可以在cpolar官网下载最新的安装包,然后解压默认安装即可。 2、地址配置 创建隧道映射内网端口,双击安装的软件,即可进入浏览器配置界面 http://localhost:9200/#/dashboard cpolar安装…...
go语言操作数据库
1.10 GO连接MySQL 因为Go语言没有提供任何官方数据库驱动,所以需要安装第三方函数库。由于在github上安装,所以需要安装git软件,安装过程一直点击下一步即可。安装完成后需要配置环境变量 1.10.1 安装git git软件 安装完毕后,配…...
zabbix实现钉钉报警
首先钉钉创建一个团队 自定义关键词 查看zabbix-server脚本存放的位置: [rootcontrolnode ~]# grep ^AlertScriptsPath /etc/zabbix/zabbix_server.conf AlertScriptsPath/usr/lib/zabbix/alertscripts zabbix server设置 在配置文件书写脚本目录vim /etc/za…...
基于微信小程序的语言课学习系统设计与实现(源码+lw+部署文档+讲解等)
前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…...
R 语言画图中英文字体解决方案
在某些时候,需要在 R 画图中添加中文,但是默认情况下,R 对中文的支持不好。这里推荐一个 showtext 的 R 包。如果需要将含有中文字体的图形保存为 pdf 文件,可以使用下面讲到的方案,最新版的showtext已经支持了 ggplot…...
Golang反射相关知识总结
1. Golang反射概述 Go语言的反射(reflection)是指在运行时动态地获取类型信息和操作对象的能力。在Go语言中,每个值都是一个接口类型,这个接口类型包含了这个值的类型信息和值的数据,因此,通过反射&#x…...
go语言初学(备忘)
1、安装 2 路径配置 C:\Program Files\Go\bin 3新建一个工程 4、下载VSCode 并安装插件 创建一个调试文件 在main目录下新建一个test.go脚本 package main import "fmt" func main() { fmt.Println("Hi 1111") fmt.Println("testasdf") } 断点…...
免费获取独立ChatGPT账户!!
GPT对于每个科研人员已经成为不可或缺的辅助工具,不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域:1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言,都可以为你提供相关的代码示例。2、数据可视化…...
4.docker容器编排(docker compose 与 docker swarm)
本文目录 1.容器编排2.Docker Compose1.Docker Compose 安装2.Docker Compose 示例1.使用 docker-compose 启动 nginx2.docker compose 常用命令3.校验 docker-compose.yml 是否有错误4.创建服务,启动容器5.弹性伸缩<扩缩容> 3.Docker Swarm1.Swarm 架构图2.S…...
网站怎么做边框/sem营销
编者按:Quora 上有网友提问:自学机器学习技术,你有哪些建议?(What are your recommendations for self-studying machine learning),Yann LeCun 在该提问下做了解答。本文由雷锋网(公众号&#…...
网站主机免费/网站建设需求模板
一:打破狭窄的技术视野 ①真实项目对外开发系统性讲解 ②例如电商、教育行业、社区网站等主流互联网场景的商业解决方案讲解 ③针对不同业务场景海量数据或者访问量以及及时响应等所面临的挑战进行对应的瓶颈分析。 ④拓展技术视野,与一线大厂零距离…...
做网站用什么cms/如何制作一个网址
点击左上方蓝字关注我们7月27日,百度与中国计算机学会(以下简称CCF)联合成立的“CCF-百度松果基金”(以下简称松果基金)在京举行签约仪式,双方将联手面向海内外高校及科研院所的青年学者,搭建产…...
网站开发准备/潍坊网站定制模板建站
IOC(Inversion of Control)即控制反转,它是一种思想。 在这过程中,对象创建后通过在对象实例上设置属性来定义他们间的依赖关系,然后IOC容器在创建bean的时候注入这些依赖。在传统应用程序中, 可以在对象中通过new创建依赖的对象&…...
温江建设局备案网站/如何进行搜索引擎优化 简答案
cdn引入(正常) 通过cdn方式引入是不会报错的。 src引入(报错) 然后我用npm下载了bootstrap和jquery,使用src方式引入居然报错了。 原因 当引入jQuery和bootstrap文件时会报错的原因是:electron 的 Renderer 端因为注入了 No…...
网站建设自学需要多久/苏州seo关键词排名
存储数据在Android开发中是一项非常重要的功能,下面介绍的这种技术是利用XML文件存储键值对。 SharedPreferences的使用主要有四步: 1)获得SharedPreferences对象 2)获得SharedPrefercences.Editor对象 3)使用putXXX方…...