本来本篇是想介绍前端组件化开发用户界面,发现框架还未实现文件存储,原本计划是后续设计开发的,索性把计划提前,所以本篇将介绍基于Raft实现分布式的文件存储引擎。

一. 实现思路

  既然是分布式存储,就需要解决以下几个关键问题:

  • 如何将文件以多副本的形式存储在集群的节点上,且保证副本间的一致性?这个问题可基于Raft协议实现相应的状态机来解决;
  • 如何将大量的文件分组,即如何划分多个Raft组?这个问题可通过在目录元数据内保存多个Raft组信息,每个组存储限制在64M(暂定)来解决;
  • 如何存储与管理目录及文件的元数据?这个问题可通过实现元数据状态机来管理,利用已实现的KV存储引擎来存储元数据;
  • 如何保证元数据与文件数据的一致性?这个问题开始时想用已实现的EntityStore的事务引擎来解决,虽能保证强一致性但逻辑复杂,性能损失大。因此放弃了强一致性改为保证最终一致性,元数据状态机及文件状态机内都有定时器来检查不一致的状态。

1. 元数据存储-BlobMetaStateMachine

  开始时想设计为一个集群对应一个BlobMetaRaftGroup,后来考虑到单个RaftGroup可能会压力较大,所以改为每个Application对应一个BlobMetaRaftGroup。每个元数据状态机主要存储以下各项信息:

  • 目录元数据:包括目录名称及标识,该目录下分配了多少个Chunk,每个Chunk占用了多少空间,隶属于哪个RaftGroup等;
  • 文件元数据:包括文件名称及标识,该文件隶属的目录标识及隶属的ChunkRaftGroup标识等;
  • Chunk元数据: 包括Chunk的RaftGroup内的各个RaftNode分配在集群的哪个节点上;
  • 写锁数据:用于并发写时加锁。

  确认了需要存储哪些信息后,就需要确认如何将这些数据映射至底层的KV存储,既要保证高效又要方便Api检索这些元数据,经过一些尝试后最终定为以下方案。

目录元数据 Key

TypeFlag AppId 目录名称UTF8编码
8bit 8bit n bit
  • TypeFlag = 0
  • 注意:最后一个'/' 0x2F被替换为0x00,以方便扫描某一目录下所有子目录

目录元数据 Value

目录Id Chunk RaftGroup数量 Chunk RaftGroupIds
128bit 16bit n * 64bit

文件元数据 Key

TypeFlag AppId 目录Guid 分隔占位 名称UTF8编码
8bit 8bit 128bit 8bit n bit
  • TypeFlag = 1
  • 分隔占位始终 = 0

文件元数据 Value

文件Id 文件大小 Chunk RaftGroupId
128bit 32bit 64bit

2. 文件存储-BlobChunkStateMachine

  根据上述设计,每个目录下的文件分成了多个存储组(BlobChunkRaftGroup),本来想用MemoryMapFile来实现底层Chunk存储,但考虑到有更重要的功能要实现所以暂偷懒直接利用Linux文件系统来存储文件,状态机Apply文件写命令时,将文件直接写入节点运行时blob/ChunkRaftGroupId/目录下。

3. 读写流程

  • 读流程较简单: 发送读元数据命令至BlobMetaRaftGroup获取文件元数据(缓存),然后再分小块发读命令至目标ChunkRaftGroup获取文件小块数据;
  • 写流程要考虑元数据与文件数据的一致性,还要考虑在目录下无可用ChunkRaftGroup时创建新的组,具体参考以下设计草图:

