Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >FastDFS的文件上传、下载原理以及负载均衡方法

FastDFS的文件上传、下载原理以及负载均衡方法

原创
作者头像
Lion 莱恩呀
发布于 2024-12-27 13:23:32
发布于 2024-12-27 13:23:32
38700
代码可运行
举报
文章被收录于专栏:后端开发技术后端开发技术
运行总次数:0
代码可运行

一、文件上传原理

图片
图片

fastdfs_upload_file

1.1、选择tracker server

高可用,通过冗余的方式提供服务。当集群中不止一个tracker服务时,由于tracker之间是对等的关系,客户端在上传文件时可以任意选择一个tracker。

图片
图片

fastdfs_arch

1.2、选择存储的group及其负载均衡算法

当tracker接收到上传文件的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:

(1)Round robin,所有的group间轮询。

(2)Specified group,指定某一个确定的group。

(3) Load balance,选择最大剩余空 间的组上传文件 。

1.3、选择storage server及其负载均衡算法

当选定group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则:

  1. Round robin,在group内的所有storage间轮询。
  2. First server ordered by ip,按IP排序,也会轮询。
  3. First server ordered by priority,按优先级排序(优先级在storage上配置);可以理解为权重的方式,权重高的优先选择。比如,storage 1 为100M的带宽和storage 2为500M带宽,上传文件时优先使用500M带宽的storage。

1.4、选择storage path及其负载均衡算法

当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:

(1) Round robin,多个存储目录间轮询。

(2)剩余存储空间最多的优先。

可以配置多个磁盘路径。注意,同一个group中的storage的配置必须是一样的;这里的一样不是路径一样,而是path的数量要一致。多个路径对应多个磁盘,才能发挥多个磁盘并发读写能力。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# store path (disk or mount point) count, default value is 1store_path_count = 1
#存储路径(磁盘或挂载点)计数,默认值为1 

store_path_count=1

# store_path#, based on 0, to configure the store paths to store filesif store_path0 not exists, it' s value is base_path (NOTrecommended)#the paths must be exist.
#store_path#,基于0,要配置存储路径来存储filesif store_path 0不存在,它的值是base_path(NOT推荐的)#这些路径必须存在。
#
#
#工IMPORTANTNOTE:#
#工IMPORTANTNOTE:
#the store paths' order is very important, don 't mess up ! !!
#store路径的排序很重要,不要搞砸了!
#
# the base_path should be independent (different) of the store paths
# 基路径应该独立于存储路径(不同)

store_path0 = /home/fastdfs/storage_group1_23000
#store_path1 = / home/yuqing/fastdfs2

fastdfs适合小文件存储,大文件存储建议使用ceph。如果使用fastdfs存储大文件,那么是一个磁盘分摊写压力;而ceph的集群可以使用多台服务分摊写压力,写的速度会非常快。

1.5、生成Fileid

选定存储目录之后,storage会为文件生一个Fileid,由 storage server ip、文件创建时间、文件大小、文件crc32、一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 4 bytes  4 bytes	  8 bytes   4 bytes  2 bytes
+--------+--------+----------------+--------+-----+
|   IP   |  time  |	file_size  | crc32  |校验值|

(1)选择两级目录:

当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。

(2)生成文件名:

当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由:group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

图片
图片

fastdfs_file_path

文件名规则:

  1. storage_id,(ip的数值型)源storage server ID或IP地址。
  2. timestamp,文件创建时间戳。
  3. file_size,若原始值为32位则前面加入一个随机值填充,最终为64位。
  4. crc32,文件内容的检验码。
  5. 随机数 ,引入随机数的目的是防止生成重名文件。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eBuDxWCb2qmAQ89yAAAAKeR1iIo162
| 4bytes | 4bytes    | 8bytes    |4bytes | 2bytes |
| ip     | timestamp | file_size |crc32  | 校验值 |

二、下载文件逻辑

客户端upload file成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。

图片
图片

fastdfs_download_file

跟upload file一样,在download file时客户端可以选择任意tracker server。

client发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。

由于group内的文件同步时在后台异步进行的,所以有可能出现在读到时候,文件还没有同步到某些storage server上,为了尽量避免访问到这样的storage,tracker按照如下规则选择group内可读的storage:

  1. 该文件上传到的源头storage, 源头storage只要存活着,肯定包含这个文件,源头的地址被编码在文件名中。
  2. 文件创建时间戳一定是storage被同步到的时间戳 且(当前时间-文件创建时间戳) > 文件同步最大时间(如5分钟) ,文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。
  3. 文件创建时间戳 < storage被同步到的时间戳。同步时间戳之前的文件确定已经同步了。
  4. (当前时间-文件创建时间戳) > 同步延迟阀值(如一天)。经过同步延迟阈值时间,认为文件肯定已经同步了。

思考:fastdfs上传完文件后立即读取文件问题。因为fastdfs是弱一致性,可能其他storage还没有同步文件,这时应该怎么判断从哪个storage中读取文件?

答案:可以根据时间来读取,因为fileid里有携带时间戳,可以根据时间进行匹配来进入storage ;如果某个storage没有同步

