FASTDFS调研报告(V1.0)
之前的文章,现在放出来,以供参阅。
一、fastdfs简介
- FastDFS是一个轻量级的开源分布式文件系统
- FastDFS主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡
- FastDFS实现了软件方式的RAID,可以使用廉价的IDE硬盘进行存储
- 支持存储服务器在线扩容
- 支持相同内容的文件只保存一份,节约磁盘空间
- FastDFS只能通过Client API访问,不支持POSIX访问方式
- FastDFS特别适合大中型网站使用,用来存储资源文件(如:图片、文档、音频、视频等等)
使用场景:
特别适合以中小文件(建议范围: 4KB 到 500MB )为载体的在线服务,如相册网站、视频网站等等。
二、系统架构
FastDFS服务端有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)。

- tracker server: 跟踪服务器,主要做调度工作,起负载均衡的作用。 在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。相比GFS中的master更为精简,不记录文件索引信息,占用的内存量很少。
- storage server: 存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。 Storage server直接利用OS的文件系统调用管理文件。
- client server: 客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。
- group:组,也可称为卷。同组内服务器上的文件是完全相同的
- 文件标识:包括两部分:组名和文件名(包含路径)
- meta data:文件相关属性,键值对(Key Value Pair)方式,如:width=1024,heigth=768
文件上传机制

- client询问tracker上传到的storage,不需要附加参数;
- tracker返回一台可用的storage;
- client直接和storage通讯完成文件上传。
下载机制:

