写点什么

分布式文件系统 FastDFS

  • 2023-04-17
    湖南
  • 本文字数:2197 字

    阅读完需:约 7 分钟

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 可以为空

用户头像

喜欢就点个关注吧~ 2023-04-10 加入

持续更新Java

评论

发布
暂无评论
分布式文件系统FastDFS_Java_会踢球的程序源_InfoQ写作社区