1. FastDFS介绍

FastDFS( Fast Distributed file system)是一款轻量级的、高性能的、阿里巴巴开源的分布式文件系统。该系统的作者是余庆 (happyfish100),github地址:https://github.com/happyfish100 ,使用Fastdfs可以解决大规模数据存储和负载均衡问题。该文件系统主要提供了一下功能:

  • 文件存储
  • 文件同步
  • 文件访问(文件上传、下载和删除等功能)

fastdfs的设计充分考虑到了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。适合于在线的图片和视频分享的网站。

以其出色的表现,FastDFS已经在许多互联网公司得到了应用,其中包括京东、阿里巴巴、Lockbur等。

2. FastDFS架构

FastDFS文件系统结构示意图:

2.1 系统服务角色

如上图,文件系统主要分为Tracker(跟踪器)和Storage(存储节点)两种角色,且两种节点都支持单节点和多节点部署。tracker和storage中的多个节点是对等关系并无没有主从之分,所以不存在大部分分布式系统中的单点问题。

  1. tracker(跟踪器节点)
    1)控制文件访问任务的调度和访问的负载均衡。系统运行时记录中所有存储组和存储服务器的状态信息, 是客户端和数据服务器交互的纽带。
    2)tracker可以是单点和集群模式-多个tracker节点。系统运行时可以随时添加和移出tracker节点,不会影响线上服务。

  2. storage(存储节点)
    1)storage提供对文件的管理,包括文件存储、文件同步和文件访问功能,同时也提供对文件元数据(文件的属性的键值对列表)的管理,例如width=1024, 键是"width",值为 "1024".
    2)定时主动向Tracker server报告其状态信息,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息
    3)Storage支持集群模式,集群由多个group组成,而一个group由一个或者多个storage组成,这些storage具体体现为具有相同的group_name。

storage server具有以下七种状态:

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 :在线,可以提供服务

2.2 数据存储

2.2.1 存储架构

  1. 文件的存储服务是由Storage server提供。

  2. Storage集群由多个volume(卷)或称group(组)构成,volume/group之间的文件是独立的,整个系统的存储能力由这些volume/group的存储能力的总合决定。

  3. 一个volume/group可以包含一个或者多个storage节点,这些storage节点之间的数据是相同的,起到容灾备份和负载均衡等功能。当向volume/group中添加storage server,volume中的文件会被自动地复制到这个新storage server当中,当数据复制完成后,系统会把该storage server转换为上线状态提供文件服务。

  4. 当整个系统存储容量不足时,可以添加volume来扩容,文件的标识有volume名称和文件名确定。

2.2.1 数据交互

配合架构图,更好理解交互过程。

  1. 客户端上传文件

    1. client询问tracker可以把文件上传哪个storage,不需要附加参数;
    2. tracker通过负载均衡策略返回一台可用的storage信息(ip、port);
    3. client利用tracker返回的信息与storage建立完成文件上传。
  2. 客户端下载文件

    1. client询问tracker到哪个storage上去下载文件,参数为文件标识(卷名和文件名);
    2. tracker通过负载均衡策略返回一台可用的storage信息(ip、port);
    3. client利用tracker返回的信息与storage建立连接,完成文件下载。

3. 同步机制

3.1 storage server信息同步

  1. storage server信息存在于tracker server和storage之中,且两者之间的信息时相互同步的。
  2. tracker运行时会把storage server信息放在内存中,并且会把数据持久化到磁盘文件中,以免重启后数据丢失。
  3. storage会记录本组所有的storage server信息,并且也会进行持久化。
3.1.1 何时发生storage信息同步?

当新增storage server实例或者系统中的storage server状态发生变化时:

  1. storage server主动连接tracker server
  2. tracker server发现有新的storage server连接,将所在组的所有storage返回给新的storage,然后将最新的所有列表同步给组内其他storage。

当新增tracker时:

  1. storage server连接该tracker server,发现该tracker server返回的本组storage server列表比本机记录的要少,就会将该tracker server上没有的storage server同步给该tracker server。

3.2 数据同步

  1. 当上传新文件时
    前边讲到,客户端上传文件时首先会和tracker server通信,获得一个可用的storage server信息,接着与这台storage
    server进行文件上传(此时称这台服务器为源服务器),这时源服务器会将数据以push的方式同步给组内其他storage
    server(目标服务器)。数据同步按照以下规则:

    1)数据同步是发生在同一组内的所有storage server之间
    2)源头数据(client端最开始上传到系统的文件)需要同步,其他数据不需要,以免发生环路

  2. 当有新storage加入时

    由组中某一storage server将其所有的数据,同步给新storage。待同步完成后,系统将新storage server的转态转换为在线,此时该storage server可以提供服务。

因为文件同步采用的是异步的方式,所以可能会出现刚刚上传的文件client访问不到的问题

FastFDS基础的更多相关文章

  1. docker下搭建fastfds

    https://blog.csdn.net/weixin_40247263/article/details/81087726 搭建过程参考 作者 https://me.csdn.net/feng_qi ...

  2. docker下搭建fastfds集群版

    搭建过程参考 作者 https://me.csdn.net/feng_qi_1984 的课程视频 声明:集群版是在我之前写的单机版基础之上进行搭建的,我将安装了fastfds单机版的docker打包成 ...

  3. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  4. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  7. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  8. HTTPS 互联网世界的安全基础

    近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...

  9. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

随机推荐

  1. redis.conf 配置信息:读取及修改命令

    相关资源 网址 官方地址(网页中 Command + F,输入井号"#",方便查看没有注释的行) http://download.redis.io/redis-stable/red ...

  2. confluence6.3.1升级最新版本(6.15.1)

    参考自官方文档:https://www.cwiki.us/display/CONFLUENCEWIKI/Upgrading+Confluence 1,confluence6.3.1安装部署 https ...

  3. System.Object

    Object():System.Object类型的构造函数,自动调用. ~Object()/Finalize():System.Object类型的祈构函数,自动调用且不能够手动. Equals(obj ...

  4. c# 仿微信二维码生成

    /// <summary> /// 生成二维码. /// </summary> /// <param name="data">需要添加进去的文本 ...

  5. Web jsp开发学习——网上直播聊天室的简单开发

    整个界面为chat.jsp: 如果用户没有登录,就不能进行聊天. 为将发言的句子传到页面上,要设置一个<iframe></iframe>虚拟框架,将allmessage.jsp ...

  6. Scrapy学习篇(十三)之scrapy+selenum获取网站cookie并保存带本地

    参考:https://www.cnblogs.com/small-bud/p/9064674.html 和selenium登录51job的例子

  7. 内训--PPT演示技巧

    企业内训,实操,不涉及如何做PPT,仅讲解PPT播放等内容.做好PPT后,在演讲的过程中,如何使用这些功能.

  8. [mysql,2018-02-28] bat安装、启动mysql,并创建数据库、表

    @echo off f: cd F:\mysql-win32 @echo off&setlocal enabledelayedexpansion cd bin echo ###### 停止当前 ...

  9. linux 查看文件显示行号

    1.用vi或vim打开文件显示行号: 显示当前行号:  :nu 显示所有行号:  :set nu 2.设置服务器显示行号 2.1编辑~/.vimrc文件,在该文件中加入 set nu 2.2在UBUN ...

  10. idea搭spring boot项目

    Spring Boot是由Pivotal团队提供的全新框架,设计目的是用来简化新Spring应用的初始搭建以及开发过程.它主要推崇的是'消灭配置’,实现零配置. 那么,如何在idea中创建一个spri ...