文章目录

  • 1,FastDFS 介绍
  • 2,FastDFS 架构
  • 3,FastDFS 工作流程

1,FastDFS 介绍

FastDFS 是一个 C 语言实现的开源轻量级分布式文件系统,作者余庆(happyfish100),支持 Linux、FreeBSD、AID 等 Unix 系统,解决了大数据存储和读写负载均衡等问题,适合存储 4KB~500MB 之间的小文件,如图片网站、短视频网站、文档、app 下载站等,UC、京东、支付宝、迅雷、酷狗等都有使用,其中 UC 基于 FastDFS 向用户提供网盘、广告和应用下载的业务的存储服务 FastDFS 与 MogileFS、HDFS、TFS 等都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。

使用FastDFS分布式文件系统目的:

  1. 海量存储,存储用量方便扩展
  2. 文件指纹,有高重复使用性
  3. 结合Nginx提高网站访问效率

2,FastDFS 架构

FastDFS服务有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)

tracker server: 跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server 和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳, Tracker根据storage心跳信息,建立group—>[storage server list]的映射表;tracker管理的元数据很少,会直接存放在内存;tracker 上的元信息都是由 storage 汇报的信息生成的,本身不需要持久化任何数据,tracker 之间是对等关系,因此扩展 tracker 服务非常容易,之间增加 tracker服务器即可,所有tracker都接受stroage心跳信息,生成元数据信息来提供读写服务(与 其他 Master-Slave 架构的优势是没有单点,tracker 也不会成为瓶颈,最终数据是和一个可用的 Storage Server进行传输的)

storage server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以包含多台storage server,数据互为备份,存储容量空间以group内容量最小的storage为准;建 议group内的storage server配置相同;以group为单位组织存储能够方便的进行应用隔离、负载均衡和副本数定制;缺点是 group 的容量受单机存储容量的限制,同时 group 内机器坏掉,数据 恢复只能依赖 group 内其他机器重新同步(坏盘替换,重新挂载重启 fdfs_storaged 即可)

多个group之间的存储方式有3种策略:round robin(轮询)、load balance(选择最大剩余空 间的组上传文件)、specify group(指定group上传)

group 中 storage 存储依赖本地文件系统,storage 可配置多个数据存储目录,磁盘不做 raid, 直接分别挂载到多个目录,将这些目录配置为 storage 的数据目录即可
storage 接受写请求时,会根据配置好的规则,选择其中一个存储目录来存储文件;为避免单 个目录下的文件过多,storage 第一次启时,会在每个数据存储目录里创建 2 级子目录,每级 256 个,总共 65536 个,新写的文件会以 hash 的方式被路由到其中某个子目录下,然后将文件数据直 接作为一个本地文件存储到该目录中

总结:1.高可靠性:无单点故障 2.高吞吐性:只要Group足够多,数据流量是足够分散的

3,FastDFS 工作流程

上传
FastDFS 提供基本的文件访问接口,如 upload、download、append、delete 等

选择tracker server
集群中 tracker 之间是对等关系,客户端在上传文件时可用任意选择一个 tracker

选择存储 group
当tracker接收到upload file的请求时,会为该文件分配一个可以存储文件的group,目前支持选择 group 的规则为:

  1. Round robin,所有 group 轮询使用
  2. Specified group,指定某个确定的 group
  3. Load balance,剩余存储空间较多的 group 优先

选择storage server
当选定group后,tracker会在group内选择一个storage server给客户端,目前支持选择server 的规则为:
4. Round robin,所有 server 轮询使用(默认)
5. 根据IP地址进行排序选择第一个服务器(IP地址最小者)
6. 根据优先级进行排序(上传优先级由storage server来设置,参数为upload_priority)
选择storage path(磁盘或者挂载点)

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

  1. round robin,轮询(默认)
  2. load balance,选择使用剩余空间最大的存储路径
    选择下载服务器

目前支持的规则为:

  1. 轮询方式,可以下载当前文件的任一storage server
  2. 从源storage server下载

生成 file_id
选择存储目录后,storage 会生成一个 file_id,采用 Base64 编码,包含字段包括:storage server ip、文件创建时间、文件大小、文件 CRC32 校验码和随机数;每个存储目录下有两个 256*256 个子目录,storage 会按文件 file_id 进行两次 hash,路由到其中一个子目录,然后将文件以 file_id 为文件名存储到该子目录下,最后生成文件路径:group 名称、虚拟磁盘路径、数据两级目录、file_id

其中,
组名:文件上传后所在的存储组的名称,在文件上传成功后由存储服务器返回,需要客户端自行保存
虚拟磁盘路径:存储服务器配置的虚拟路径,与磁盘选项 store_path*参数对应
数据两级目录:存储服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件