- client询问tracker下载文件的storage,参数为文件标识(组名和文件名);
- tracker返回一台可用的storage;
- client直接和storage通讯完成文件下载。
同步机制:
- 同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行;
- 文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器;
- 源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了;
- 上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。
远行目录结构:
tracker server 结构:
${base_path}
|__data
| |__storage_groups.dat:存储分组信息
| |__storage_servers.dat:存储服务器列表
|__logs
|__trackerd.log:tracker server日志文件
storage server结构:
${base_path}
|__data
| |__.data_init_flag:当前storage server初始化信息
| |__storage_stat.dat:当前storage server统计信息
| |__sync:存放数据同步相关文件
| | |__binlog.index:当前的binlog文件索引号
| | |__binlog.###:存放更新操作记录(日志)
| | |__${ip_addr}_${port}.mark:存放同步的完成情况
| |
| |__一级目录:256个存放数据文件的目录,如:00, 1F
| |__二级目录:256个存放数据文件的目录
|__logs
|__storaged.log:storage server日志文件
文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
其中:
- 组名: 文件上传后所在的存储组名称,在文件上传成功后有存储服务器返回,需要客户端自行保存。
- 虚拟磁盘路径: 存储服务器配置的虚拟路径,与磁盘选项store_path* 对应。
- 数据两级目录: 存储服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
- 文件名: 与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
设计特点:
1、通过组名tracker能够很快的定位到客户端需要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问;
2、存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。
三、安装与使用
环境准备:
1、Linux环境,使用centos环境.
2、pdfs v5.+的版本不依赖于lib event, 需要安装libfastcommon.同时需要注意各个版本安装的时候匹配关系。不匹配的时候是有bug的。实例使用V5.08
软件下载:
1、代码仓库
https://github.com/happyfish100/fastdfs.git
https://github.com/happyfish100/libfastcommon.git
https://github.com/happyfish100/fastdfs-nginx-module.git
安装:
新系统:
yum -y install wget vim git texinfo patch make cmake gcc gcc-c++ gcc-g77 flex bison file libtool libtool-libs autoconf kernel-devel libjpeg libjpeg-devel libpng libpng-devel libpng10 libpng10-devel gd gd-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glib2 glib2-devel bzip2 bzip2-devel libevent libevent-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel vim-minimal nano fonts-chinese gettext gettext-devel ncurses-devel gmp-devel pspell-devel unzip libcap diffutils pcre pcre-devel
安装libfastcommon
git clone https://github.com/happyfish100/libfastcommon.git
cd libfastcommon
sh make.sh && sh make.sh install
安装fastdfs
git clone https://github.com/happyfish100/fastdfs.git
cd fastdfs
sh make.sh && sh make.sh install
安装nginx[已有可免安装]
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar zxvf nginx-1.8.0.tar.gz
git clone https://github.com/happyfish100/fastdfs-nginx-module.git
cd nginx-1.8.0
./configure--prefix=/usr/local/nginx--add-module=/root/fastdfs-nginx-module/src
make&&make install
cd /usr/local/bin
ln-s/usr/local/nginx/sbin/nginx .
nginx-t
配置:
tracker.conf配置:
cd /etc/fdfs
cp tracker.conf.sample tracker.conf
#cp /home/centos/fastDFS/fdfs-5.08/fastdfs/conf/http.conf .
#cp /home/centos/fastDFS/fdfs-5.08/fastdfs/conf/mime.types .
sed -i 's:base_path=.*:base_path=/home/lijianli/fastdfs/masterdata/tracker:g' tracker.conf
sed -i 's:http.server_port=.*:http.server_port=80:g' tracker.conf
storage.conf配置:
cd /etc/fdfs
cp storage.conf.sample storage.conf
#cp /home/centos/fastDFS/fdfs-5.08/fastdfs/conf/http.conf .
#cp /home/centos/fastDFS/fdfs-5.08/fastdfs/conf/mime.types .
sed -i 's:base_path=.*:base_path=/home/lijianli/fastdfs/masterdata/storage:g' storage.conf
sed -i 's:store_path0=.*:store_path0=/home/lijianli/fastdfs/masterdata/storage:g' storage.conf
sed -i 's/tracker_server=.*/tracker_server=10.60.81.188:22122/g' storage.conf
sed -i 's:http.server_port=.*:http.server_port=80:g' storage.conf
client.conf配置:
cd /etc/fdfs
cp client.conf.sample client.conf
sed -i ’s:base_path=.*:base_path=/home/lijianli/fastdfs/masterdata/client:g’ client.conf
sed -i ’s/tracker_server=.*/tarcker_server=10.60.81.188:22122/g’ client.conf
nginx配置
upstream fdfs_group1{
server 10.60.81.188:80;
}
server{
location group1/M00{
proxy_pass http://fdfs_group1;
}
}
常用命令:
fdfs_delete_file: 删除文件,/opt/apps/fdfs/bin/fdfs_delete_file <config_file> <file_id>
fdfs_download_file: 下载文件,/opt/apps/fdfs/bin/fdfs_download_file <config_file> <file_id> <local_filename>
fdfs_file_info: 获取某个文件信息,/opt/apps/fdfs/bin/fdfs_file_info <config_file> <file_id>
fdfs_monitor: 监控,查看storage server的状态/opt/apps/fdfs/bin/fdfs_monitor <config_file> 也可以用这个命令来摘除无效的storage节点,/opt/apps/fdfs/bin/fdfs_monitor <config_file> delete <group_name> <storage_ip> 注意:如果被删除的storage server的状态是ACTIVE,也就是该storage server还在线上服务的情况下,是无法删除掉的。
fdfs_storaged: 用来启动或是重启或是关闭server,/opt/apps/fdfs/bin/fdfs_storaged <config_file> [start | stop | restart]
fdfs_trackerd: 用来启动或是重启或是关闭server,/opt/apps/fdfs/bin/fdfs_trackerd <config_file> [start | stop | restart]
fdfs_upload_file: 上传文件,/opt/apps/fdfs/bin/fdfs_upload_file <config_file> <local_filename>
2、监控问题。
Java:
https://github.com/canmind/fastdfs-zyc/tree/master/fastdfs-zyc/main/webapp
3、开发集成问题。
四、社区&使用商
阿里,UC网盘,优酷,搜狐等。
五、总结
- FastDFS只有三个角色;且跟踪服务器和存储服务器均不存在单点。
- 跟踪服务器被动的接收存储服务器汇报,对存储服务器进行分组管理;并为客户端选定适用的存储服务器。同一存储服务器可以同时向多台跟踪服务器汇报状态信息。
- 存储服务器组内所有存储服务器是对等关系,存储的数据一一对应且相同;所有的存储服务器均是同时在线服务,极大的提高的服务器的使用率,分担了数据访问压力。
六、参考资料
1、https://github.com/happyfish100/fastdfs 源码
2、http://bbs.chinaunix.net/forum-240-1.html 作者维护的论坛
3、http://tech.uc.cn/?p=221 UC团队使用维护文档
4、https://code.google.com/archive/p/fastdfs/ 作者维护的Google code上的项目。
FASTDFS调研报告(V1.0)的更多相关文章
- 请各位帮帮忙:Android LBS应用——CityExplorer (v1.0) 调研
Hello哇各位亲!! 请各位帮帮忙:Android LBS应用——CityExplorer(V1.0)调研 嗯,这个事情是这样的,要填一个调查问卷,但是问卷中部分问题是关于这个叫做CityExplo ...
- [苏飞开发助手V1.0测试版]官方教程与升级报告
[苏飞开发助手V1.0测试版]官方教程与升级报告导读部分----------------------------------------------------------------- ...
- Beta版本——用户试用与调研报告
1 引言 1.1 系统概述 毕设导师智能分配系统是一个用来简化传统手工匹配繁琐操作的系统.本系统将学生报志愿.系负责人收集整理数据.相关人员进行手工分配.反馈选择结果等繁琐的操作转移到线上.把毕设 ...
- 【原创】风讯DotNetCMS V1.0~V2.0 SQL注入漏洞
文章作者:rebeyond 注:文章首发I.S.T.O信息安全团队,后由原创作者友情提交到乌云-漏洞报告平台.I.S.T.O版权所有,转载需注明作者. 受影响版本:貌似都受影响. 漏洞文件:use ...
- 代码之间-论文修改助手v1.0版本发布
论文查重,是每个毕业生都要面临的一个令人头疼的问题,如果写论文不认真,很可能导致查重红一大片. 之前有帮助一些朋友修改论文降低重复率,做了一些工作后发现,国内的查重机构,如知网.维普等,大多数是基于关 ...
- MathExam小学一二年级计算题生成器V1.0
MathExam小学一二年级计算题生成器v1.0 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning ...
- 《次元唤醒 需求规格说明书v1.0》
一.团队分工 组员 工作比例 参与范围 王诚荣 17% 原型设计,需求规格说明书整合,LOGO设计 马祎特 22% PPT制作,演讲,博客模板,用户描述 陈斌 21% 评审表格制作,引言,项目描述,功 ...
- 接口性能测试方案 白皮书 V1.0
一. 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始,到客户端接收到最后一个字节数据为止所消耗的时间.响应时间按软件的特点再可以细分,如对于一个 C/S 软件的响应时间可以细分为网 ...
- Farseer.net轻量级ORM开源框架 V1.0 开发目标
本篇主要给大家说明下在V1.0中,计划开发的任务的状态.按照国际惯例.上大表格 开发计划状态 编号 模块 状态 说明 1 分离Utils.Extend.UI √ 在V0.2版本中,是集成在一个项 ...
随机推荐
- Solr_全文检索引擎系统
Solr介绍: Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务.Solr可以独立运行在Jetty.Tomcat等这些Servlet容器中. Solr ...
- .NET 4.6.2正式发布带来众多特性
虽然大多数人的注意力都集中在.NET Core上,但与原来的.NET Framework相关的工作还在继续..NET Framework 4.6.2正式版已于近日发布,其重点是安全和WinForms/ ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(74)-微信公众平台开发-自定义菜单
系列目录 引言 1.如果不借用Senparc.Weixin SDK自定义菜单,编码起来,工作量是非常之大 2.但是借助SDK似乎一切都是简单得不要不要的 3.自定义菜单无需要建立数据库表 4.自定义菜 ...
- Mac OS、Ubuntu 安装及使用 Consul
Consul 概念(摘录): Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb 的 SmartStac ...
- PHP 获取 特定时间范围 类
目录 前序 用途 功能及事项 使用方法 代码及注释 前序: 总体来说,我更应该是一个 android 移动开发者,而不是一个 phper,如果说只做移动端的 APP ,我也不会学这么多,这 2年来, ...
- CSS——关于z-index及层叠上下文(stacking context)
以下内容根据CSS规范翻译. z-index 'z-index'Value: auto | <integer> | inheritInitial: autoApplies to: posi ...
- php 基础代码大全(不断完善中)
下面是基础的PHP的代码,不断完善中~ //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线 ...
- 关于DDD的学习资料汇总
DDD(Domain-Driven Design)领域驱动设计,第一次看到DDD是在学习ABP时,在其中的介绍中看到的.what,DDD是个什么鬼,我不是小白,是大白,没听过.于是乎,度娘查查查,找到 ...
- Lind.DDD.LindAspects方法拦截的介绍
回到目录 什么是LindAspects 之前写了关于Aspects的文章<Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP>,今天主要在设计思想上进 ...
- OSGi规范的C#实现开源
这是大约在3-4年前完成的一个C#实现的OSGi框架,实现的过程参照了OSGi规范与与一些实现思路(感谢当时的那些资料与项目),此框架虽然仅在几个小型项目有过实际的应用,但OSGi的规范实现还是相对比 ...