FastDFS 海量小文件存储解决之道

作者:vivo互联网服务器团队-Zhou Changqing

一、FastDFS原理介绍

FastDFS是一个C语言实现的开源轻量级分布式文件系统 。

支持 Linux优先级表、F数据库设计reeBSD、AID 等Unix系统,解决了大容量的文件存储和高数据库系统概论并发访问问题,文件存取实现了负载均衡,适优先级调度算法合存储 4K算法B~500MB 之间的小数据库查询语句文件,特开源代码网站github别适合以文件为载体的在线服务,如图片、视频、文档等等。

二、FastDFS 架构

FastDFS 由三个部分构成:

  • 客户端(Client)

  • 跟踪服务器(TrackerSe链表排序rver)

  • 存储服务器(StorageServe链表排序r)

FastDFS 海量小文件存储解决之道

2.1 Tracker Server (跟踪服务器)

Tracker Server (跟踪服务器) 主要是做调度工作,起到负载均衡的作用。

**(数据库设计1)【服务注册】**管理S链表反转torageServer存储集开源众包群,StorageServer启动时,会把自己注册到TrackerServer上,并且定期报告自身状态信息,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。

**(2)【服务发现】**Client访问StorageServer之前,必须先访问TrackerServer,动态数据库系统概论第五版课后答案获取到StorageServer的连接信息,最终数据是和一个可用的StorageServer进行传算法设计与分析输。

(3)【负载均衡】

  • store group分配策略:
  • 0:轮询方式

  • 1:指定组

  • 2:平衡负载链表反转(选择最大剩余空间的组(卷)上传)

  • store server分配策略:
  • 0:轮询方式

  • 1:根据 IP 地址进行排序选择第一个服务器(优先级越小越优先吗 IP 地址链表和数组的区别最小者)

  • 2:根开源是什么意思优先级进行排序(上传优先级由storage server来设置,参数名为upload_priority)

  • stroe path分配 :数据库系统的核心是
  • 0:轮流方式,多个目录依次存放文件

  • 2:选择剩余空间最大的目录存放文件(注意:剩余磁盘空间是动态的,因此存储到的目录或磁盘可能也是变化的)

2.2 Tracker Server (跟踪服务器)

Tracker Server (跟踪服务器) 主要提供容量和备份服务。

**【分组管理】**以Grou开源软件p为单位,每个Group包含多台Storage Server,链表数据互为备份,存储容量以Group内容量最小的 storage 为准,已 Group 为单位链表结构组织存储方便应用隔算法是指什么离、负载均衡和副本数据开源众包定制。

**缺点:**Group容量受单机存储容量的限制,数据恢复只能依赖开源节流是什么意思Group其他机器重新同步。

**【数据同步】**文件同步只能在 Group 内的Storage Server之间进行,采用pus链表数据结构h方式,即源服务器同步给目标服务器。源服务器读取 bin优先级英文log 文件,将文件内容解析后,按操作命令发送给目标服务器,有目标服务按命令进行操作。

三、上传下载流程

3.1 上传流程解析

FastDFS 海量小文件存储解决之道

3.优先级1.1 选择Tracker Server

集群中的 tracker 之间都是对等的,客户端在链表上传文件时可任意选择一个 tracker 即可。

3.1.2 分配Group、Stroage Server 和storage pa算法工程师th(磁盘或者挂载点)

tracker 接收到上传请求时会先给优先级越小越优先吗该文件分配一个可以存储的 Group ,然后在Group中分配一个Storage Server给客户端,最后在接收到客户端写文件请求时,Storage Server 会分配一个数据存储目录并写开源阅读app下载安装入。

(该过程中优先级最高的运算符的分配策略详见:【负载均衡】)

3.1.3 生成file_id写入并返回

Storage 会生成一个 file_id 来作为当前文数据库件名,file_id 采用 base64 编码,包含:源 storage server ip、文件创建时间、文件大小、文件CRC32校验码 和 随机数。每个存链表的特点储目录下 有两个256*256个子目录。

Storage 会根据 file_id 进行两次 hash 路由到其中一个子目录中。

最后以file_id为文件名存链表数据结构储文件到该子目录下并返回文件路径给客户端。

最终文件存储路径:

**分组 |磁盘|子目录| 文件名 **

group1/M00/00/89/eQ6h3FKJf_PRl8p4AUz4wO8tqaA6算法导论88.apk

  • 【分组】:文件上传时分配 Group。

  • 【磁盘路径】:存储服务器配置的虚拟路径,对应配置参数 store_path 例如:M00对应store_path0,M01对应s算法分析的目的是tore_path1。

  • 【两级目录】:存储服务器在每个虚拟磁盘路径下创建的两链表的创建级目录,用于存储文件。

3.2 下载流程解析

FastDFS 海量小文件存储解决之道

3.2.1 解析路径并路由

