分布式文件系统及FastDFS
1、前言
今天来谈谈分布式文件系统,侧重点是文件系统,分布式稍微带一下。然后聊下我用的FastDFS的例子。
2、从小需求开始
我的博客的编辑器用的是markdown,它内嵌了一个文件上传功能,不过后端文件管理要自己的写。
最开始直接用SpringMVC接收上传文件,直接扔服务器新建的upload文件夹下。但问题很快就出现了,上传同名文件会冲突,顺手加个时间戳好像可以解决问题,但我总感觉重复文件最后只存一次才是最好的,但靠文件名是没法判断重复的,加上大小,类型也不够,查了不少资料,考虑到自己写没足够的精力,最后决定用现成的FastDFS,学习别人是怎么做的。
由上,我们有这么几个问题:
- 文件存哪?
- 怎么存?
- 如何去重?
…
带着这几个问题来看看文件系统的设计。
3、文件系统
3.1 什么是文件系统。
如果是windows,按win+E打开资源管理器,资源指是什么,是文件,文件管理器,也就是文件系统。在Linux,Mac,Android,iOS之上,所有应用都是由文件系统所管理。操作系统中负责管理和存储文件信息的软件机构称为文件系统。
3.2 文件系统的分类
文件系统从架构上可以分为两类:
1.本地文件系统
linux的ext3,ext4 windows的FAT32 NTFS ..
如下是window下格式化硬盘时可以选择的文件系统。注意下其中有个参数分配单元大小,稍后讨论。
2.分布式文件系统
分布式文件又可以分为两种,
一是通用分布式文件系统
将windows或linux多台机器进分布式架构便是一个通用分布式文件系统了,因为通用,使用起来很方便,但性能就差点。应用端可以mount(挂载)使用。典型代表:lustre、MooseFS.
另外一个便是专用分布式文件系统了,基本都是基于GFS的思想,,文件上传后不能修改。不能mount使用,需要使用专有API对文件进行访问,也可称作分布式文件存储服务。典型代表:GFS、FastDFS、HDFS、TFS。
3.2 文件的存储
文件系统最基本的功能便是存储了,存储方式分为两种:
1.独立文件形式存储
即以N级目录+文件的方式存储文件,win,linux,mac..都是这种方式,这种方式查询很快,根据路径自然就可以找到文件。
但是,在前面的图片中谈到了一个参数分配单元大小,值是4K。我们看几个文件的属性:
其中的大小是文件的大小,但占用空间却比实际大小大,而且正好是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架构图
Tracker:负载均衡服务器。
Storage:存储服务器。
这里简单的介绍下它的一些流程。
4.1 上传下载流程
- 上传
- client询问tracker上传到的storage;
- tracker返回一台可用的storage;
- client直接和storage通信完成文件上传,storage返回文件ID。
- 下载
- client询问tracker可以下载指定文件的storage,参数为文件ID(组名和文件名);
- tracker返回一台可用的storage;
- client直接和storage通信完成文件下载。
上传文件时,文件ID由storage server生成并返回给client
文件ID包含了组名和文件名,storage server可以直接根据该文件名定位到文件
一个文件ID示例:
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的更多相关文章
- 分布式文件系统服务器FastDFS
1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制, 充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标, ...
- 分布式文件系统之FastDFS
环境引入: 在一个大型的教育官网,会拥有大量优质的视频教程,并且免费提供给用户去下载,文件太多如果高效存储?用户访问量大如何保证下载速度?分布式文件系统是解决这些问题的有效方法之一 一.什么是文件系统 ...
- 从入门到精通(分布式文件系统架构)-FastDFS,FastDFS-Nginx整合,合并存储,存储缩略图,图片压缩,Java客户端
导读 互联网环境中的文件如何存储? 不能存本地应用服务器 NFS(采用mount挂载) HDFS(适合大文件) FastDFS(强力推荐
- 分布式文件系统之FastDFS安装部署
前面我们了解了分布式文件系统mogilefs的框架以及安装部署和简单使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/tag/MogileFS/:今天我们来了解下 ...
- 分布式文件系统之 FastDFS
FastDFS 百度百科 FastDFS 是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合 ...
- FastDFS 分布式文件系统
1 学习目标 了解项目中使用FastDFS的原因和意义. 掌握FastDFS的架构组成部分,能说出tracker和storage的作用. 了解FastDFS+nginx上传和下载的执行流程 ...
- FastDFS分布式⽂文件系统
FastDFS分布式⽂文件系统 1. 什么是FastDFS FastDFS 是⽤用 c 语⾔言编写的⼀一款开源的分布式⽂文件系统.FastDFS 为互联⽹网量量身定制, 充分考虑了了冗余备份.负载均 ...
- 第三方-FastDFS分布式文件系统
1.什么是FastDFS? FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制, 充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标, ...
- FastDFS图片服务器(分布式文件系统)学习。
参考:https://blog.csdn.net/hiqingtian/article/details/79413471 https://blog.csdn.net/sinat_40399893/ar ...
随机推荐
- SQL——按照季度,固定时间段,分组统计数据
最近在工作中接到了一个需求,要求统计当月以10天为一个周期,每个周期的数据汇总信息.假设有一张表如下: 表table_test中 ID AMOUNT CREATE_ ...
- Cocoapods安装过程
1.升级Ruby环境 gem -v gem update --system 如果没有权限去升级Ruby ?就输入 sudo gem update --system 2.换掉Ruby镜像 首先移除现有的 ...
- Android 开发笔记___SD卡基本操作
package com.example.alimjan.hello_world; /** * Created by alimjan on 7/5/2017. */ import android.ann ...
- 算法:JavaScript两数之和
题目 Given an array of integers, return indices of the two numbers such that they add up to a specific ...
- day2--课前考试题
Linux 系统命令操作语法的格式: 命令 [参数选项] [文件或路径] rm -f ...
- c#关键字及ref和out
最近在写程序时遇到ref,out 参数问题.回头有自习看了看MSDN,才有巩固了基础.我把我的测试程序贴出来,大家分享一下. ref 关键字使参数按引用传递.其效果是,当控制权传递回调用方法时, ...
- Xshell 的安装教程
Xshell就是一个远程控制RHEL的软件:其他的还有很多,用什么都无所谓(根据公司情况). 下面我们来安装下这个工具: 双击exe 点下一步: 选 免费的 然后下一步:(免费的功能足够用了) 点接受 ...
- python学习笔记 函数
形式: def function(a,b,c=0,*args,**kw)#a,b必选参数,*args可变参数,**kw关键字参数 1.函数的返回值可以是多个参数.多个参数时,实际上返回的是一个tupl ...
- 关于Could not resolve dependencies for project
异常:Could not resolve dependencies for project 思路:网上提出的方案思路都是把相互依赖的项目导入到本地仓库中. 目前一劳永逸的方法是:将<packag ...
- Spring Boot 的Maven多模块开发web项目使用外部容器进行部署
Spring Boot中自带有Tomcat容器,因此Spring Boot项目只需要运行main函数,就可以运行,但是以往的web项目,我们习惯于使用自己安装的Tomcat运行或者使用Tomcat.J ...