FastDFS是什么

  1. FastDFS是使用c语言编写的开源高性能分布式文件系统

  2. 是由淘宝开发平台部资深架构师余庆开发,FastDFS孵化平台板块

  3. 他对文件进行管理,功能包括文件存储,文件同步,文件访问等,解决了大容量存储和负载均衡的问题

  4. 特别适合文件载体的在线服务,如相册网站,视频网站,电商网站,特别适合中小文件(4km<fileseize<500M)为载体的在线服务。

  5. FastDFS为互联网量身定制,充分考虑了冗余备份,负载均衡,在线扩容等级制,并注重高可用,高性能等指标,FastDFS很容易搭建一套高性能的文件服务集群提供文件上传,下载等,

FastDFS实现原理

FastDFS系统分为三个角色,跟踪服务器(tracker server),存储服务器(storage server),客户端(client).

Tracker Server

  • 主要协调调用工作,并对Storage Server起到负载均衡的作用

  • 负责管理所有的storage server 和group,每个storage server 启动之后会链接Tracker,告知自己所属group等信息,并保持周期性心跳。

  • Tracker Server可以有多台,Tracker Server之间是相互平等,不存在单点故障,客户端请求tracker server 采用轮询的方式,如果请求Tracker server 无法提供服务,则换另外一台

Storage Server

  • 主要提供容量和备份服务

  • 以group为单位,每一个group里有多个storage server,数据互为备份,各个group互相独立.

  • 采用分组存储方式的好处是灵活和可控性强,比如上传文件,可以有客户端指定,也可以有tracker进行调度选择。

  • 一个组的存储压力过大,可以在改组增加存储服务器扩充服务能力,当容量不足时,可以增加组扩充容量。

Client

  • 上传下载的数据服务器,也就是我们部署的服务器。

存储策略

为了支持大容量,存储节点采用分组的组织方式,存储系统由一个或多个组组成,组与组之间文件相互独立,所有组加起来就是存储系统的容量,一个组可以有一个或多个存储服务器组成,一个组下的存储服务器的文件都是相同的,组中的多台服务器起到了冗余备份和负载均衡的作用
在组中新增加服务器时,同步已有的文件由系统自动完成,同步完成,系统将自动将新增服务器切换到线上提供服务,当存储空间不足或消耗完时,可以动态加组,只需要增加一台或者多台服务,并将它们配置成一个新组,这样就扩大了存储系统的容量。

Storage状态收集

Storage server会通过配置链接集群中所有的tracker server,定时向它们报告状态,包括磁盘空间,文件同步状态,文件上传下载次数等统计信息

storage server 的7个状态

FDFS_STORAGE_STATUS_INIT:初始化,尚未得到同步已有数据的源服务器 
FDFS_STORAGE_STATUS_WAIT_SYNC:等待同步,已得到同步已有数据的源服务器 
FDFS_STORAGE_STATUS_SYNCING:同步中
FDFS_STORAGE_STATUS_DELETED:已删除,该服务器从本组中摘除(注:本状态的功能尚未实现) FDFS_STORAGE_STATUS_OFFLINE:离线
FDFS_STORAGE_STATUS_ONLINE:在线,尚不能提供服务
FDFS_STORAGE_STATUS_ACTIVE:在线,可以提供服务

当storage的状态是在线的时候,会向tracker发送心跳,tracekr server 会将其的状态改成,在线可以提供服务

文件上传流程分析

1.tracker server 收集storage server 的状态信息

storage server 定时向tracker server(可以多个)发送磁盘剩余空间,文件同步状况,文件上传下载次数等信息storage server 会链接整个集群中所有的tracker server ,向他们发送自己的状态。

2.选择tracker server

当集群中不止一个tracker server时,由于tracker server是对等的,客户端在upload文件可以任意选择一个tracker 3.选择存储group  当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则

  • 所有group轮询

  • 指定某一个确定的group

  • 选择空间多的group

4.选择storage server

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

  • 在group中storage轮询

  • 按ip排序选择

  • 按优先级选择,可配置

5.选择storage path

当分配好storage server后,客户端将向storage发送写文件请求,storage将会分配一个存储目录,支持如下规则(在storage配置文件可以通过storage-path*,可以设置多个)

  • 多个存储目录轮询

  • 剩余空间最多优先

6.生成文件名

选定文件存储目录之后,storage会为文件生成一个文件名称,由源storeage server ip ,文件创建时间,文件大小,文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可以打印的字符串7.选择两级目录当选定存储目录之后,storage会为文件分配一个file id,每个存储目录下有两级256*256的子目录,storage会按文件名称进行两次hash,路由到其中一个目录,然后将文件filedid为文件名存储在改子目录下

8.生成fileid