同步机制

  1. 新增tracker服务器数据同步问题
    由于 storage server 上配置了所有的 tracker server. storage server 和 trackerserver 之间的通信是由 storage server 主动发起的,storage server 为每个 tracker server 启动一个线程进行通信;在通信过程中,若发现该 tracker server 返回的本组 storage server列表比本机记录少,就会将该tracker server上没有的storage server 同步给该 tracker,这样的机制使得 tracker 之间是对等关系,数据保持一致

  2. 新增storage服务器数据同步问题
    若新增storage server或者其状态发生变化,tracker server都会将storage server列表同步给该组内所有 storage server;以新增 storage server 为例,因为新加入的 storage server 会主动连接 tracker server,tracker server 发现有新的 storage server 加入,就会将该组内所有的 storage server 返回给新加入的 storage server,并重新将该组的storage server列表返回给该组内的其他storage server;

  3. 组内storage数据同步问题
    组内storage server之间是对等的,文件上传、删除等操作可以在组内任意一台storageserver 上进行。文件同步只能在同组内的 storage server 之间进行,采用 push 方式, 即源服务器同步到目标服务器
    A. 只在同组内的storage server之间进行同步
    B. 源数据才需要同步,备份数据不再同步
    C. 特例:新增storage server时,由其中一台将已有所有数据(包括源数据和备份数据)同步到新增服务器

storage server的7种状态:
通过命令 fdfs_monitor /etc/fdfs/client.conf 可以查看 ip_addr 选项显示 storage server 当前状态
INIT : 初始化,尚未得到同步已有数据的源服务器
WAIT_SYNC : 等待同步,已得到同步已有数据的源服务器
SYNCING : 同步中
DELETED : 已删除,该服务器从本组中摘除
OFFLINE :离线
ONLINE : 在线,尚不能提供服务
ACTIVE : 在线,可以提供服务

组内增加storage serverA状态变化过程:

  1. storage server A 主动连接 tracker server,此时 tracker server 将 storageserverA 状态设置为 INIT
  2. storage server A 向 tracker server 询问追加同步的源服务器和追加同步截止时间点(当前时间),若组内只有storage server A或者上传文件数为0,则告诉新机器不需要数据同步,storage server A 状态设置为 ONLINE ;若组内没有 active 状态机器,就返回错误给新机器,新机器睡眠尝试;否则 tracker 将其状态设置为 WAIT_SYNC
  3. 假如分配了 storage server B 为同步源服务器和截至时间点,那么 storage server B会将截至时间点之前的所有数据同步给storage server A,并请求tracker设置 storage server A 状态为SYNCING;到了截至时间点后,storage server B向storage server A 的同步将由追加同步切换为正常 binlog 增量同步,当取不到更多的 binlog 时,请求tracker将storage server A设置为OFFLINE状态,此时源同步完成
  4. storage server B 向 storage server A 同步完所有数据,暂时没有数据要同步时, storage server B请求tracker server将storage server A的状态设置为ONLINE
  5. 当 storage server A 向 tracker server 发起心跳时,tracker sercer 将其状态更改为 ACTIVE,之后就是增量同步(binlog)

注释:
1.整个源同步过程是源机器启动一个同步线程,将数据 push 到新机器,最大达到一个磁盘的 IO,不能并发
2.由于源同步截止条件是取不到 binlog,系统繁忙,不断有新数据写入的情况,将会导致一直无法完成源同步过程

下载
client 发送下载请求给某个 tracker,必须带上文件名信息,tracker 从文件名中解析出文件的 group、大小、创建时间等信息,然后为该请求选择一个 storage 用于读请求;由于 group 内的文件同步在后台是异步进行的,可能出现文件没有同步到其他storage server上或者延迟的问题, 后面我们在使用 nginx_fastdfs_module 模块可以很好解决这一问题


文件合并原理
小文件合并存储主要解决的问题:

  1. 本地文件系统inode数量有限,存储小文件的数量受到限制
  2. 多级目录+目录里很多文件,导致访问文件的开销很大(可能导致很多次IO)
  3. 按小文件存储,备份和恢复效率低

FastDFS 提供合并存储功能,默认创建的大文件为 64MB,然后在该大文件中存储很多小文件; 大文件中容纳一个小文件的空间称作一个 Slot,规定 Slot 最小值为 256 字节,最大为 16MB,即小于 256 字节的文件也要占用 256 字节,超过 16MB 的文件独立存储;

为了支持文件合并机制,FastDFS生成的文件file_id需要额外增加16个字节;每个trunk file 由一个id唯一标识,trunk file由group内的trunk server负责创建(trunk server是tracker 选出来的),并同步到group内其他的storage,文件存储合并存储到trunk file后,根据其文件偏移量就能从trunk file中读取文件