二. 实现效果

  根据以上设计在经历了1个月的编码后已初步实现(其中约一半时间在更改架构,抛弃了Mono依赖,改为Hosting CoreCLR,性能提升1倍),在框架IDE内每个Application内有个"BlobStore"节点,如下图所示可测试上传文件,然后通过浏览器访问上传至/pub目录内的文件(http://{地址:端口}/blob/{app名称}/{文件路径} eg: http://xx.xx.xx.xx:5000/blob/sys/imgs/aa.jpg

  作者简单测试了一下通过框架WebHost下载文件的性能(测试时尚未实现缓存元数据, 虚拟机I74C8G),如下图所示:

三. 本篇小结

  本实现适用于存储大量小文件,如业务单证的附件,或者用于OA系统作为文档库。目前只是实现了基本的上传下载功能,删除、重命名、Chunk合并等功能尚未实现,另待将来框架实现反向索引后再实现全文搜索功能。

  框架已更新,如何安装测试请参考AppBoxFuture(一): Hello Future!。如果您有问题或Bug报告,请留言或在Github提交Issue。

AppBoxFuture(五): 分布式文件存储-Store Everything的更多相关文章

  1. 分布式文件存储:FastDFS简单使用与原理分析

    引言 FastDFS 属于分布式存储范畴,分布式文件系统 FastDFS 非常适合中小型项目,在我接手维护公司图片服务的时候开始接触到它,本篇文章目的是总结一下 FastDFS 的知识点. 用了 2 ...

  2. .Net平台下,分布式文件存储的实现

    遇到的问题 对于Web程序,使用一台服务器的时候,客户端上传的文件一般也都是存储在这台服务器上.但在集群环境中就行不通了,如果每个服务器都存储自己接受到的文件,就乱套了,数据库中明明有这个附件的记录, ...

  3. 【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

    [网络爬虫入门05]分布式文件存储数据库MongoDB的基本操作与爬虫应用 广东职业技术学院  欧浩源 1.引言 网络爬虫往往需要将大量的数据存储到数据库中,常用的有MySQL.MongoDB和Red ...

  4. 分布式文件存储数据库 MongoDB

    MongoDB 简介 Mongo 并非芒果(Mango)的意思,而是源于 Humongous(巨大的:庞大的)一词. MongoDB 是一个基于分布式文件存储的 NoSQL 数据库.由 C++ 语言编 ...

  5. mogilefs分布式文件存储

    MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发.Danga团队开发了包括 Memcached.MogileFS.Perlbal ...

  6. (转) 分布式文件存储FastDFS(一)初识FastDFS

    http://blog.csdn.net/xingjiarong/article/details/50559849 一.FastDFS简介 FastDFS是一款开源的.分布式文件系统(Distribu ...

  7. 分布式文件存储FastDFS(一)初识FastDFS

    一.FastDFS简单介绍 FastDFS是一款开源的.分布式文件系统(Distributed File System),由淘宝开发平台部资深架构师余庆开发.作为一个分布式文件系统,它对文件进行管理. ...

  8. 分布式文件存储FastDFS(七)FastDFS配置文件具体解释

    配置FastDFS时.改动配置文件是非常重要的一个步骤,理解配置文件里每一项的意义更加重要,所以我參考了大神的帖子,整理了配置文件的解释.原帖例如以下:http://bbs.chinaunix.net ...

  9. (转) 分布式文件存储FastDFS(七)FastDFS配置文件详解

    http://blog.csdn.net/xingjiarong/article/details/50752586 配置FastDFS时,修改配置文件是很重要的一个步骤,理解配置文件中每一项的意义更加 ...

随机推荐

  1. 显著性检测(saliency detection)评价指标之sAUC(shuffled AUC)的Matlab代码实现

    AUC_shuffled.m function [score,tp,fp] = AUC_shuffled(saliencyMap, fixationMap, otherMap, Nsplits, st ...

  2. Mybatis配置详解

    一.SqlSession的使用范围说明  1.SQLSessionFactoryBuilder   通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory, ...

  3. 使用BeetleX的TcpBenchmark工具进行百万设备模拟测试

    其实TCP测试的工具有很多,那BeetleX工具所提供的特点又是什么呢?如果你需数十万的请求或模拟上百万的设备连接,那这个工具相信可以满足你的需要!工具是基于BeetleX的基础功能扩展,支持多IP绑 ...

  4. 初探机器学习之使用百度EasyDL定制化模型

    一.Why 定制化模型 一般来说,各大云服务厂商只会提供一些最常见通用的AI服务,针对具体场景的AI应用则需要在云服务厂商提供的服务之上进行定制.例如,通常的图像识别只能做到分析照片的主题内容,而我的 ...

  5. 前端笔记之NodeJS(二)路由&REPL&模块系统&npm

    一.路由机制(静态资源文件处理) 1.1 Nodejs没有根目录 MIME类型:http://www.w3school.com.cn/media/media_mimeref.asp 在Apache中, ...

  6. 「拥抱开源, 又见 .NET」系列第三次线下活动简报

    「拥抱开源, 又见 .NET」 随着 .NET Core的发布和开源,.NET又重新回到人们的视野. 自2016年 .NET Core 1.0 发布以来,其强大的生命力让越来越多技术爱好者对她的未来满 ...

  7. Java之Spring mvc详解

    文章大纲 一.Spring mvc介绍二.Spring mvc代码实战三.项目源码下载四.参考文章   一.Spring mvc介绍 1. 什么是springmvc   springmvc是sprin ...

  8. 通过 bsondump 命令工具 解析备份产生的bson文件

    bsondump命令是将BSON格式的文件转换为可读性更强的文件格式,例如转为为JSON 格式的文档,bsondump默认转换为json格式的文档. 当通过mongodump命令进行备份时,如果有参数 ...

  9. spring Boot环境下dubbo+zookeeper的一个基础讲解与示例

    一,学习背景 1.   前言 对于我们不管工作还是生活中,需要或者想去学习一些东西的时候,大致都考虑几点: a)      我们为什么需要学习这个东西? b)     这个东西是什么? c)      ...

  10. iOS 好文源码收藏

    bireme 大佬的 iOS 保持界面流畅的技巧 https://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/ 深入理解Run ...