FastDFS原理

FastDFS是开源轻量级分布式文件系统,解决大容量文件存储和高并发访问问题。本文介绍其原理,包括系统架构、同步机制、通信协议等,还说明了安装运行步骤、配置方法,对比了与其他系统差异,最后添加Nginx模块支持Http访问文件。

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

 FastDFS原理

摘要:

  • 系统架构  
  • 相关术语  
  • 同步机制  
  • 通信协议  
  • 目录结构  
  • 安装和运行  
  • 和其他系统对比

FastDFS简介

FastDFS是以C语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载),

特别适合以文件为载体的在线服务,如图片网站,视频网站等 FastDFS主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡 FastDFS实现了软件方式的RAID,

可以使用廉价的IDE硬盘进行存储 支持存储服务器在线扩容 支持相同内容的文件只保存一份,节约磁盘空间 FastDFS只能通过Client API访问,不支持POSIX访问方式。

 

系统架构-架构图

 

相关术语

Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。

Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。文件和meta data都保存到存储服务器上。

group:组,也可称为卷。同组内服务器上的文件是完全相同。  作用:组间隔离,组内互为备份,容灾  

meta data:文件相关属性,键值对(Key Value Pair)方式,如:width=1024,heigth=768

fastDFS对文件内容做hash处理,避免出现重复文件

 

文件标识

文件标识:包括两部分,组名和文件名(包含路径)

例如: group1/M00/05/4E/rBCjQl8gCqWACg6CAAOl6IGjv2Q986.mp4

上传文件流程

1. client询问tracker上传到的storage,不需要附加参数;

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

3. client直接和storage通讯完成文件上传。

写操作的时候,新写的文件会以hash的方式被路由到某个子目录下,然后将文件数据作为本地文件存储到该目录中。

 

下载文件流程

1. client询问tracker下载文件的storage,参数为文件标识(组名和文件名);

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

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

当客户端向Tracker发起下载请求时,并不会直接下载,而是先查询storage server(检测同步状态),返回storage server的ip和端口;

然后客户端会带着文件信息(组名,路径,文件名),去访问相关的storage,然后下载文件。

 

同步机制

  • 同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行
  • 文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器;
  • 源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了;
  • 上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。
  • 写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。
  • 每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步;
  • storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
  • storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。

 

通信协议

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

header共10字节,格式如下:   8 bytes body length   1 byte command   1 byte status

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

 

运行时目录结构-tracker server

Tracker服务初次启动成功后,会在base_path下创建data、logs两个目录。目录结构如下:

 

运行时目录结构-storage server

Storage 启动成功后,在base_path 下创建了data、logs目录,记录着 Storage Server 的信息。 在 store_path0 目录下,创建了N*N个子目录: 默认每一级256个总共65536个

安装和运行

1. 下载

2. 解压

# tar -zxvf V5.05.tar.gz

# cd fastdfs-5.05

3. 编译、安装

# ./make.sh

# ./make.sh install

4. 默认安装方式安装后的相应文件与目录

A、服务脚本:

/etc/init.d/fdfs_storaged

/etc/init.d/fdfs_tracker

B、配置文件(这三个是作者给的样例配置文件) :

/etc/fdfs/client.conf.sample

/etc/fdfs/storage.conf.sample

/etc/fdfs/tracker.conf.sample

C、命令工具在 /usr/bin/ 目录下:

fdfs_appender_test

fdfs_appender_test1

fdfs_append_file

fdfs_crc32

fdfs_delete_file

fdfs_download_file

fdfs_file_info

fdfs_monitor

fdfs_storaged

fdfs_test

fdfs_test1

fdfs_trackerd

fdfs_upload_appender

fdfs_upload_file

stop.sh

restart.sh

 

配置FastDFS跟踪器(Tracker)

编辑tracker.conf ,标红的需要修改下,其它的默认即可。

# 配置文件是否不生效,false 为生效

disabled=false

# 提供服务的端口

port=22122

# Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)

base_path=/data/fastdfs/tracker

# HTTP 服务端口

http.server_port=80

 

配置 FastDFS 存储 (Storage)

编辑storage.conf  标红的需要修改,其它的默认即可。

# 配置文件是否不生效,false 为生效

disabled=false

# 指定此 storage server 所在 组(卷)

group_name=group1

# storage server 服务端口

port=23000

# 心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳)

heart_beat_interval=30

# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)

base_path=/data/fastdfs/storage

# 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。

store_path_count=1

# 逐一配置 store_path_count 个路径,索引号基于 0。

如果不配置 store_path0,那它就和 base_path 对应的路径一样。

store_path0=/data/fastdfs/file

# FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。

# 如果本参数只为 N(如: 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N * N 个存放文件的子目录。

subdir_count_per_path=256

# tracker_server 的列表 ,会主动连接 tracker_server

# 有多个 tracker server 时,每个 tracker server 写一行

tracker_server=ip (或域名):22122

# 允许系统同步的时间段 (默认是全天) 。

一般用于避免高峰同步产生一些问题而设定。

sync_start_time=00:00

sync_end_time=23:59

# 访问端口

http.server_port=80

 

FastDFS和集中存储方式对比

 

指标

FastDFS

NFS

集中存储设备

如NetApp、NAS

线性扩容性

文件高并发访问性能

一般

文件访问方式

专有API

POSIX

支持POSIX

硬件成本

较低

中等

相同内容文件只保存一份

支持

不支持

不支持

FastDFS和mogileFS对比

 

指标

FastDFS

mogileFS

系统简洁性

简洁

只有两个角色:tracker和storage

一般

有三个角色:tracker、storage和存储文件信息的mysql db

系统性能

很高(没有使用数据库,文件同步直接点对点,不经过tracker中转)

高(使用mysql来存储文件索引等信息,文件同步通过tracker调度和中转)

系统稳定性

高(C语言开发,可以支持高并发和高负载)

一般(Perl语言开发,高并发和高负载支持一般)

RAID方式

分组(组内冗余),灵活性较大

动态冗余,灵活性一般

通信协议

专有协议

下载文件支持HTTP

HTTP

技术文档

较详细

较少

文件附加属性(meta data)

支持

不支持

相同内容文件只保存一份

支持

不支持

下载文件时支持文件偏移量

支持

不支持

 

添加Nginx模块

 

上面将文件上传成功了,但我们无法下载。

因此安装Nginx作为服务器以支持Http方式访问文件。

同时,后面安装FastDFS的Nginx模块也需要Nginx环境。

Nginx只需要安装到StorageServer所在的服务器即可,用于访问文件。

我这里由于是单机,TrackerServer和StorageServer在一台服务器上。      

确保电脑上已经装了Nginx。

下载fastdfs-nginx-module压缩包,并解压

进入Nginx的安装目录/usr/local/nginx/,   执行:

sudo ./configure --prefix=/usr/local/nginx/ --add-module=/home/download/fastdfs-nginx-module/src

sudo ./make

sudo ./make install

sudo cp /home/download/fastdfs-nginx-module/src/mod_fastdfs.conf  

/etc/fdfs/mod_fastdfs.conf

 

配置nginx.conf

sudo vim /usr/local/nginx/conf/nginx.conf

在http部分中添加配置信息如下:

server {            

listen       8888;            

server_name  localhost;            

location ~/group[0-9]/ {  // 地址有组号的,就到下面的位置里找                

      ngx_fastdfs_module;            

}            

error_page   500 502 503 504  /50x.html;            

location = /50x.html {            

      root   html;            

}        

}

参考网站

FastDFS英文:http://code.google.com/p/fastdfs

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值