当文件存储到某个目录后,即认为文件存储成功,接下来就会为改文件生成一个文件id,文件id,有group,存储目录,两级目录,文件名,文件后缀名拼接而成。

文件同步分析

写文件时,客户端将文件写到group的一个storage server 即认为文件写入成功,storage server 写完文件后,会由后台线程将文件同步到同group的storage server

每个storage 写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名信息,这份binlog用于同步,storage会记录group内其他storage同步的进度,以便重启之后接上次的进度继续同步,进度以时间戳的方式记录,所以最好把集群内所有server的时钟保持同步。

storeage的同步进度会作为元数据的一部分汇报到tracker上,tacker在选择读storage的时候会已同步进度作为参考。比如

比如一个group内有A、B、C三个storage server,A向C同步到进度为T1 (T1以前写的文件都已经同步到B上 了),B向C同步到时间戳为T2(T2 > T1),tracker接收到这些同步进度信息时,就会进行整理,将最小的那 个做为C的同步时间戳,本例中T1即为C的同步时间戳为T1(即所有T1以前写的数据都已经同步到C上了);同理,根据上述规则,tracker会为A、B生成一个同步时间戳

文件下载流程分析

1.tracker server收集storage server 的状态信息

  • storage server 定时向tracker server 发送磁盘空间,文件同步状况,文件上传下载次数信息等。

  • storage server 会连接整个集群tracker servere ,向它们报告状态

2.选择tacker server 

  • 和上传文件一样,任意选择

3.选择可用的storage server

客户端下载download请求给某个tracker ,必须带上传文件名信息,tracker会从文件名中解析group,路径信息,文件大小,创建时间,源storage server ip等信息,然后请求选择一个storage用来服务器读请求

由于group同步是后台的一个异步线程进行,所以有可能出现在读的时候,文件还没有同步,为了避免这种情况,tacker 会安装如下规则选择group可读的storage server.

  • 该文件上传到的源storage,只要源stroage只要存活,肯定包含这个文件,源头的地址被编码在文件名中

  • 文件创建的时间即storage被同步到的时间戳,且当前时间-文件创建时间>文件同步最大时间,即文件同步后,认为经过最大同步时间后,文件肯定存在

  • 文件创建时间<文件同步时间戳,即文件同步时间戳之前的文件确定已经同步

  • 当前时间-文件创建时间戳>同步延迟阀值,即经过同步延迟阀值,认为文件肯定同步了

新增storage server

组内新增一台storage server A时,由系统自动完成已有数据同步,处理逻辑如下

1.storage server A连 接tracker server,tracker server将storage server A的状态设置为 FDFS_STORAGE_STATUS_INIT 。storage server A询问追加同步的源服务器和追加同步截至时间点,如果该组内只有storage server A或该组内已成功上传 的文件数为0,则没有数据需要同步,storage server A就可以提供在线服务,此时tracker将其状态设置为FDFS_STORAGE_STATUS_ONLINE,否则tracker server将其状态设置为FDFS_STORAGE_STATUS_WAIT_SYNC, 进入第二步的处理.2.假设tracker server 分配storage server A 同步已有数据源storage server 为B ,同组storage server 和tracker server 通讯得知新增storage server A,将启动同步线程,并向trakcer server询问storeage server A追加同步的源服务器和时间戳,storage server B将把时间戳之前的数据同步给storage server A,而其余的storage server 从截止时间点之后进行正常同步,只把源头数据同步给storage server A,到了截止时间点之后,storage server B对storage server A的同步由追加同步改成正常同步,只同步源头数据.
3.storage server B向storage server A同步完所有数据,暂没有数据同步时,storage server B请求tracker server将storage server 状态设置为FDFS_STORAGE_STATUS_ONLINE.

4.当storage server A向tracker server发起心跳,tracker server 将其改成FDFS_STORAGE_STATUS_ACTIE

