前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >加速分布式文件传输:掌握FastDFS-Nginx fast-mod扩展模块的关键技术要点

加速分布式文件传输:掌握FastDFS-Nginx fast-mod扩展模块的关键技术要点

原创
作者头像
Lion Long
发布2024-12-31 22:32:11
发布2024-12-31 22:32:11
6600
代码可运行
举报
文章被收录于专栏:后端开发技术
运行总次数:0
代码可运行

一、架构

在每台storage服务器主机上部署nginx及FastDFS,由nginx模块对storage存储的文件提供http下载服务,仅当当前storage节点找不到文件时会向源storage主机发起redirect或proxy动作。

二、实现原理

2.1、加载配置文件

目标文件在config的时候写死:/etc/fdfs/mod_fastdfs.conf 。

2.2、读取扩展模块配置

一些重要参数如下:

代码语言:javascript
代码运行次数:0
复制
group_count //group个数 
url_have_group_name //url中是否包含group 
group.store_path //group对应的存储路径 
connect_timeout //连接超时 
network_timeout //接收或发送超时 

response_mode //响应模式,proxy或redirect 
load_fdfs_parameters_from_tracker //是否从tracker下载服务端配置

2.3、加载服务端配置

根据load_fdfs_parameters_from_tracker参数确定是否从tracker获取server端的配置信息。

(1)load_fdfs_parameters_from_tracker=true。

  1. 调用fdfs_load_tracker_group_ex解析tracker连接配置 ;
  2. 调用fdfs_get_ini_context_from_tracker连接tracker获取配置信息;
  3. 获取storage_sync_file_max_delay阈值;
  4. 获取use_storage_id;
  5. 如果use_storage_id为true,则连接tracker获取storage_ids映射表(fdfs_get_storage_ids_from_tracker_group)。

(2)load_fdfs_parameters_from_tracker=false。

  1. 从mod_fastdfs.conf加载所需配置:storage_sync_file_max_delay、use_storage_id;
  2. 如果use_storage_id为true,则根据storage_ids_filename获取storage_ids映射表(fdfs_load_storage_ids_from_file)。

三、下载过程

3.1、解析访问路径

得到group和file_id_without_group两个参数。

3.2、防盗链检查

防盗链的应用场景,不希望文件被一直分享和下载,则可以在分享文件的时候加上token,其他人在没有token以及超过一定的时间后,无法下载该文件。

(1)配置:

在http.conf文件根据g_http_params.anti_steal_token配置,判断是否进行防盗链检查。

(2)实现方式:

采用token的方式实现防盗链,要求下载地址带上token,且token具有时效性(由ts参数指明)。

(3)检查方式:私钥

token=MD5(file_without_group+privateKey+ts);同时ts没有超过ttl范围。

fdfs_http_shared.h

代码语言:javascript
代码运行次数:0
复制
fdfs_http_check_token(...);  //检验token的函数
fdfs_http_gen_token(...);    //生成token的函数

更多资源可以参考:

FastDFS的作者介绍的防盗链 使用FastDFS的内置防盗链功能www.cnblogs.com/cnxkey/articles/11154929.html

3.3、获取文件元数据

根据文件ID 获取元数据信息, 包括:源storage ip, 文件路径、名称,大小。

由fdfs_get_file_info_ex1(...)函数实现。

3.4、检查本地文件是否存在

调用trunk_file_stat_ex1获取本地文件信息,该方法将实现:

  1. 辨别当前文件是trunkfile还是singlefile;
  2. 获得文件句柄fd;
  3. 如果文件是trunk形式则同时也将相关信息(偏移量/长度)一并获得。

3.5、文件不存在的处理

(1)进行有效性检查:

  1. 源storage是本机或者当前时间与文件创建时间的差距已经超过阈值,报错。
  2. 如果是redirect后的场景,同样报错。

如果是由其他storage节点redirect过来的请求,其url参数中会存在redirect一项在通过有效性检查之后将进行代理或重定向处理。

(2)重定向模式:

配置项response_mode = redirect,此时服务端返回返回302响应码,url如下:

代码语言:javascript
代码运行次数:0
复制
http:// {源storage地址} : {当前port} {当前url} {参数"redirect=1"}(标记已重定向过)

重定向模式下要求源storage配备公开访问的webserver、同样的端口(一般是80)、同样的path配置。

(3)代理模式:

配置项response_mode = proxy,该模式的工作原理如同反向代理的做法,而仅仅使用源storage地址作为代理proxy的host,其余部分保持不变。

(4)重定向和代理的区别:

重定向:客户端访问某个服务器的资源,然而该服务器没有所请求的资源,但是该服务器检测到集群中的另一台服务器有客户端所请求的资源,因此返回相关的另一台服务器信息给客户端,客户端再重新请求重定向的服务器。

redirect

代理:客户端访问某个服务器的资源,然而该服务器没有所请求的资源,但是该服务器检测到集群中的另一台服务器有客户端所请求的资源,因此该服务器转发请求到另一台服务器获取相关数据,然后再发结果给客户端。

proxy

优缺点:

模式

优点

缺点

代理

只需要验证一次token

当很多请求都需要转发到另一条服务器,那么将会占用该服务器的带宽,影响效率

重定向

不会把资源集中在某一台服务器

两次请求,需要验证token两次

3.6、输出本地文件

当本地文件存在时,将直接输出。

(1)根据是否trunkfile获取文件名,文件名长度、文件offset。

(2)若nginx开启了send_file开关而且当前为非chunkFile的情况下尝试使用sendfile方法以优化性能。

(3)否则使用lseek 方式随机访问文件,并输出相应的段。做法是使用chunk方式循环读,输出。

四、总结

本文旨在帮助读者深入了解FastDFS-Nginx fast-mod扩展模块的关键技术要点,以加速分布式文件传输。

1. 介绍该扩展模块的作用和优势,以及它与FastDFS和Nginx的关系,帮助读者理解其在分布式文件传输中的重要性。

2. 详细解释如何安装和配置FastDFS-Nginx fast-mod扩展模块,包括依赖项的安装、模块的编译和加载等步骤。

3. 深入探讨FastDFS-Nginx fast-mod扩展模块的工作原理,包括文件上传和下载的过程、负载均衡和高可用机制等。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、架构
  • 二、实现原理
    • 2.1、加载配置文件
    • 2.2、读取扩展模块配置
    • 2.3、加载服务端配置
  • 三、下载过程
    • 3.1、解析访问路径
    • 3.2、防盗链检查
    • 3.3、获取文件元数据
    • 3.4、检查本地文件是否存在
    • 3.5、文件不存在的处理
    • 3.6、输出本地文件
  • 四、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档