BFS究竟实现到啥程度了?No.67

BFS,全称 BigBanana File System ,大蕉文件系统。是大蕉同学希望通过自己实现一个分布式文件系统练练手,看看是不是能写出一个真正能跑起来的系统。最最主要参考资料是《Google File System》。

这是github链接。

https://github.com/CallMeDJ/BFS-BigBananaFileSystem.git

有兴趣一起学习的小伙伴可以下下来看看,可以后台给我提意见喔,或者参与到 coding 里边,大家一起学习一起成长。

根据《Google File System》定义,数据流是这样的。

GFS 中每一个数据块叫一个 chunk,存储着 chunk 的服务器称为 chunkserver。管理这所有 chunkserver 的服务器叫 master ,来对数据进行全局的管理。启动时通过服务发现来找到可用的 chunkserver,chunkserver 启动时也可以主动向 master 进行注册。master向 client 提供数据咨询服务,client 拿到chunkserver 和 chunk 的资料后,自行对 chunkserver 进行数据操作。

一个 put 流程是这样。

client进行数据块切分,请求 master 进行数据存储,由master进行全局的 chunk id 生成,并根据复制份数分配 chunkserver。分配完把 chunkserver 和 chunk 的信息给到 client,由 client 直接跟 chunkserver 通信进行数据保存。

一个 get 流程是这样。

client,请求master进行数据读取,master 获取数据所有的chunk块,然后把数据块chunk的位置及 chunkserver 的 ip 和端口给到client,由 client 直接跟 chunkserver 通信进行数据获取。

一个 delete 流程是这样。

master 把数据标记为已删除,然后通过垃圾回收机制进行真正的数据删除。

大概主要的功能就上面这样,后面我再详细解读一下论文吧,接下来说说BigBanana File System 的实现。

先报告一下现在实现了什么样的功能什么样的程度吧。

  1. 所有数据都只基于内存存储,暂时未存储到文件中。
  2. 支持 ls 命令可以按文件夹列出文件列表
  3. 支持 put 命令可以把文件放入到文件系统中。
  4. 支持 get 命令可以按照全路径获取文件
  5. 支持 delete 命令删除文件,把文件标记为已删除,不是实际删除数据。
  6. 支持自动垃圾回收机制。
  7. 支持按大小分块,并复制副本到分布式环境中。
  8. 实现文件服务器负载均衡,master 能均衡地把数据放到多个数据服务器中。
  9. master 先启动,chunk server 启动的时候能实时注册到mster中。暂未实现master主动发现存活的 chunk server。

暂未实现的功能。

  1. 暂未实现 put 的时候实时读文件。
  2. 暂未实现 保存文件到操作系统文件系统中。
  3. 暂未实现 服务器状态监控。
  4. 暂未实现 append 追加文件内容。
  5. 暂未实现 文件错误checksum校验
  6. 暂未实现 文件丢失复制
  7. 暂未实现 文件操作锁机制

不说了,说出来都是泪。从没想过写分布式文件系统这么难,这么多细节,但是基本雏形还是完成了,代码量不多,先看看项目的结构吧。

怎么阅读这个难看的源码呢?我来介绍一下各个包的作用。

bfs.server

服务器的启动程序,其中有 MasterServer 用来提供整体管理服务,ChunkServer 负责存放数据,BFSClient 作为客户端对外提供命令行的操作。

bfs.service

定义了服务器的服务接口,IMasterService提供了六个服务,IChunkServerService提供了七个服务。

bfs.service.impl

服务端的实现。

domain

数据传输过程中的一些bean定义。

comomand

客户端client的命令定义及实现。

这次就先不讲源码了,讲讲怎么玩这个系统。

首先启动一个 master 服务器。在ide上右键 MasterServer.java run一下就可以了。

然后启动3个 chunkserver,因为我们默认份数是三份嘛~所以至少需要三台机器同时跑着。启动的时候要增加启动参数 127.0.0.1 8870。第一个参数是ip,第二个参数是端口。一般来说我会使用8870、8871、8872三个端口。

如果启动成功的话,master进程里边会是这样的。

然后启动一个client,右键 BFSClient run一下就可以了。然后就可以开始玩了。

好了就酱~下次见,觉得还行点个赞,觉得不好出去跑个马拉松。

原文发布于微信公众号 - 一名叫大蕉的程序员(DaBananaTalk)

原文发表时间:2017-11-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏24K纯开源

Windows下程序启动时出现0xc000007b错误的解决方案

一、背景介绍       不久前用Qt开发了一款小工具在公司使用,Debug运行时一切正常。可是当Release编译发布打包之后,运行时弹出这样的提示框: ? ...

3307
来自专栏月牙寂

k8s源码分析------kube-apiserver分析(2)

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

3975
来自专栏用户2442861的专栏

redis 学习指南

http://www.cnblogs.com/hoojo/p/4466024.html

1771
来自专栏木制robot技术杂谈

用Python模拟登陆微博

前言 最近在研究模拟登陆,看了很多教程,发现基本上都是只教怎么处理后就能登陆成功,没有讲解怎样得到处理的方法。经过的一天的研究,把微博模拟登陆基本上弄清楚了,下...

3969
来自专栏后端技术探索

nginx入门到入门

用户访问反向代理服务器。但是用户不知道访问的是反向代理服务器多个站点中的哪一个站点。对服务器服务。

822
来自专栏玄魂工作室

如何学python 第十九课 文件操作

今天我们来说说文件操作。文件操作在程序编写里有着举足轻重的作用。文件操作,主要包含文件的输入和输出。学会了文件操作,就可以写出更符合实际需求的脚本。 我会先介绍...

36311
来自专栏c#开发者

消息队列(Message Queue)简介及其使用

消息队列(Message Queue)简介及其使用 利用 MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方...

4658
来自专栏java一日一条

Java Web应用中调优线程池的重要性

不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求。线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的。本文主要介绍...

721
来自专栏丑胖侠

Zookeeper开源客户端Curator之基本功能讲解

简介 Curator是Netflix公司开源的一套Zookeeper客户端框架。了解过Zookeeper原生API都会清楚其复杂度。Curator帮助我们在其基...

3185
来自专栏JavaEdge

redis3.2启动配置文件redis.conf说明

3034

扫码关注云+社区