FastDFS概述

FastDFS是一款开源的轻量级分布式文件系统

– 纯C实现,支持Linux、FreeBSD等UNIX系统

– 类google FS,不是通用的文件系统,只能通过专有API访问,目前提供了C、Java和PHP API

– 为互联网应用量身定做,解决大容量文件存储问题,追求高性能和高扩展性

– FastDFS可以看做是基于文件的key value pair存储系统,称作分布式文件存储服务更为合适

FastDFS提供的功能

• upload:上传普通文件,包括主文件

• upload_appender:上传appender文件,后续可以对其进行append操作

• upload_slave:上传从文件

• download:下载文件

• delete:删除文件

• append:在已有文件后追加内容

• set_metadata:设置文件附加属性

• get_metadata:获取文件附加属性

FastDFS的特点

• 分组存储,灵活简洁

• 对等结构,不存在单点

• 文件ID由FastDFS生成,作为文件访问凭证。FastDFS不需要传统的name server

• 和流行的web server无缝衔接,FastDFS已提供apache和nginx扩展模块

• 大、中、小文件均可以很好支持,支持海量小文件存储

• 支持多块磁盘,支持单盘数据恢复

• 支持相同文件内容只保存一份,节省存储空间

• 存储服务器上可以保存文件附加属性

• 下载文件支持多线程方式,支持断点续传

FastDFS架构示意图
在这里插入图片描述
FastDFS架构解读

• 只有两个角色,tracker server和storage server,不需要存储文件索引信息

• 所有服务器都是对等的,不存在Master-Slave关系

• 存储服务器采用分组方式,同组内存储服务器上的文件完全相同(RAID 1)

• 不同组的storage server之间不会相互通信

• 由storage server主动向tracker server报告状态信息,tracker server之间通常不会相互通信

FastDFS上传文件流程图
在这里插入图片描述

  1. client询问tracker上传到的storage;

  2. tracker返回一台可用的storage;

  3. client直接和storage通信完成文件上传,storage返回文件ID

FastDFS下载文件流程图
在这里插入图片描述
4. client询问tracker可以下载指定文件的storage,参数为文件ID(组名和文件名);

  1. tracker返回一台可用的storage;

  2. client直接和storage通信完成文件下载。

FastDFS如何做到无索引服务器?

• 上传文件时,文件ID由storage server生成并返回给client

• 文件ID包含了组名和文件名,storage server可以直接根据该文件名定位到文件

• 一个文件ID示例:

文件名中包含的信息

采用Base64编码,包含的字段包括:

– 源storage server IP地址

– 文件创建时间

– 文件大小

– 文件CRC32校验码

– 随机数

合并存储文件ID格式

• 在文件名后面,多了16字节

• 采用Base64编码,包含的字段包括:

– 存放到的trunk file ID

– 文件偏移量

– 占用的空间大小

FastDFS同步机制

• 采用binlog文件记录文件上传、删除等操作,根据binlog进行文件同步

• binlog中只记录文件名,不记录文件内容

• 增量同步方式,记录已同步的位置到.mark文件中

• 同组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行

• 文件同步只在同组内的storage server之间进行,采用push方式,即源头服务器同步给目标服务器

FastDFS如何解决同步延迟问题?

• storage生成的文件名中,包含源头storage IP地址和文件创建时间戳

• 源头storage定时向tracker报告同步情况,包括向目标服务器同步到的文件时间戳

• tracker收到storage的同步报告后,找出该组内每台storage被同步到的时间戳(取最小值),作为storage属性保存到内存中

下载文件选择storage的方法

client询问tracker有哪些storage可以下载指定文件时,tracker返回满足如下四个条件之一的storage:

– (当前时间 -文件创建时间戳) > 同步延迟阀值

– 文件创建时间戳 < Storage被同步到的时间戳

– 文件创建时间戳 == Storage被同步到的时间戳且(当前时间 -文件创建时间戳) > 文件同步最大时间(如5分钟)

– 该文件上传到的源头storage以HTTP方式下载文件

• FastDFS分组存储方式,为HTTP方式下载提供了便利

• FastDFS支持HTTP方式下载文件,不建议使用内置web server,推荐使用外部web server,如果apache或nginx

• 因为需要解决文件同步延迟的问题,因此在apache和nginx上需要使用FastDFS扩展模块。尤其是V3.x引入小文件合并存储后,必须使用扩展模块来读取文件

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