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. [转]Servlet的学习之Filter过滤器技术

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

  2. Dart 学习资料

    Dart 学习资料: 学习资料 网址 Dart 编程语言中文网 http://dart.goodev.org/ Dart 官方包仓库 https://pub.dartlang.org/ 你想了解的Da ...

  3. Python日志模块logging&JSON

    日志模块的用法 json部分 先开一段测试代码:注意  str可以直接处理字典   eval可以直接将字符串转成字典的形式 dic={'key1':'value1','key2':'value2'} ...

  4. .NET自动化测试工具:Selenium Grid

    在生产环境,QA会同时跑几十个上百个的test case.如果用单机串行的话,是一件非常耗时的事情,估计比手点快不了多少.使用并行方案的话,有两种方法,一个是自己写并行框架,一个是用现成的Seleni ...

  5. VMware Workstation 11 搭建windows server 2012 之sql server 2012集群常见问题整理

    1.windows server 2012内置支持iSCSI发起程序无需额外安装,iSCSI Software Target 可作为“文件和存储服务”角色下的内置功能使用 2.拷贝虚拟机的文件加入域时 ...

  6. 用GDB调试程序(六)

    七.设置显示选项 GDB中关于显示的选项比较多,这里我只例举大多数常用的选项. set print address     set print address on         打开地址输出,当程 ...

  7. Java 日期比较大小

    import org.junit.Test; import java.text.SimpleDateFormat; import java.util.Date; /** * @author DateJ ...

  8. 新部署tomcat,An error occurred at line: [1] index_jsp.java

    环境: centos6.5 32位 oracle jdk 1.8 tomcat 7 问题: yum install tomcat后,返回如下错误: [root@centos]~# curl -v ht ...

  9. 高校手机签到系统——第一部分Authority权限系统(上)

    序:今天开始写一个算是我第一个系列的文章——高校手机签到系统.本系统结合我们学校自身的一些特点编写.这是我的毕业设计项目,写在这里算是给最后论文的时候一些点滴的记录.另外也想通过这个系列的文章找到一份 ...

  10. 【浅说】堆(heap)和栈(stack)区别

    在了解堆与栈之前,我们想来了解下程序的内存分配 一个编译的程序占用的内存分为以下几个部分  :  1.栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等.其操作方式 ...