FastDFS学习(一)--基础知识及文件上传、下载和同步原理分析

简单介绍

FastDFS是一个开源、轻量级、高效的分布式文件系统(DFS),其主要的功能有:文件存储、文件同步、文件访问(上传、下载等)、大容量存储和负载均衡等。适合以文件为载体的在线服务,如相册网站、视频网站等。其充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

架构组成

这里写图片描述
client:客户端。与Tracker交互获取Storage信息;与Storage交互直接进行文件操作。tracker:跟踪器。持有Storage列表,做调度工作,实现负载均衡机制。可由一台或多台服务器构成
Storage: 存储节点。
* 主动连接Storage。
* 持有所处卷所有Storage列表,与Tracker交互进行同步;与client交互进行文件访问操作;与所处卷其他Storage交互,进行同步操作(push)。
* 可由一台或多台服务器构成。
* 存储依赖本地文件系统。
* 会定时向tracker上传状态信息。

注:
Storage存储的内容包括:源数据、备份数据、文件元数据信息。

  • 源数据:客户端直接与存储节点交互端内容;
  • 源服务器:一次文件访问操作过程中与客户端直接交互端存储节点服务器;
  • 备份数据:由源服务器push到备份服务器的源数据内容;
  • 备份服务器:与源服务器同卷(Volume)的其他存储节点服务器;
  • 文件元数据信息:以键值对的方式存储,记录文件的说明信息;

各组成部分交互过程

文件访问

文件上传:
文件上传流程示意图
1、Client首先向Tracker发送获取上传目标Storage信息的请求,不带参数;
2、Tracker返回一台可用的Storage信息(storage Ip和端口);
3、选择Storage Path(磁盘):分配好storage server后,客户端先将file content和metadata发送到storage,然后向storage发送写文件请求,storage为文件分配一个数据存储目录;
4、生成FileId:选定存储目录之后,storage会为文件生一个fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串;若引入小文件合并机制,此id增加16个字节(trunk file id文件在trunk file内部的offset文件占用的存储空间大小(字节对齐及删除空间复用,文件占用存储空间>=文件大小))
5、选择两级目录:每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。
6、生成文件名:当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

  • 选取上传目标Volume规则:
    • Round robin:所有Volume间轮询;
    • Specified group:指定一个Volume;
    • Load balance:剩余空间多的Volume优先;
  • 选取上传目标Storage规则:
    • Round robin:Volume内所有Storage中轮询;
    • First server ordered by ip:按ip排序;
    • First server ordered by priority:按优先级排序(优先级在storage上配置);
  • 选取上传目标Storage path规则:
    • Round robin:多个存储目录轮询;
    • Load balance:剩余存储空间最多的优先;

文件下载:
文件下载流程示意图
1、Client向Tracker发送获取目标文件的请求,参数为文件标识(卷名和文件名);
2、Tracker返回指定卷下一台可用的Storage;
3、Client直接与目标Storage通讯完成文件下载;

  • 参数形式如下:
    volume0/M00/00/02/Cs8b8lFJIIyAH841AAAbpQt7xVI4715674

    • volume0:组名
    • M00:磁盘名
    • 00/02:目录
    • Cs8b8lFJIIyAH841AAAbpQt7xVI4715674:文件名,采用base64编码,信息包含源storage server Ip文件创建时间文件大小文件CRC32效验码随机数

  • tracker选择volume内可读的storage规则:
    1. 首选文件名编码中包含的源头storage;
    2. 文件创建时间戳(文件名中包含)=storage被同步到的时间戳(binlog中包含) && (当前时间-文件创建时间) > 文件同步所需最大时间;
    3. 文件创建时间戳 < storage被同步到的时间戳;
    4. (当前时间-文件创建时间戳) > 同步延迟阈值;

同步机制

新增tracker数据同步

  • storage server上配置了所有的tracker server;
  • storage与tracker的通信只能由storage主动发起(启动线程进行通信);
  • tracker返回的本组storage列表比本机记录少,会将tracker上没有的storage同步给该tracker

新增storage或storage状态发生改变时数据同步

  • 新storage连接tracker;
  • tracker比对之前的storage list,发现新增storage,将同卷内所有storage返回给新storage;
  • 重新将该卷storage list返回给组内其他storage;

组内storage数据同步

  • 只能在同卷storage间进行,采用push方式,即源服务器同步到目标服务器;
  • 源数据才需要同步,备份数据不再同步,否则会形成环路;
  • 新增storage时会有特例,同步源服务器会将指定的截止时间点之前的所有数据(源数据 + 备份数据)都同步到新增storage中,超过截止时间,转换为普通备份模式;

storage sever 7种状态

通过命令fdfs_monitor /etc/fdfs/client.conf以查看 ip_addr 选项显示 storage server 当前状态(FDFS_STORAGE_STATUS)


  • INIT:初始化,尚未得到同步已有数据的源服务器;
  • WAIT_SYNC:已经获取同步源服务器,等待同步
  • SYNCING:同步中
  • DELETE:已从本卷删除
  • OFFLINE:离线
  • ONLINE:在线,但不能提供服务
  • ACTIVE:在线,且能提供服务

eg:启动时状态改变(以新建一个storage A为例)
1. storage A连接tracker,tracker将strage A状态设置为FDFS_STORAGE_STATUS_INIT
2. storage A请求获取同步源服务器信息和追加同步截止时间点,若卷内只有storage A或该卷内成功上传但文件数为0,没有数据需要同步,则storage A已经准备好提供在线服务了,tracker将其状态设置为FDFS_STORAGE_STATUS_ONLINE;否则,将状态设置为FS_STORAGE_STATUS_WAITSYNC并进行下面处理;
3. tracker为storage A分配同步源stroage为B,B将截止时间点之前的所有数据同步给A,请求tracker将A的状态改为FS_STORAGE_STATUS_SYNCING;截止时间点之后,B对A的数据同步方式由追加同步变为正常binlog增量同步,其他storage开启同步线程对A进行binlog增量同步,当取不到更多的binlog时,请求tracker将A状态改为FS_STORAGE_STATUS_OFFLINE,此时,同步源完成;
4. B向A同步完所有数据,暂时没有数据要同步时,B请求tracker将A状态改为S_STORAGE_STATUS_ONLINE
5. A向tracker发起heart beat时,tracker将其状态改为FS_STORAGE_STATUS_ACTIVE

运行时目录结构

storage server


storage运行时目录结构


tracker server


tracker运行时目录结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值