tracker 接收 client算法的空间复杂度是指 发送的下载请求时,tracker 从文件名中解析出 Group、大小、创建时间等信息开源矿工,然后根据G开源阅读app下载安装roup 选择一个 storage server 返回开源代码网站github

3.2.2 校验读取并返回

客户端和 Storage Server 建立链接,校验文件是否存在,最终返回文件数据。

**缺点:**Group之间文件同步是异步进行的,可能上传的文件还未同步到当前访问的 Storage S链表结构erver 这台机器上或者延迟原因,将导致下载文件出现404。所以引入ngi链表的定义nx_fastdfs_module 可以很好的解决同步和延迟问题。

3.3 引入fastdfs_nginx_module组件后的下载架构

FastDFS 海量小文件存储解决之道

FastDFS Nginx Mo开源节流是什么意思dule功能介绍

(1)【防开源软件盗链检查】

利用 FastDFS nginx 扩展功能动态生成token,设置http.conf 配置。

  • 开启防盗链功能
  • http.default_content_type =

  • application优先级最高的运算符/octet-stream

  • http.mime_types_filename=mime.types

  • 开启token防盗链功能
  • h数据库设计ttp.anti_steal.check_token=true

  • token过期时间

  • http.anti_steal.token_ttl=900

  • 密钥
  • http.anti_steal.secret_key=xxx

  • token 过期后链表的定义返回的内容

  • h数据库软件ttp.ant链表i_steal.token_check_fail=/etc/fdfs/anti-s开源是什么意思teal.jpg

【token 生成算法】:md5(fileid_without_group + privKey + ts) 同时ts没有超过 ttl 范围。

服务器会自动根据token,st 以及设置的秘钥来验证合法性。访问链接形式如:

http://loc优先级越小越优先吗alhost/G1/M00/00/01/wKgBD01c15nvKU1cAABAOeCdFS466570.jpg?token=b32链表cd06a优先级队列53dea数据库系统概论第五版课后答案4376数据库设计e43d71cc882f9cb&ts=1297930137

(2)【文件元数据解析】

根据 file_id 获取链表逆置元数据信息, 包括:源storage ip,文件路径,名称,大小 等。

(3)【文件访问路由】

因文件的file_Id 包含了上传文件时的源 Storage Server IP ,所以在链表数据结构获取不到本机下的文件时(未同步或者延迟情况下)FastDFS 扩展组件,会根据源服务器IP 来重定向或者代理方式获取文件。

  • 重定向模式

配置项response_mode = redirect,服务器返回302,重定向url

http://源storage ip:port/文件路开源软件径?redirect=1

  • 代理模式

配置项response_mode = proxy,算法导论使用源storage 地址作为代理proxy的host,其他部分不变

四、同步机制

4优先级表.1 同步规则

同步只发生在本优先级表组的 S数据库有哪几种torage Se优先级c语言rver 之间。

源头数据才需要同步,备优先级调度算法份数据不需要再次同步。

新增 Storage Server 时,会由已有一台 Storage Server 将已有的所有数优先级最高的运算符据(源头数据和备开源节流是什么意思份数据)同步给新增服务器。

4.2 Binlog 复制

FastDFS 文件同步采用binlog异步复制方式,Storage Server 使用binlog文件记录文件上传、删除等操作,根据Binlog进行文件同步。Binlog中只记录文件ID和操作,不数据库系统工程师记录文件内容 .binlog 格式如下:

时间数据库管理系统戳 | 操作类型 | 文件名

1490251373 C M02/52/CB/CtAqWVjTbm2AIq链表反转TkAAAC开源是什么意思d_nIZ7M797.jpg

操作类型(部分):

  • C表示源创建、c表示副本创建

  • A表示源追加、a表示副本追加

  • D表示源删除、d表示副本删除

  • . . . . . . .

4.3 同步流程

FastDFS 海量小文件存储解决之道

新增 Storage Server 后,组内其他 Storage Server 服务器会启动同步线程,在 tracker的协调下向新增服务器发起全量和增量同步操作。

(1)Storage C启动后向tracker 上报所属group、ip、port、版本号、存储目录数、子目录数、启动时间、老数据是否同步完成,当前状态等信息。优先级表

(2)tracker 收到Storage C 加入申请请求后,更新本地storage list,返回给C,并适时同步优先级英文给A、B。

(3)storage C向tracker 申请同步请求,响应后变更自身状态为WAIT_SYNC。

(4)storage A 和B 在心跳周期内从同步到的新storage list 发现没有C,则启动同步线程,先向trac开源节流是什么意思ke数据库设计r发起同步申请(TRACKER开源矿工_PROTO_CMD_STORAGE_SYNC_SRC_REQ),tracker会把同步源IP级同步时间戳返回给A和B,如果源IP链表排序和自己本地IP一致,则标记自己作为同步源用来做老数据同步(全量同步源),如果不一致,则标记自己作为增量同步源(只有在C节点状态为Active时才同步)。该决策链表的创建是由tracker 选择产生的,不可A、B同时作为同步源,同时同步数据库设计给C。

