本文主要介绍fastdfs客户端的上传下载原理以及以及服务端的网络io模型;主要介绍storage,不涉及tracker;storage和tracker使用的网络io模型是一样的。

协议格式

FastDFS采用二进制TCP通信协议。一个数据包由 包头(header)和包体(body)组成。client、tacker、storage之间通信的消息格式,都是这样的。

包头只有10个字节,格式如下:

@ pkg_len:8字节整数,body长度,不包含header,只是body的长度

@ cmd:1字节整数,命令码; 比如上传,下载等;不同的命令,对应的body内容不同

@ status:1字节整数,状态码,0表示成功,非0失败(UNIX错误码)

// tracker\tracker_proto.h TrackerHeadertypedef struct
{char pkg_len[FDFS_PROTO_PKG_LEN_SIZE];  //body length, not including headerchar cmd;    //command codechar status; //status code for response
} TrackerHeader;

以STORAGE_PROTO_CMD_UPLOAD_FILE,上传普通文件为例,数据包定义如下:

客户端上传原理

fastdfs提供命令进行上传文件操作:

fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]

客户端上传文件流程如下:

stat获取文件的状态、大小等

上传文件,肯定是要判断是否是一个常规文件;并且需要获取文件的大小的。通过linux系统提供的stat函数就可以得到,跟使用stat命令是一样的。

storage_do_upload_file

发送静态资源文件的时候,需要先将文件读入内存,再将内存中的数据send到相应的网络fd。通过使用sendfile完成文件的发送,不再需要两步操作。

sendfile使用mmap,实现零拷贝;

零拷贝,使用的是mmap方式,本质是DMA的方式,不需要CPU参与。普通copy,从磁盘copy数据到内存,需要CPU的move指令。

在进程中有一块区域叫内存分配区,当调用mmap的时候,会把文件映射到对应的区域,操作文件就跟操作内存一样。

fastdfs提供的客户端fdfs_upload_file是通过文件的方式上传,其实fastdfs也可以支持内存方式上传;我们在云盘项目中,就自己参考fastdfs的协议,实现了内存方式上传,减少了保存本地磁盘文件的过程。

发送完文件后,等待服务端返回响应;包含group_name, remote_file_name。

断点续传

fastdfs支持断点续传

先使用命令操作

echo hello > test1.txt
echo world > test2.txt
echo cong > test3.txt# 先使用fdfs_upload_appender上传 test1.txt
fdfs_upload_appender /etc/fdfs/client.conf test1.txt
得到:group1/M00/00/00/CqgWMGIgcUiEPsHJAAAAADY6MCA314.txt ,在fdfs_append_file的时候需要# 接着续传 test2.txt
fdfs_append_file /etc/fdfs/client.conf group1/M00/00/00/CqgWMGIgcUiEPsHJAAAAADY6MCA314.txt test2.txt# 接着续传 test3.txt
fdfs_append_file /etc/fdfs/client.conf group1/M00/00/00/CqgWMGIgcUiEPsHJAAAAADY6MCA314.txt test3.txt# 在服务器相应的目录下查找对应的文件,用cat读取文件内容。
root@4af22fda6f4b:/home/fastdfs/storage/data/00/00# cat CqgWMGIgcUiEPsHJAAAAADY6MCA314.txt
hello
world
cong

断点续传文件分为两个阶段:

  1. fdfs_upload_appender 上传第一部分文件,STORAGE_PROTO_CMD_UPLOAD_APPENDER_FILE命令;
  2. fdfs_append_file 上传其他部分的文件,以STORAGE_PROTO_CMD_APPEND_FILE命令。

需要注意:

  • 注意断点续传的顺序性;
  • 支持断点续传,但fastdfs并不支持多线程分片上传同一个文件。

客户端下载原理

fastdfs下载协议如下:

客户端下载流程如下:

下载的时候也支持三种接收方式:

  • FDFS_DOWNLOAD_TO_FILE:storage_do_download_file1_ex

  • FDFS_DOWNLOAD_TO_BUFF:storage_download_file1

  • FDFS_DOWNLOAD_TO_CALLBACK:storage_download_file_ex

fastdfs支持多线程下载, 因为协议支持file_offset和download_bytes; 可以指定每一个线程现在的起始位置和大小。

如果服务端是对单个连接进行限速,那么客户端使用多线程下载可以提升下载速度;如果服务端是对用户名或者ip进行限速,客户端多线程下载效果也不明显。

网络io模型

fastdfs网络io使用的是多reactor的模型;分为accept线程,work线程,dio线程;这样设计的优点:

  • 将网络io和磁盘io解耦;
  • 扩充磁盘的时候,方便定义文件读写线程数量

accept线程接收网络连接,并将连接分配给work线程处理;通过pipe将连接发送给work线程;

work线程处理io请求;每个work线程都有一个epoll;如果需要进行磁盘io操作,则将任务push到队列中,交给dio线程处理;

dio线程进行磁盘io操作,从队列里面取任务;并通过pipe向work线程发送消息。

