分布式文件系统及FastDFS

时间:2023-01-29 22:32:03

1、前言

今天来谈谈分布式文件系统,侧重点是文件系统,分布式稍微带一下。然后聊下我用的FastDFS的例子。

2、从小需求开始

我的博客的编辑器用的是markdown,它内嵌了一个文件上传功能,不过后端文件管理要自己的写。
最开始直接用SpringMVC接收上传文件,直接扔服务器新建的upload文件夹下。但问题很快就出现了,上传同名文件会冲突,顺手加个时间戳好像可以解决问题,但我总感觉重复文件最后只存一次才是最好的,但靠文件名是没法判断重复的,加上大小,类型也不够,查了不少资料,考虑到自己写没足够的精力,最后决定用现成的FastDFS,学习别人是怎么做的。
由上,我们有这么几个问题:

  1. 文件存哪?
  2. 怎么存?
  3. 如何去重?

带着这几个问题来看看文件系统的设计。

3、文件系统

3.1 什么是文件系统。

如果是windows,按win+E打开资源管理器,资源指是什么,是文件,文件管理器,也就是文件系统。在Linux,Mac,Android,iOS之上,所有应用都是由文件系统所管理。操作系统中负责管理和存储文件信息的软件机构称为文件系统。

3.2 文件系统的分类

文件系统从架构上可以分为两类:
1.本地文件系统
linux的ext3,ext4 windows的FAT32 NTFS ..
如下分布式文件系统及FastDFS是window下格式化硬盘时可以选择的文件系统。注意下其中有个参数分配单元大小,稍后讨论。
分布式文件系统及FastDFS

2.分布式文件系统
分布式文件又可以分为两种,

一是通用分布式文件系统
将windows或linux多台机器进分布式架构便是一个通用分布式文件系统了,因为通用,使用起来很方便,但性能就差点。应用端可以mount(挂载)使用。典型代表:lustre、MooseFS.

另外一个便是专用分布式文件系统了,基本都是基于GFS的思想,,文件上传后不能修改。不能mount使用,需要使用专有API对文件进行访问,也可称作分布式文件存储服务。典型代表:GFS、FastDFS、HDFS、TFS。

3.2 文件的存储

文件系统最基本的功能便是存储了,存储方式分为两种:

1.独立文件形式存储
即以N级目录+文件的方式存储文件,win,linux,mac..都是这种方式,这种方式查询很快,根据路径自然就可以找到文件。

但是,在前面的图片中谈到了一个参数分配单元大小,值是4K。我们看几个文件的属性:
分布式文件系统及FastDFS
分布式文件系统及FastDFS
分布式文件系统及FastDFS

其中的大小是文件的大小,但占用空间却比实际大小大,而且正好是4k的倍数,没错文件系统中文件大小的单位是固定的,又称为文件簇,这个指文件分配的最小空间,这个值设小可以节省空间但访问速度会变慢,反之则浪费空间,但可以加快访问速度。有人会建议如果硬盘空间足够可在格式化硬盘时选择分配单元大小为64k,从而提高系统性能。

如果都是大文件,浪费的空间可以不计,但如果都是2k的小文件呢,100w这种小文件实际大小不到2g,但占用空间近4g,一般空间被浪费掉了。所以有了另一种存储方式。

2.块存储
如果将100w小文件写入压缩包,里面虽然是100w文件,但在系统中其实是一个压缩文件,这样它所占用的空间是实际大小了,如果是压缩存储还会更小。这种方式我们称之为块存储。

这两者各有优劣,块存储节省空间,但想访问其中一个就比较麻烦,文件存储访问很快,但海量小文件情况下空间浪费就大了。

3.二者的应用场景
分布式文件系统FastDFS使用的是文件存储,应用于分布式访问,建议用于>4k的文件访问便是这个道理;

但另外一个HDFS使用的是块存储,它所应用的场景是分布式计算,其实需要的是一次性加载数以百万的文件到MapReduce服务器中运算,如果一个个下载肯定不如直接一个压缩包过来。

3.2 文件的去重

一般我们使用的操作系统中,只会限制重复文件名,并不会确定两个文件的数据是否一样。
但当文件开始多起来,比如百度网盘,现在一个蓝光电影能有十几g,如果网友每人传一份,百来个人就能占1t,虽然硬盘不值钱,但亿万级的文件堆起来也开销不少,如果能去重,那只用维持一份数据就好了。