FastDFS是使用c语言编写的开源高性能分布式文件系统的更多相关文章

  1. 高可用高性能分布式文件系统FastDFS实践Java程序

    在前篇 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备 中已介绍搭建高可用的分布式文件系统架构. 那怎么在程序中调用,其实网上有很多栗子, ...

  2. 【FastDFS】如何打造一款高可用的分布式文件系统?这次我明白了!!

    写在前面 前面我们学习了如何基于两台服务器搭建FastDFS环境,而往往在生产环境中,需要FastDFS做到高可用,那如何基于FastDFS打造一款高可用的分布式文件系统呢?别急,今天,我们就一起来基 ...

  3. 开源轻量级分布式文件系统--FastDFS

    FastDFS一个高效的分布式文件系统 分布式文件系统FastDFS原理介绍 分布式文件系统FastDFS设计原理 FastDFS安装.配置.部署(一)-安装和部署 分布式文件系统 - FastDFS ...

  4. 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备

    在上一篇 分布式文件系统FastDFS如何做到高可用 中已经介绍了FastDFS的原理和怎么搭建一个简单的高可用的分布式文件系统及怎么访问. 高可用是实现了,但由于我们只设置了一个group,如果现在 ...

  5. Rhino 是一个完全使用Java语言编写的开源JavaScript实现。Rhino通常用于在Java程序中,为最终用户提供脚本化能力。它被作为J2SE 6上的默认Java脚本化引擎。

    https://developer.mozilla.org/zh-CN/docs/Mozilla/Projects/Rhino

  6. 分布式文件系统 - FastDFS 简单了解一下

    别问我在哪里 也许我早已不是我自己,别问我在哪里,我一直在这里. 突然不知道说些什么了... 初识 FastDFS 记得那是我刚毕业后进入的第一家公司,一个技术小白进入到当时的项目组后,在开发中上传用 ...

  7. 分布式文件系统 - FastDFS

    分布式文件系统 - FastDFS 别问我在哪里 也许我早已不是我自己,别问我在哪里,我一直在这里. 突然不知道说些什么了... 初识 FastDFS 记得那是我刚毕业后进入的第一家公司,一个技术小白 ...

  8. FastDFS轻量级分布式文件系统部署

    FastDFS介绍 FastDFS 是一个由 C 语言实现的开源轻量级分布式文件系统,作者余庆,支持 Linux.FreeBSD.AID 等 Unix 系统,解决了大数据存储和读写负载均衡等问题,适合 ...

  9. FastDFS是纯C语言实现,只支持Linux,适合以中小文件为载体的在线服务,还可以冗余备份和负载均衡

    一.理论基础 FastDFS比较适合以中小文件为载体的在线服务,比如跟NGINX(APACHE)配合搭建图片服务器. 分布式文件系统FastDFS FastDFS是纯C语言实现,只支持Linux.Fr ...

随机推荐

  1. javascript中的设计模式

    什么是设计模式 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. ...

  2. 如何基于 String 实现同步锁?

    如何基于String实现同步锁? 在某些时候,我们可能想基于字符串做一些事情,比如:针对同一用户的并发同步操作,使用锁字符串的方式实现比较合理. 因为只有在相同字符串的情况下,并发操作才是不被允许的. ...

  3. [Azure DevOps] 如何使用任务组

    1. 使用 PowerShell 脚本 在上一篇文章中我们学会了怎么使用扩展在编译前实时更改版本号.有些情况下我们希望不适用扩展,例如喜欢发明轮子,或者根本没有安装扩展的权限.这时候我们可以自己写 P ...

  4. 手写Spring Config,最终一战,来瞅瞅撒!

    上一篇说到了手写Spring AOP,来进行功能的增强,下面本篇内容主要是手写Spring Config.通过配置的方式来使用Spring 前面内容链接: 我自横刀向天笑,手写Spring IOC容器 ...

  5. SqlServer的order by问题

    如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中.这是我昨天写sql的时候遇到的,主要是因为最近在做一个数据库的迁移与更换,原来MySQL的数据库全 ...

  6. ubuntu开机卡在/dev/sda* clean

    问题描述: ①Ubuntu通过再生龙从一台笔记本还原到另外一台笔记本(硬盘到硬盘),开机后卡在自检界面: ②备份前的笔记本为17年发布的笔记本,还原后的笔记本为2020款发布的笔记本 从网上搜了一大篇 ...

  7. 16、编译安装ansible

    16.1.python版本说明: Ansible是一种批量部署工具,现在运维人员用的最多的三种开源集中化管理工具有:puppet,saltstack,ansible,各有各的优缺点, 其中saltst ...

  8. [心得体会]RabbitMQ

    RabbitMQ是什么? 消息队列, 基于AMQP(高级消息队列), 使用Erlang语言编写, 收发消息使用 有什么用? 有什么应用场景? 1. 任务异步处理 2. 应用程序解耦 为什么使用Rabb ...

  9. SpringMvc实现批量删除,使用post传值一直报404错误

    Ajax结合SpringMVC实现批量删除信息,在前台使用post向后台传递要删除的id的集合额时候,一直报404错误, 前台post传值的源码如下: 了解一下: (1)第二行的rows为前面得到的一 ...

  10. Apache Superset 1.2.0教程 (二)——快速入门(可视化王者英雄数据)

    上一篇我们已经成功的安装了superset,那么该如何可视化我们的数据呢?本文将可视化王者英雄的数据,快速的入门Superset. 一.连接数据源 首先确保mysql可以正常连接使用,并且准备好数据. ...