网络io简单处理流程如下图:

fastdfs具体的io处理如下:

线程进行磁盘io操作,从队列里面取任务;并通过pipe向work线程发送消息。

网络io简单处理流程如下图:

[外链图片转存中…(img-25s6udTD-1647335339614)]

fastdfs具体的io处理如下:

[外链图片转存中…(img-HST0uKy0-1647335339615)]

fastdfs存储原理相关推荐

  1. 分布式FastDFS存储原理2

    框架 数据流程 FastDFS文件同步 连接tracker有独立的线程(tracker_report_thread_entrance),连接n个tracker就有n个线程:一个group里面又n个st ...

  2. FastDFS合并存储原理分析

    FastDFS合并存储原理分析 基于FastDFS 5.03/5.04 2014-12-03 一.合并存储简介 在处理海量小文件问题上,文件系统处理性能会受到显著的影响,在读写次数与吞吐量这两个指标上 ...

  3. CV:计算机视觉技术之图像基础知识(二)—以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础)

    CV:计算机视觉技术之图像基础知识(二)-以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础) 目录 ...

  4. java浮点数原理,浮点型数据存储原理

    进制基础 1.十进制:逢十进一 基数:10 权:    10^n 科学计数:527=5*10^2+2*10^1+7*10^0 2.二进制:逢二进一 基数:2 权:    2^n 转十进制:110(2) ...

  5. CRM One Order Appointment里start Date的存储原理

    本文介绍CRM One Order Appointment里start Date的存储原理 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  6. Git 存储原理及相关实现

    Git 是目前最流行的版本控制系统,从本地开发到生产部署,我们每天都在使用 Git 进行我们的版本控制,除了日常使用的命令之外,如果想要对 Git 有更深一步的了解,那么研究下 Git 的底层存储原理 ...

  7. java 整数变负数_一文帮你读懂Java整数的存储原理

    前言 大家应该都知道,整数包括负数,零,和正数.在Java中,基本类型中byte(8位).short(16位).int(32位).long(64位)属于整数,并且没有无符号数,均是有符号的.对于计算机 ...

  8. JPEG/Exif/TIFF格式解读(1):JEPG图片压缩与存储原理分析

    JPEG文件简介 JPEG的全称是JointPhotographicExpertsGroup(联合图像专家小组),它是一种常用的图像存储格式, jpg/jpeg是24位的图像文件格式,也是一种高效率的 ...

  9. 基于闪存存储原理的U盘数据安全测试和U盘数据保护软件

    第一章 摘要 Flash Memory是一种长寿命的非易失性存储介质,其存储原理存在诸多漏洞.其中最为严重的则为写入次数上限.而以闪存作为存储介质的U盘是否会因闪存的存储缺陷而成为不安全的存储设备,这 ...

最新文章

  1. Android自定义视图四:定制onMeasure强制显示为方形
  2. My interested stuff(2008-07-10)
  3. JavaScript window.getComputedStyle()
  4. C++学习成长的四个层次
  5. 接口使用jwt返回token_JWT实现token验证
  6. ​边缘计算架构如何融合视频编码与存储
  7. AUTOSAR从入门到精通100讲(六)-AUTOSAR中的PostBuild Data Set Generation Phase
  8. (原创)c#学习笔记06--函数02--变量的作用域01--其他结构中变量的作用域
  9. java容器源码实战——vector
  10. 符号_液压图形符号识别之流量控制阀符号原理
  11. 天梯赛L2-10:排座位
  12. MTK手机 获取 Serial Number(barcode)
  13. php怎么显示好看的字体颜色,网页中字体颜色设置方法的总结
  14. matplotlib plot画图不弹框
  15. 名帖110 董其昌 小楷《五经一论册》
  16. 墙后的全部姿势,全被“瞎眼”AI透视
  17. 了解什么是用户留存率
  18. 什么是EEPROM?和ROM有区别吗?//2021-2-18
  19. 人工智能-概述:数据分析---->人工智能【机器学习----->深度学习】
  20. 6岁男孩向他们敬礼2分钟,夏日炎炎,你们都辛苦了!

热门文章

  1. VScode注释中文时乱码怎么办?VScode中文注释乱码问题的解决方法
  2. papaparse 使用_javascript – 如何使用Papa Parse从CSV文件中提取数据到React状态?
  3. java右移位_java移位运算符详解
  4. u盘安装win10系统1(通过MediaCreationTool制作WIN10系统安装U盘)
  5. 2.4gwifi能跑满100m宽带吗_我的宽带是100兆,2.4g的路由器可以完全发挥出来吗,要用5g的吗?...
  6. Xcode常见编译失败问题解决方案
  7. WPF中TextBox更改完了之后进行操作
  8. Matlab深度学习入门实例:基于AlexNet的红绿灯识别(附完整代码)
  9. VB代码实现屏幕截图(Screenshot功能)
  10. Centos7 使用rsync 实现多服务器文件同步