想作个上传/下载文件操做,没有文件存储服务器,又不想花钱购买相似阿里oss文件存储服务怎么办? 固然想到用开源的技术啦,开源的分布式文件存储系统也很多,好比 《 FastDFS 》,《 Minio 》等等。今天就来介绍 《 FastDFS 》html
一、FastDFS 介绍:java
FastDFS做者:YuQing 笔名:HappyFish 100 一位软件架构师,同时是一位 C、Java、PHP 的程序员。 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(上传、下载)等, 解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标, 使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。 FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。 跟踪器(tracker)主要作调度工做,在访问上起负载均衡的做用。 存储节点存储文件,完成文件管理的全部功能:就是存储、同步和提供存取接口,FastDFS同时对文件的metadata元数据进行管理。 所谓文件的metadata就是文件的相关属性,以键值对(key-value)方式表示,如:width=1024,其中的key为width,value为1024。 文件metadata是文件属性列表,能够包含多个键值对。 跟踪器和存储节点均可以由一台或多台服务器构成。跟踪器和存储节点中的服务器都可以随时增长或下线而不会影响线上服务。 其中跟踪器中的全部服务器都是对等的,能够根据服务器的压力状况随时增长或减小。为了支持大容量,存储节点(服务器) 采用了分卷(或分组)的组织方式。 存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,全部卷的文件容量累加就是整个存储系统中的文件容量。 一个卷能够由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的, 卷中的多台存储服务器起到了冗余备份和负载均衡的做用。 在卷中增长服务器时,同步已有的文件是由FastDFS文件系统自动完成,同步完后,系统自动将新增服务器切换到线上提供服务 当存储空间不足或即将耗尽,能够动态添加卷。只须要增长一台或多台服务器并将它们配置为一个新的卷,这样就扩大存储系统的容量 FastDFS中的文件标识分为两个部分:卷名和文件名,两者缺一不可。
关于 FastDFS 相关的资源文章网站这里提供几个:mysql
技术论坛: http://bbs.chinaunix.net/forum-240-1.htmlgit
资源地址: https://sourceforge.net/projects/fastdfs/程序员
源码资源: https://github.com/happyfish100github
二、FastDFS技术架构图:sql
FastDFS文件存储系统使用的术语简介:数据库
Tracker Server:跟踪服务器,主要作调度工做,在访问上起负载均衡的做用。记录storage server的状态,是链接Client和Storage server的枢纽。 Storage Server:存储服务器,文件和meta data都保存到存储服务器上 group:组,也称为卷。同组内服务器上的文件是彻底相同的 文件标识:包括两部分:组名和文件名(包含路径) meta data:文件相关属性,键值对(Key Value Pair)方式,如:width=1024,heigth=768
三、FastDFS文件存储系统的上传与下载流程:服务器
上传流程:架构
下载流程:
文件上传后同步机制,以及增长增长服务器后的同步机制:
同一组内的storage server之间是对等的,文件上传、删除等操做能够在任意一台storage server上进行; 文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器; 源头数据才须要同步,备份数据不须要再次同步,不然就构成环路了; 上述第二条规则有个例外,就是新增长一台storage server时,由已有的一台storage server将已有的全部数据(包括源头数据和备份数据)同步给该新增服务器
四、FastDFS运行时的tracker服务器以及storage服务器目录结构:
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日志文件
五、FastDFS和其余文件存储的简单对比
FastDFS和集中存储方式对比:
指标 |
FastDFS |
NFS |
集中存储设备如NetApp、NAS |
线性扩容性 |
高 |
差 |
差 |
文件高并发访问性能 |
高 |
差 |
通常 |
文件访问方式 |
专有API |
POSIX |
支持POSIX |
硬件成本 |
较低 |
中等 |
高 |
相同内容文件只保存一份 |
支持 |
不支持 |
不支持 |
FastDFS和mogileFS对比:
指标 |
FastDFS |
7mogileFS |
系统简洁性 |
简洁 只有两个角色:tracker和storage |
通常 有三个角色:tracker、storage和存储文件信息的mysqldb |
系统性能 |
很高 (没有使用数据库文件同步直接点对点不通过tracker中转) |
高 (使用mysql来存储文件索引等信息文件同步经过tracker调度和中转) |
系统稳定性 |
高(C语言开发能够支持高并发和高负载) |
通常(Perl语言开发,高并发和高负载支持通常) |
RAID方式 |
分组(组内冗余),灵活性较大 |
动态冗余,灵活性通常 |
通讯协议 |
专有协议 下载文件支持HTTP |
HTTP |
技术文档 |
较详细 |
较少 |
文件附加属性(metadata) |
支持 |
不支持 |
相同内容文件只保存一份 |
支持 |
不支持 |
下载文件时支持文件偏移量 |
支持 |
不支持 |
FastDFS的简介就这里了。下一章讲解 FastDFS的单机版安装,以及实现文件上传,访问、下载。
记录bug,记录成长。我是展浩,一名在java道路奋斗的小白,我们一块儿加油!
个人座右铭:当你的能力撑不起你的野心的时候,你就应该静下心来去学习,去沉淀。