文件去重,也是需要找到一个唯一标识来定位文件。hash是一个比较好的选择。
Hash 即散列,当数据足够散,一个点只有一份数据,不出现hash冲突,这不就是唯一了。
hash值可以用自己定义计算,但更通常的做法是用MD5,SHA1这样成熟的hash算法。
MD5之类不仅仅是用来加密,也早就大量用于文件防伪,当然hash的碰撞仍然存在,经过精心设计,完全可以伪造出MD5相同,但数据不同文件,从而带来安全问题,毕竟这个文件如果是手机银行呢。

3.4 秒传的秘密

百度网盘秒传原理

四、分布式文件系统-FastDFS

文件存储问题解决了,下面就是分布式的东西的。
关于分布式的架构思路请参考下我的另外一篇文章,这里就不累述了。

以下是FastDFS架构图
分布式文件系统及FastDFS

Tracker:负载均衡服务器。
Storage:存储服务器。
这里简单的介绍下它的一些流程。

4.1 上传下载流程

  • 上传
  1. client询问tracker上传到的storage;
  2. tracker返回一台可用的storage;
  3. client直接和storage通信完成文件上传,storage返回文件ID。
  • 下载
  1. client询问tracker可以下载指定文件的storage,参数为文件ID(组名和文件名);
  2. tracker返回一台可用的storage;
  3. client直接和storage通信完成文件下载。

上传文件时,文件ID由storage server生成并返回给client
文件ID包含了组名和文件名,storage server可以直接根据该文件名定位到文件
一个文件ID示例:
分布式文件系统及FastDFS

4.2 同步机制

采用binlog文件记录文件上传、删除等操作,根据binlog进行文件同步;

storage生成的文件名中,包含源头storage IP地址和文件创建时间戳;
源头storage定时向tracker报告同步情况,包括向目标服务器同步到的文件时间戳;
tracker收到storage的同步报告后,找出该组内每台storage被同步到的时间戳(取最小值),
作为storage属性保存到内存中;

client询问tracker有哪些storage可以下载指定文件时,tracker返回满足如下四个条件之一的storage:
1 (当前时间 -文件创建时间戳) > 同步延迟阀值(如一天);
2 文件创建时间戳 < Storage被同步到的时间戳;
3 文件创建时间戳==Storage被同步到的时间戳 且(当前时间 -文件创建时间戳) > 文件同步最大时间(如5分钟);
4 该文件上传到的源头storage。

由于文件不要求强一致性,所以同步方案要求不高,完全没必要使用paxos之类的一致性算法,这是与分布式缓存,数据库等差别较大的地方

4.3 FastDFS去重机制

去重机制也就是hash了,一个是自己实现的hash,另外一个是MD5。
Hash: 4*32位hash code
MD5:

需安装FastDHT(分布式哈希系统 ):使用 Berkeley DB 做数据存储,使用 libevent 做网络IO处理,提供 Java 版的客户端接口包。适合用来存储用户在线、会话等小数据量信息。
通过hash->文件路径来标识文件,后面上传的文件,如果已经存在相同内容的文件,则采用符号连接的方式,指向原始文件。

缺陷:我们看到的是FastDFS采用服务端去重的机制,相比网盘的秒传机制效率低。所以我的网站目前没有使用这一机制,更考虑做个网盘类似的插件,本地去重,这个排后吧。以后可以玩玩。

五 扩展参考

作者:初龙

原文链接:https://chulung.com/article/distributed-file-system-and-fastdfs

本文由MetaCLBlog于2017-07-17 09:06:11自动同步至cnblogs

本文基于 知识共享-署名-非商业性使用-禁止演绎 4.0 国际许可协议发布,转载必须保留署名及链接。