三、总结

本文旨在深入探索FastDFS的文件上传和下载原理,并介绍负载均衡的关键方法。我们将详细解析FastDFS在文件传输方面的工作原理,以及如何通过负载均衡提升性能和可靠性。主要内容包括:

1. 文件上传原理:详细介绍FastDFS的文件上传流程,包括客户端与跟踪器节点的交互、文件分片和存储节点的选择等关键步骤。

2. 文件下载原理:解析FastDFS的文件下载过程,包括客户端与存储节点的通信、文件分片的获取和组装等步骤,揭示文件下载的工作原理。

3. 负载均衡方法:介绍FastDFS中常用的负载均衡方法,如基于权重的负载均衡、一致性哈希算法等,以及它们在提升系统性能和可扩展性方面的作用。

4. 性能优化和实践经验:讨论如何通过性能优化和实践经验进一步提升FastDFS的文件上传和下载性能,包括网络优化、调整参数和合理的存储节点配置等方面的建议。

通过本文,读者将深入了解FastDFS的文件上传和下载原理,以及负载均衡的关键方法。我们将解析FastDFS在文件传输方面的内部工作流程,探讨如何通过负载均衡提升系统性能和可靠性。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Tina R329 swupdate OTA升级步骤
第一步: 编译路径执行make menucinfig和make ota_menucinfig中分别选中: (1)Allwinner > swupdate (2)Allwinner > swupdate > Swupdate Settings > General Configuration > MTD support (3)Allwinner > swupdate > Image Handlers > ubivol
阿志小管家
2024/02/02
4610
全志 Tina Linux 存储介质切换:eMMC,SPI NAND,SPI NOR,SD Card,SD NAND
SDK切换存储介质需要修改board.dts、sys_config.fex、内核配置、TINA系统配置。另外,在spinor 存储介质下,通过 u-boot-sun8iw21p1.bin 进行烧录,u-boot-spinor-sun8iw21p1.bin 启动,使用sys_partition_nor.fex作为分区表。在非spinor介质(spinand、emmc、sdnand),通过u-boot-sun8iw21p1.bin进行烧录和启动,使用sys_partition.fex作为分区表。下文将介绍spinor切换spinand、spinand切换spinor、spinor切换emmc、spinor切换sdnand四种切换方式。
阿志小管家
2024/02/02
8620
快速启用开发板
将开发板配套的两根typec线,一根 直接连接至 开发板 OTG烧录接口 另一头连接至电脑的USB接口,开发板默认有系统,接通otg电源线就会通电并直接启动。
韦东山
2024/08/27
1920
快速启用开发板
修改系统启动环境变量
首先连接好开发板的串口终端,在开发板上后,一直快速短按 空格键 即可进入 uboot的 shell 交互命令行内。在命令行内输入 print 命令,可以看到当前系统的所有环境变量。
韦东山
2024/08/19
2110
修改系统启动环境变量
Linux SPI-NAND 驱动开发指南
介绍 Sunxi SPINand mtd/ubi 驱动设计, 方便相关驱动和应用开发人员
韦东山
2023/02/24
4.3K0
Linux SPI-NAND 驱动开发指南
解决LicheeRV 86 Panel在tina2.0配置lcd GPIO引脚及colorbar闪屏的问题
设备树修改参考了https://github.com/Tina-Linux/tina-d1x-lichee-rv和sipeed提供的licheerv_d1_compile。
阿志小管家
2024/02/02
6270
解决LicheeRV 86 Panel在tina2.0配置lcd GPIO引脚及colorbar闪屏的问题
快速启动开发板
将开发板配套的两根typec线,一根 直接连接至 开发板 OTG烧录接口 另一头连接至电脑的USB接口,开发板默认有系统,接通otg电源线就会通电并直接启动。
韦东山
2024/08/24
2900
快速启动开发板
TinaSDKV2.0 Kernel基本开发
可以在tina-sdk source后,在tina-sdk任意目录内执行 cconfigs命令直接切换到板级 Linux 设备树 和 配置文件目录。
韦东山
2024/08/19
2120
TinaSDKV2.0 Kernel基本开发
Linux SPI 开发指南
SPI 是一种高速、高效率的串行接口技术。通常由一个主模块和一个或多个从模块组成,主模块选择一个从模块进行同步通信,从而完成数据的交换,被广泛应用于 ADC、LCD 等设备与 MCU 之间。全志的 spi 控制器支持以下功能:
韦东山
2023/02/25
9.5K0
Linux SPI 开发指南
启动开发板
将开发板配套的两根typec线,一根 直接连接至 开发板 OTG烧录接口 另一头连接至电脑的USB接口,开发板默认有系统,接通otg电源线就会通电并直接启动。
韦东山
2024/08/19
2520
启动开发板
全志Tina Linux SPINAND UBI 离线烧录 开发指南 支持百问网T113 D1-H哪吒 DongshanPI-D1s V853-Pro等开发板
sys_partition.fex 文件中的各个分区大小会按照LEB 大小对齐,sunxi_mbr 分区概念与UBI卷(volume)概念相同 需要修改原镜像文件:物理区TOC0 合逻辑区sunxi_mbr.fex 需要动态生成文件:逻辑区ubi layout volume 注意:
韦东山
2022/12/28
1.2K0
全志Tina Linux SPINAND UBI 离线烧录 开发指南 支持百问网T113 D1-H哪吒 DongshanPI-D1s V853-Pro等开发板
Tina Linux 存储开发指南
介绍TinaLinux Flash,分区,文件系统等存储相关信息,指导方案的开发定制。
韦东山
2023/02/25
3.3K0
全志平台Tina系统启动阶段改设备DTS的方法
在设备BSP调试的过程中,经常会出现需要修改DTS的情况,比如调试一个新的屏幕、传感器或者wifi模组,传统的方法是: 在源码中直接修改board.dts文件->重新编译&打包->烧写到设备里 这种方法繁杂,编译和烧写都要花费时间,严重影响开发效率。 因此,全志(其实是uboot提供的)提供了一个启动阶段DTS调试的方法,可以让我们在启动阶段就把DTS改掉,这次启动加载的就是改后的DTS。 *注:这种修改是一次性的,不可以保存的,只限这次启动的时候生效,断电或者重启就不生效了1.设备上电过程中串口按住电脑键盘的"s"按键,让设备进入boot: *注:是真的按住调试的电脑的键盘的s按键,和按住2另设备跳烧录的操作一样(参考:[https://d1.docs.aw-ol.com/study/study_4compile/#pc2](https://d1.docs.aw-ol.com/study/study_4compile/#pc2)) 如果进入boot成功,就会有如下log,这时就可以在串口对设备进行DTS修改操作。 (详细log如下)
阿志小管家
2024/02/02
3820
Tina-SDK开发
Tina-SDKV2.0源码网盘链接:https://pan.baidu.com/s/13uKlqDXImmMl9cgKc41tZg?pwd=qcw7
韦东山
2024/08/24
5790
Tina-SDK开发
全志D1-H哪吒上裸机执行 rt-thread 的 rt-smart os
我属于提前批拿到哪吒开发板的,兴奋之余开始研究如何去运行自己的裸机程序,美其名曰:操作系统.
阿志小管家
2024/02/02
3190
100ASK百问网 全志D1s/T113-s3开发板 适配ov5640教程
本实验采用百问网的100ASK_T113-PRO Base V1.1 , D1s也可以参考进行修改并适配。 本实验所需的文件(含tina根文件系统、SD镜像、设备树、内核配置文件)供大家对比参考:source.zip
阿志小管家
2024/02/02
8580
100ASK百问网 全志D1s/T113-s3开发板 适配ov5640教程
使用基于全志D1-H的LicheeRV的 86 Panel 与 Tina BSP 实现 RGB 与 SPI 双屏显示
Tina 提供了2种 SPI TFT 显示屏的驱动方式。第一种是官方推荐的 fbdev 方式,使用 Framebuffer implementaion without display hardware of AW 进行 SPI屏幕的驱动。另外一种是使用 fbtft 进行 SPI 屏幕驱动。 fbdev 方式由于 pinctrl 在新内核中调用方式出现修改,所以暂时无法使用。修改难度较大。fbtft 虽然官方wiki表明不建议在 Linux 5.4 中使用,但是其实也是可以使用的,只需要修改一下 GPIO 的注册方式就行。
阿志小管家
2024/02/02
3560
使用基于全志D1-H的LicheeRV的 86 Panel 与 Tina BSP 实现 RGB 与 SPI 双屏显示
使用全志F1C200S TINA3.5 spinand来烧写固件几个常见问题的解决方法
使用F1C200S TINA3.5 SPINAND 在windows下的PhoenixSuit V1.19烧写固件,现象是: 1,空的nand第一次似乎提示烧写成功,但启动失败。 2,第二次以及之后的烧写就会失败。 3,配置以及按照官方nor切换nand的指南进行修改配置了。 4,板子换了全新空白nand 上去,也是一样的现象。 5,以下是第一次和第二次两次烧录的日志输出。
阿志小管家
2024/02/02
7910
全志V851S开发版无法正常挂载TF卡,sdc0、sdc1报错
硬件设备及镜像 主板为:Yuzuki Lizard V851S开发板 宿主机环境:ubuntu 22.04 SDK版本:Yuzukilizard的github上的Docker镜像 img为:github上Yuzukilizard释放的镜像:[01]v851s_linux_lizard_uart0_2022_12_29.img v851s_linux_lizard_uart0_2022_12_29.img
阿志小管家
2024/02/02
4030
全志 Tina Linux 系统资源配置 开发指南 支持百问网T113 D1-H哪吒 DongshanPI-D1s V853-Pro等开发板
Tina Linux SDK的根目录下,执行make menuconfig命令可进入Tina Linux的配置界面。
韦东山
2022/12/28
9.5K0
全志 Tina Linux 系统资源配置 开发指南 支持百问网T113 D1-H哪吒 DongshanPI-D1s V853-Pro等开发板
推荐阅读
相关推荐
Tina R329 swupdate OTA升级步骤
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验