分布式文件系统FastDFS

FastDFS是一款开源的轻量级分布式文件系统,适用于互联网应用的大容量文件存储。它支持Linux、FreeBSD等系统,提供了C、Java和PHP API。FastDFS采用分组存储,对等结构,文件ID作为访问凭证,与web server无缝衔接,支持HTTP下载。FastDFS的文件上传和下载流程简洁,通过Tracker Server调度,Storage Server存储文件。FastDFS还具备文件同步机制,解决同步延迟问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:跟踪服务器,主要做调度工作,在访问上起负载均衡的作用。在内存中记录集群中group和storage server的状态信息,是连接Client和Storage server的枢纽。 因为相关信息全部在内存中,Tracker server的性能非常高,一个较大的集群(比如上百个group)中有3台就足够了。

Storage Server:存储服务器,文件和文件属性(meta data)都保存到存储服务器上。

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

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

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

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

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

FastDFS上传文件流程图 FastDFS上传文件流程图

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

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

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

FastDFS下载文件流程图

  1. client询问tracker可以下载指定文件的storage,参数为文件ID(组名和文件名);

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

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

以HTTP方式下载文件

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

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

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

下面仅介绍扩展模块方式:

  • 使用扩展模块来解决文件同步延迟问题
  • 在每台storage server上部署web server,直接对外提供HTTP服务
  • tracker server上不需要部署web server
  • 如果请求文件在当前storage上不存在,通过文件ID反解出源storage,直接请求源storage
  • 目前已提供apache和nginx扩展模块
  • FastDFS扩展模块不依赖于FastDFS server,可以独立存在!
  • 仅支持HTTP HEAD和GET
  • 支持token方式的防盗链(缺省是关闭的)
  • ts:生成token的时间(unix时间戳)
  • token:32位的token字符串(md5签名)
  • 支持指定保存的缺省文件名,URL参数名为filename
  • 支持断点续传

FastDFS扩展模块注意事项

  • 配置文件/etc/fdfs/mod_fastdfs.conf
  • url_have_group_name:URL中是否包含了group name。这个参数必须正确设置,否则文件不能被下载到
  • response_mode:当文件在本地不存在时,采用何种方式返回文件内容。有如下两种方式:
  • 跳转方式(redirect)
  • 代理方式(proxy)
  • nginx下需要将http.conf中的参数http. need_find_content_type设置为true

HTTP下载文件redirect模式 HTTP下载文件redirect模式

HTTP下载文件proxy模式

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

  • 上传文件时,文件ID由storage server生成并返回给client
  • 文件ID包含了组名和文件名,storage server可以直接根据该文件名定位到文件
  • 一个文件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

FastDFS通信协议

二进制通信协议

协议包由两部分组成:header和body

header共10字节,格式如下:

  • 8 bytes body length
  • 1 byte command
  • 1 byte status

body数据包格式由取决于具体的命令, body可以为空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值