FastDFS概述
2019-07-24 本文已影响0人
suxin1932
1.FastDFS概述
1.基本情况
FastDFS是用c语言编写的一款开源的轻量级分布式文件存储系统。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,
使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
它解决了大数据量存储和负载均衡等问题。
特别适合以中小文件"建议范围:4KB < file_size <500MB"为载体的在线服务。
1.2架构体系
FastDFS架构包括 Tracker server和Storage server。
客户端请求Tracker server进行文件上传、下载,
通过Tracker server调度最终由Storage server完成文件上传和下载。
#Tracker server
Tracker server作用是负载均衡和调度,
通过Trackerserver在文件上传时可以根据一些策略找到Storageserver提供文件上传服务。
可以将tracker称为追踪服务器或调度服务器。
#Storage server
Storage server作用是文件存储,
客户端上传的文件最终存储在Storage服务器上,
Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。
可以将storage称为存储服务器。
#Tracker 集群
FastDFS集群中的Tracker server可以有多台,
Tracker server之间是相互平等关系同时提供服务,Trackerserver不存在单点故障。
客户端请求Tracker server采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。
#Storage集群
Storage集群采用了分组存储方式。
storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。
一个组由一台或多台存储服务器组成,不同组的Storage server之间不会相互通信;
组内的Storage server之间是平等关系,同组内的Storage server之间会相互连接进行文件同步,
从而保证同组内每个storage上的文件完全一致的。
一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。
采用分组存储方式的好处是灵活、可控性较强。
比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。
一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。
当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。
#Storage状态收集
Storage server会连接集群中所有的Tracker server,
定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。
#FastDFS的文件同步
当客户端将一条数据成功写到一个storage中就算写入成功,
他的文件同步是在后台线程上面运行的,这是和TFS不太一样的地方。
FastDFS同步的时候会生成一个binlog,这里包含数据的元信息,storage会记录下他同步的进度,
以便关机重启之后可以继续同步,这个进度以时间戳的方式记录,所以需要所有的服务器保持时钟的一致。
FastDFS--架构图.png
1.3优势
>> 只能通过专用的API访问,不支持posix,降低了系统的复杂度,处理效率高
>> 支持在线扩容,增强系统的可扩展性
>> 支持软RAID,增强系统的并发处理能力及数据容错能力。
Storage是按照分组来存储文件,同组内的服务器上存储相同的文件,不同组存储不同的文件。
Storage-server之间不会互相通信。
>> 主备Tracker,增强系统的可用性。
>> 支持主从文件,支持自定义扩展名。
>> 文件存储不分块,上传的文件和os文件系统中的文件一一对应。
>> 相同内容的文件只存储一份,节约磁盘存储空间。
对于上传相同的文件会使用散列方式处理文件内容,假如是一致就不会存储后上传的文件,
只是把原来上传的文件在Storage中存储的id和URL返回给客户端。
1.4文件上传
客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。
文件索引信息包括:组名(卷名),虚拟磁盘路径,数据两级目录,文件名。
#如: group01/M00/02/44/wKgDr.xlxs
>> 组名:
文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
>> 虚拟磁盘路径:
storage配置的虚拟路径,与磁盘选项store_path*对应。
如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
>> 数据两级目录:
storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
>> 文件名:
与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:
源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
0、选择tracker server
当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,
客户端在upload文件时可以任意选择一个trakcer。
1、选择存储的group
当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:
>> Round robin,所有的group间轮询
>> Specified group,指定某一个确定的group
>> Load balance,剩余存储空间多多group优先
2、选择storage server
当选定group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则:
>> Round robin,在group内的所有storage间轮询
>> First server ordered by ip,按ip排序
>> First server ordered by priority,按优先级排序(优先级在storage上配置)
3、选择storage path
当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:
>> Round robin,多个存储目录间轮询
>> 剩余存储空间最多的优先
4、生成Fileid
选定存储目录之后,storage会为文件生一个Fileid,
由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,
然后将这个二进制串进行base64编码,转换为可打印的字符串。
选择两级目录 当选定存储目录之后,storage会为文件分配一个fileid,
每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),
路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。
5、生成文件名
当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,
文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
FastDFS---文件上传流程.png
1.5文件下载
tracker根据请求的文件路径即文件ID 来快速定义文件。
# 比如请求下边的文件: group01/M00/02/44/wKgDr.xlxs
>> 通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,
并选择合适的存储服务器提供客户端访问。
>> 存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,
并根据文件名找到客户端需要访问的文件。
FastDFS---文件下载流程.png
2.搭建FastDFS环境
https://blog.csdn.net/u012946310/article/details/81567320
https://www.centos.bz/2017/12/%E4%BD%BF%E7%94%A8docker-compose%E4%B8%80%E9%94%AE%E9%83%A8%E7%BD%B2%E5%88%86%E5%B8%83%E5%BC%8F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9Ffastdfs/
https://blog.csdn.net/song_java/article/details/81484527