什么是FastDFS
FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS的特性:
FastDFS是一个轻量级的开源分布式文件系统
FastDFS主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡
FastDFS实现了软件方式的RAID,可以使用廉价的IDE硬盘进行存储
支持存储服务器在线扩容
支持相同内容的文件只保存一份,节约磁盘空间
FastDFS只能通过Client API访问,不支持POSIX访问方式
FastDFS特别适合大中型网站使用,用来存储资源文件(如:图片、文档、音频、视频等等)
系统架构-架构图:
• 只有两个角色,tracker server和storage server,不需要存储文件索引信息
• 所有服务器都是对等的,不存在Master-Slave关系
• 存储服务器采用分组方式,同组内存储服务器上的文件完全相同(RAID 1)
• 不同组的storage server之间不会相互通信
• 由storage server主动向tracker server报告状态信息,tracker server之间通常不会相互通信
Tracker集群:
FastDFS集群中的Tracker server可以有多台,Tracker server之间是相互平等关系同时提供服务,Tracker server不存在单点故障。客户端请求Tracker server采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。
Storage集群:
Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。
采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。
Storage状态收集
Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。
上传文件流程图:
客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
下载文件流程图:
tracker根据请求的文件路径即文件ID 来快速定义文件。
比如请求下边的文件:
1.通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问。
2.存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。
FastDFS 如何做到无索引服务器?
上传文件时,文件ID由 storage server 生成并返回给client
文件ID包含了组名和文件名,storage server可以直接根据该文件名定位到文件
一个文件ID示例
文件名包含的信息
采用Base64编码。包含的字段包括:
源storage server IP地址
文件创建时间
文件大小
文件CRC32校验码
随机数
FastDFS同步机制:
采用binlog文件记录 文件上传、删除等操作,根据binlog进行文件同步
增量同步方式,记录已同步的位置到.mark文件中
同组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行
文件同步只在同组内的storage server 之间进行,采用push方式,即源头服务器同步给目标服务器
FastDFS如何解决同步延迟问题?
storage生成的文件名中,包含源头storage IP 地址和文件创建时间戳
源头storage定时向tracker报告同步情况,包含向目标服务器同步到的文件时间戳
tracker收到storage的同步报告后,找出该组内每台storage被同步的时间戳(取最小值),作为storage属性保存到内存
以HTTP方式下载文件:
FastDFS 分组存储方式,为HTTP方式下载提供了遍历
FastDFS支持HTTP方式下载文件,不建议使用内置web server,推荐使用外部web server,例如Apache或 Nginx
因为需要解决文件同步延迟的问题因此在apache 和 nginx上需要使用FastDFS扩展模块。尤其是V3.x引入小文件合并存储后,必须使用扩展模块来读取文件
FastDFS 扩展模块要点:
使用扩展模块来解决文件同步延迟问题
在每台storage server上部署web server,直接对外提供HTTP服务
tracker server上不需要部署web server
如果请求文件在当前storage上不存在,通过文件ID反编译出源stroage,直接请求源storage
目前已提供apache和nginx扩展模块
FastDFS扩展模块不依赖与FasrDFS server,可以独立存在!!!
FastDFS扩展模块特性:
仅支持HTTP HEAD 和 GET
支持 token方式的防盗链
-ts :生成token的时间(unix时间戳)
-token :32位的token字符串(md5签名
支持指定保存的缺省文件名,URL参数名为filename
支持断点续传
推荐FastDFS 部署方案:
文件上传和删除操作:使用FastDFS client API,目前提供了C、PHP 和JAVA的client API
文件下载采用HTTP方式:使用nginx或者apache扩展模块,不推荐使用FastDFS内置的web server
不要做RAID,直接挂载单盘,每隔硬盘作为一个mount point
最大并发连接设置:
参数名:max_connections
缺省值:256
说明: FastDFS 采用预先分配好buffer队列的做法,分配的内存大小:max_connections*buff_size,因此配置的连接数越大,消耗的内存越多。不建议配置得过大,以避免无谓的内存开销。
工作线程设置:
参数名: work_threads
缺省值: 4
说明: 为了避免CPU上下文切换的开销,以及不必要的资源消耗,不建议将本参数设置得过大。为了发挥出多个CPU的效能,系统中线程数总和,应等于CPU总数
对于tracker server,公式为:work_threads + 1 = CPU 数
对于storage,公式为:work_threads + 1 + (disk_reader_threads +disk_writer_threads) * store_path_count = CPU数
storage 目录数设置:
参数名: subdir_count_per_path
缺省值 : 256
说明: FastDFS 采用二级目录的做法,目录会在FastDFS初始化时自动创建。存储海量小文件,打开了trunk存储方式的情况下,建议将本参数适当该小,比如设置为32,此时存放文件的目录数为32*32 = 1024.
storage磁盘读写线程设置:
disk_rw_separated: 磁盘读写是否分离
disk_reader_threads: 单个磁盘读线程数
disk_writer_threads: 单个磁盘写线程
如果磁盘读写混合,单个磁盘读写线程数为读线程数和写线程数之和
对于单盘挂载方式,磁盘读写线程分别设置为1即可
如果磁盘做了RAID,那么需要酌情加大读写线程数,这样才能最大程度地发挥磁盘性能
storage同步延迟相关设置
• sync_binlog_buff_interval:将binlog buffer写入磁盘的时间间隔,取值大于0,缺省值为60s
• sync_wait_msec:如果没有需要同步的文件,对binlog进行轮询的时间间隔,取值大于0,缺省值为100ms
• sync_interval:同步完一个文件后,休眠的毫秒数,缺省值为0
• 为了缩短文件同步时间,可以将上述3个参数适当调小即可
---------------------
作者:笑看风华
来源:CSDN
原文:https://blog.csdn.net/fd2025/article/details/80071191
版权声明:本文为博主原创文章,转载请附上博文链接!