AppBoxFuture(五): 分布式文件存储-Store Everything
本来本篇是想介绍前端组件化开发用户界面,发现框架还未实现文件存储,原本计划是后续设计开发的,索性把计划提前,所以本篇将介绍基于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的更多相关文章
- 分布式文件存储:FastDFS简单使用与原理分析
引言 FastDFS 属于分布式存储范畴,分布式文件系统 FastDFS 非常适合中小型项目,在我接手维护公司图片服务的时候开始接触到它,本篇文章目的是总结一下 FastDFS 的知识点. 用了 2 ...
- .Net平台下,分布式文件存储的实现
遇到的问题 对于Web程序,使用一台服务器的时候,客户端上传的文件一般也都是存储在这台服务器上.但在集群环境中就行不通了,如果每个服务器都存储自己接受到的文件,就乱套了,数据库中明明有这个附件的记录, ...
- 【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用
[网络爬虫入门05]分布式文件存储数据库MongoDB的基本操作与爬虫应用 广东职业技术学院 欧浩源 1.引言 网络爬虫往往需要将大量的数据存储到数据库中,常用的有MySQL.MongoDB和Red ...
- 分布式文件存储数据库 MongoDB
MongoDB 简介 Mongo 并非芒果(Mango)的意思,而是源于 Humongous(巨大的:庞大的)一词. MongoDB 是一个基于分布式文件存储的 NoSQL 数据库.由 C++ 语言编 ...
- mogilefs分布式文件存储
MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发.Danga团队开发了包括 Memcached.MogileFS.Perlbal ...
- (转) 分布式文件存储FastDFS(一)初识FastDFS
http://blog.csdn.net/xingjiarong/article/details/50559849 一.FastDFS简介 FastDFS是一款开源的.分布式文件系统(Distribu ...
- 分布式文件存储FastDFS(一)初识FastDFS
一.FastDFS简单介绍 FastDFS是一款开源的.分布式文件系统(Distributed File System),由淘宝开发平台部资深架构师余庆开发.作为一个分布式文件系统,它对文件进行管理. ...
- 分布式文件存储FastDFS(七)FastDFS配置文件具体解释
配置FastDFS时.改动配置文件是非常重要的一个步骤,理解配置文件里每一项的意义更加重要,所以我參考了大神的帖子,整理了配置文件的解释.原帖例如以下:http://bbs.chinaunix.net ...
- (转) 分布式文件存储FastDFS(七)FastDFS配置文件详解
http://blog.csdn.net/xingjiarong/article/details/50752586 配置FastDFS时,修改配置文件是很重要的一个步骤,理解配置文件中每一项的意义更加 ...
随机推荐
- 如何运行vue项目
首先,列出来我们需要的东西: node.js环境(npm包管理器) vue-cli 脚手架构建工具 cnpm npm的淘宝镜像 安装node.js 从node.js官网下载并安装node,安 ...
- Python + Appium 获取当前屏幕的截图方法的封装
使用方法:get_screenshot_as_file(filename),来自于selenium\webdriver\remote\webdiver.py def take_screenShot(s ...
- Vue中引入bootstrap导致的CSS问题
最近在进行vue.js+webpack进行模块化开发的时候,遇到一个奇怪的问题. 问题是这样的: 1. 在main.js文件中引入bootstrap的js和css. 2. 自己写了一个Header.v ...
- koa+mysql+vue+socket.io全栈开发之数据访问篇
后端搭起大体的框架后,接着涉及到的就是如何将数据持久化的问题,也就是对数据库进行 CURD 操作. 关于数据库方案, mongodb 和 mysql 都使用过,但我选用的是 mysql,原因: 目前为 ...
- 接口测试心得--签名处理(Python)
一.背景 最近负责的项目接口签名规则做了调整,第一次接触“2次认证“的方式,正好有时间,记录一下. 测试的服务A有一部分接口需要给第三方调用,这样需要对第三方有个认证,认证是由一个公共服务(API鉴权 ...
- BootStrap:轮播插件
前述 利用 BootStrap 实现图片轮播,包括 基本轮播.带标题的轮播.设置轮播速度的轮播.控制前后的轮播 实例 基本轮播 代码 1.引入bootstrap和jQuery文件 <!-- jQ ...
- 微信小游戏爆款秘笈 数据库MongoDB攻略篇
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB 发表于云+社区专栏 随着微信小游戏的爆发,越来越多开发者关注到MongoDB与小游戏业务的契合度. ...
- 如何定义开发完成?(Definition of Done)
最近在拜读郑晔的10x程序员工作法,收益良多,文中提出一个概念叫DoD(Definition of Done)给我的感触颇深.这让我联想到实际工作过程中,经常遇到的扯皮.争吵等各种场景,其实就和这个D ...
- SLAM+语音机器人DIY系列:(六)SLAM建图与自主避障导航——2.google-cartographer机器人SLAM建图
摘要 通过前面的基础学习,本章进入最为激动的机器人自主导航的学习.在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命.本章将围绕机器人SLAM建图.导航避障 ...
- 粮草先行——Android折叠屏开发技术点(二)
继该系列的第一篇和番外篇之后,今天我们来聊一聊多窗口开发的注意事项.实际上,与其说"多窗口开发",不如说让我们的APP适应多窗口模式. 可能有朋友会问,为什么要提到多窗口模式呢? ...