FastDFS原理及工作流程相关推荐

  1. k8s创建pod加入容器_K8S架构原理及其工作流程

    K8S 容器编排系统 容器编排系统需要满足的条件: 服务注册,服务发现 负载均衡 配置.存储管理 健康检查 自动扩缩容 零宕机 K8S整体架构图 K8S整体架构 Kubernetes采用主从分布式架构 ...

  2. redux的原理、工作流程及其应用

    redux的原理.工作流程及其使用 Redux对于JavaScript应用而言是一个可预测状态的容器.换言之,它是一个应用数据流框架,而不是传统的像underscore.js或者AngularJs那样 ...

  3. mybatis+springMVC+spring原理及工作流程

    做自己没做过的事情叫做成长 做自己不愿做的事情叫做改变 做自己不敢做的事情叫做突破 共勉 引言 本人在学习ssm中,已经能熟练的编写配置文件与代码了.但于前几天朋友问其原理与工作流程时却只能答出一二, ...

  4. ceph原理及工作流程浅析

    ceph工作原理及工作流程浅析 其命名和UCSC(Ceph诞生地)的吉祥物有关,这个吉祥物是"Sammy",一个香蕉色的蛞蝓,就是头足类中无壳的软体动物.这些有多触角的头足类动物, ...

  5. 【SEO学习】第一步:了解搜索引擎基本工作原理和工作流程

    我们常用的搜索引擎一般都是百度.谷歌.搜狗.360.bing这五种,对于搜索引擎的原理和工作流程应该是一样的.今天郑州SEO老冯先给大家说一下百度搜索引擎的工作原理以及抓取过程.这是SEO学习的第一步 ...

  6. mybatis 原理_Mybatis工作流程及其原理与解析

    Mybatis简介: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  7. Struts2的工作原理及工作流程

    众所周知,Struts2是个非常优秀的开源框架,我们能用Struts2框架进行开发,同时能 快速搭建好一个Struts2框架,但我们是否能把Struts2框架的工作原理用语言表达清楚,你表达的原理不需 ...

  8. DLP投影机投影技术之成像原理与工作流程

    DLP是数字光处理(Digital Light Processing)的缩写,是一项使用于投影仪和背投电视中的显像技术. DLP投影仪成像原理         DLP投影仪的成像原理是将通过UHP灯泡 ...

  9. Redux原理及工作流程

    Redux 是什么,如何用? 工作流程 场景演示 代码演示 Store Action Reducer Connect 要点 安装 使用场景 Redux 是 JavaScript 状态容器,提供可预测化 ...

  10. 机械工业品电商平台后台开发(一):项目简介及SpringMVC工作原理(工作流程)介绍

    学校的项目实训开始了,我选的题目是"机械工业品电商平台",看题目就知道需求还是比较明确的,就是一个电商平台嘛!下面是我们这个项目的功能框架: 因为时间只有二十多天,所以这其中的移动 ...

最新文章

  1. 这一行代码,很有温度!
  2. DBScript:轻量级ORM
  3. html制作水晶状态导航栏,HTML5 CSS3水晶风格的页面头部
  4. SQL语句之Insert
  5. numpy方法读取加载mnist数据集
  6. oracle 删除重复记录
  7. 不均衡数据集采样1——SMOTE算法(过采样)
  8. VMware 修复多款产品中的高危漏洞
  9. class反编译成java_Java黑科技之源:JVMTI完全解读
  10. 实验3-1 求一元二次方程的根 (20 分)
  11. 线程池(ThreadPoolExecutor ) 的 创建、关闭、监控
  12. 房屋出租系统(Java实现-命令行练习版)
  13. 静默安装android,Android静默安装
  14. 【华人学者风采】聂飞平 西北工业大学
  15. python有颜色进度条库_来看看Python炫酷的颜色输出与进度条打印
  16. 个人github地址 https://github.com/Gerry1218
  17. 光纤布线系统的设计与检测(二)
  18. Flask 蓝图 Blueprint
  19. Unity 通用弹出框
  20. NLP 1st (导入)

热门文章

  1. 转载 :Labview和G语言
  2. NS3:FlowMonitor设计讲解
  3. 网易数帆、云音乐、Intel、有赞最新大数据实践(PPT下载+视频回放)
  4. 有什么软件可以快速测试到苹果,苹果官方App测试工具TestFlight
  5. 小米手机MIUI功能测试代码
  6. Fiddler:安卓抓包配置
  7. TCPIP调试助手及源代码
  8. Ubuntu打印到pdf文件
  9. GD32F103串口DMA收发
  10. python脚本实现QQ自动发送消息