(5)同步源(假设是sto算法分析的目的是rage A)以 .mark为后链表逆置缀的文件记录目标机器同步信息算法的空间复杂度是指,并上报变更storage C状态为SYNCING。

(6)从/dat链表结构a.sync目录下读取binlog.index 中的,binlog文件Id,数据库查询语句binlog.000读取逐行读取,进行解析.(详见上面b算法是指什么in开源阅读log 内格式) 发送数据给storage C ,C接收并保存。

(7)数据同步过程中 storage C 的状态变更过程OF开源节流是什么意思FLINE->ONLINE->ACTIVE。ACTIVE 是最终状态,表示storage C 已对外提供服务。

五、文件存储

5.1 LOSF问题

小文件存储(LOSF)面临的问题:

  • 本地文件系统innode梳理优先,存储小文件数量受限。

  • 目录层级和目录中文件数量会导致访优先级最高的运算符问文件开销很大(IO次数多)。

  • 小文件存储,备份和恢复效率低。

针对小文件存储问题,FastDFS 提供了文件合并解决方案。FastDFS 默认创建大文件为 64M,大文件可以存储很多小文件,容纳一个小文件的空间叫s数据库软件lot,solt 最小256字节,最大16M。小于256字节当25算法的时间复杂度取决于6字节存储,超过16M文件单独存储。

5.2 存储方式优先级越小越优先吗

**(1)【默认存储方式】**未开启合并 ,F算法的时间复杂度取决于astDFS生成的file_id 和磁盘上实际存储的文件一一对应。

**(2)【合并存储方式】**多个file_id对应文件被存储成了一个算法的五个特性大文件 。trunk文件名格式:/fastdfs/data/00/000001 文件名从1开优先级排序始递增。而生成的file_id 更长,会新增16个字节额外内算法容用来保存偏移量等信息。

如下:

  • 【file_size】:占用大文件的空间(注意按照最小优先级队列slot-256字节进行对齐)

  • 【mtim开源众包e】:文件修改时间

  • 【crc32优先级排序c语言】:文件内容的crc32码

  • 【formatted_ext_name】:文件扩展名

  • 【alloc_size】:文件大小与size相等

  • 【id】:大文件ID如000001

  • 【offset】:文数据库件内容在trunk文件中的偏移量

  • 【size】:文件大小。

5.3 存储空间管理

**(1)【Trunk Server】**由tracker leader 在一组Storage Server 选择出来的,并通知给该组内所有Storage Server,负责为该组内所有upload操作分配空间。

**(2)【空闲平衡树】**trunk server 会为每个store_path构造一个空闲平衡树,开源是什么意思相同大小的空闲块保存在链表中,每次上传请求时会到根据上传的文件大小到平衡树中查找获取大于或者接近的空闲块,然后从空闲块中分割出多余的作为新的空闲块,重新加入平衡树。如果找不到则会重建一个新的trunk文件,并加入到平衡树中。该分配过程即是一个维护算法导论空闲平衡树的过程。

**(3)【Trunk Binlog】**开启了合优先级最高的运算符并存储后,Trunk Server 会多出一个TrunkBinlog同步。TrunkBinlog记录了TrunkServer 所有分配与回收的空闲块操作,并由Trunk Server同步给同组算法设计与分析中其他storage server。

TrunkBinlog格式如下:

时间戳 | 操作类型 | store_path_index | sub_path_high| sub_path_low | file.id|算法设计与分析 offset | size优先级排序c语言 1410750754 A 0 0 0 1 0 67108864

各字段含义如下:

  • 【file.id】:TrunkFile文件名,开源阅读app下载安装比如 000001

  • 【offset】:开源软件在TrunkFile文件中的偏移量

  • 【size】:占用的大小,按照slot对齐

六、文件去重

FastDFS不具备文件去重能力,必须引入FastDHT 来配合完成。FastDHT 是一个键值对的高效分布式hash系统,底层采用Berkel数据库管理系统ey DB 来做数据库持久化,同步方式使用bi优先级排序c语言nlog复制方式。在FastDFS去重场景中,对文件内容做hash,然后判断文件是否一致。

在文件上传成功后,查看 Storage存储对应存储路径,会发现返回的是一个软链优先级英文接,之后每次重复上传都是返回一个指向第一次上传的文件的软链接。也就保证了文件只保存了一份。

(注意:FastDFS不会返回原始文件的索引,返回的全部都是软链接,当所有的链表的特点软链接都被删除的时候,原始文件也会从FastDFS中被删除)。

七、总结

FastDFS 真正意义上只是一个管理文件的系统(应用级文件系统),比如管理上传文件、图片等。并不像系统磁盘文件系统NTFS或者FAT 等这种系统级文件系统。

发表评论

提供最优质的资源集合

立即查看 了解详情