分布式文件系统及FastDFS的更多相关文章

  1. 分布式文件系统服务器FastDFS

    1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制, 充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标, ...

  2. 分布式文件系统之FastDFS

    环境引入: 在一个大型的教育官网,会拥有大量优质的视频教程,并且免费提供给用户去下载,文件太多如果高效存储?用户访问量大如何保证下载速度?分布式文件系统是解决这些问题的有效方法之一 一.什么是文件系统 ...

  3. 分布式文件系统之FastDFS安装部署

    前面我们了解了分布式文件系统mogilefs的框架以及安装部署和简单使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/tag/MogileFS/:今天我们来了解下 ...

  4. 分布式文件系统之 FastDFS

    FastDFS 百度百科 FastDFS 是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合 ...

  5. 从入门到精通&lpar;分布式文件系统架构&rpar;-FastDFS,FastDFS-Nginx整合,合并存储,存储缩略图,图片压缩,Java客户端

    导读 互联网环境中的文件如何存储? 不能存本地应用服务器 NFS(采用mount挂载) HDFS(适合大文件) FastDFS(强力推荐

  6. FastDFS 分布式文件系统

    1       学习目标 了解项目中使用FastDFS的原因和意义. 掌握FastDFS的架构组成部分,能说出tracker和storage的作用. 了解FastDFS+nginx上传和下载的执行流程 ...

  7. FastDFS分布式⽂文件系统

    FastDFS分布式⽂文件系统  1. 什么是FastDFS FastDFS 是⽤用 c 语⾔言编写的⼀一款开源的分布式⽂文件系统.FastDFS 为互联⽹网量量身定制, 充分考虑了了冗余备份.负载均 ...

  8. 第三方-FastDFS分布式文件系统

    1.什么是FastDFS? FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制, 充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标, ...

  9. FastDFS图片服务器&lpar;分布式文件系统&rpar;学习。

    参考:https://blog.csdn.net/hiqingtian/article/details/79413471 https://blog.csdn.net/sinat_40399893/ar ...

随机推荐

  1. Spark的持久化简记

    摘要: 1.spark 提供的持久化方法 2.Spark的持久化级别 3.如何选择一种最合适的持久化策略 内容: 1.spark 提供的持久化方法 如果要对一个RDD进行持久化,只要对这个RDD调用c ...

  2. 怎么在win7的64位旗舰版上配置coocs2d-x 3&period;2的android环境并且打包APK

    我这用的操作系统是64位win7旗舰版打包成功. 希望有急用的能看到这篇文章,毕竟大家都是从菜鸟到大神的. 也以此证明自己的成长历程. 需要的东西有: 1.JAVA-JDK 2.Python 2.7. ...

  3. 基本二叉搜索树的第K小元素

    #include<stdio.h> #include<stdlib.h> typedef struct node *btlink; struct node { int data ...

  4. mysql&lowbar;【MySQL】常见的mysql 进程state

    Analyzing 线程是对MyISAM 表的统计信息做分析(例如, ANALYZE TABLE ). checking permissions 线程是检查服务器是否具有所需的权限来执行该语句. Ch ...

  5. python 把类当作 装饰器

    # class Test(object): # def __call__(self): # print('-----test----') # t= Test()# t() 调用主要有个__call__ ...

  6. Java并发编程(九)-- 进程饥饿和公平锁

    上一章已经提到“如果一个进程被多次回滚,迟迟不能占用必需的系统资源,可能会导致进程饥饿”,本文我们详细的介绍一下“饥饿”和“公平”. Java中导致饥饿的原因 在Java中,下面三个常见的原因会导致线 ...

  7. PR4

    4.1视频切换特效: 视频切换:视频和视频之间的过渡 4.2特效参数设置方法 4.3视频切换特效的技巧 多张图片,拖入特效慢. 选中多张图片 右键选中“设置所选..” 设置图片时间: 点常规后 设置完 ...

  8. window7下 cmd命令行 Mysql导出表结构 &plus; 表数据

    命令格式 mysqldump -uroot -p 密码 库名 > 自定义路径/库名.sql

  9. python&&num;39&semi;s metaclass

    [python's metaclass] 和objc中类似,metaclass用于创建一个类对象,但与objc不同的是,objc中每个类对象有各自不同的metaclass,而python中的metac ...

  10. 着陆攻击LAND Attack

    着陆攻击LAND Attack   着陆攻击LAND Attack也是一种拒绝服务攻击DOS.LAND是Local Area Network Denial的缩写,意思是局域网拒绝服务攻击,翻译为着陆攻 ...