fastdfs 订阅
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。 展开全文
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
信息
类    别
编程
两个角色
跟踪器和存储节点
性    质
计算机
外文名
fastdfs
fastdfs简介
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value)方式表示,如:width=1024,其中的key为width,value为1024。文件metadata是文件属性列表,可以包含多个键值对。跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。
收起全文
精华内容
参与话题
问答
  • fastdfs 原理与过程

    万次阅读 多人点赞 2017-07-08 19:36:55
    前言: 每次上传文件后都会返回一个地址,用户需要自己保存此地址。 为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的...

     

    前言:

    (1)每次上传文件后都会返回一个地址,用户需要自己保存此地址。

    (2)为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。

     

    网摘1

    FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

    arch.jpguploading.4e448015.gif转存失败重新上传取消arch.jpguploading.4e448015.gif转存失败重新上传取消arch.jpguploading.4e448015.gif转存失败重新上传取消enter image de.ion here

     

    Storage server

    Storage server(后简称storage)以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。

    以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(group内storage server数量即为该group的副本数),比如将不同应用数据存到不同的group就能隔离应用数据,同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡;缺点是group的容量受单机存储容量的限制,同时当group内有机器坏掉时,数据恢复只能依赖group内地其他机器,使得恢复时间会很长。

    group内每个storage的存储依赖于本地文件系统,storage可配置多个数据存储目录,比如有10块磁盘,分别挂载在/data/disk1-/data/disk10,则可将这10个目录都配置为storage的数据存储目录。

    storage接受到写文件请求时,会根据配置好的规则(后面会介绍),选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多,在storage第一次启动时,会在每个数据存储目录里创建2级子目录,每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。

    Tracker server

    Tracker是FastDFS的协调者,负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。

    Tracker需要管理的元信息很少,会全部存储在内存中;另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。

    Upload file

    FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。

    upload_file.jpguploading.4e448015.gif转存失败重新上传取消upload_file.jpguploading.4e448015.gif转存失败重新上传取消upload_file.jpguploading.4e448015.gif转存失败重新上传取消enter image de.ion here

    选择tracker server

    当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcertracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer

    选择存储的group

    tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则: 1. Round robin,所有的group间轮询 2. Specified group,指定某一个确定的group 3. Load balance,剩余存储空间多多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给客户端,支持如下选择storage的规则: 1. Round robin,在group内的所有storage间轮询 2. First server ordered by ip,按ip排序 3. First server ordered by priority,按优先级排序(优先级在storage上配置)group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则: 1. Round robin,在group内的所有storage间轮询 2. First server ordered by ip,按ip排序 3. First server ordered by priority,按优先级排序(优先级在storage上配置)

    选择storage path

    当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则: 1. Round robin,多个存储目录间轮询 2. 剩余存储空间最多的优先storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则: 1. Round robin,多个存储目录间轮询 2. 剩余存储空间最多的优先

    生成Fileid

    选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。

    选择两级目录

    当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。

    生成文件名

    当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

    fastdfs_name.jpguploading.4e448015.gif转存失败重新上传取消fastdfs_name.jpguploading.4e448015.gif转存失败重新上传取消fastdfs_name.jpguploading.4e448015.gif转存失败重新上传取消enter image de.ion here

    文件同步

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

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

    storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读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生成一个同步时间戳。

    Download file

    客户端upload file成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。

    download_file.jpguploading.4e448015.gif转存失败重新上传取消download_file.jpguploading.4e448015.gif转存失败重新上传取消download_file.jpguploading.4e448015.gif转存失败重新上传取消enter image de.ion here

    跟upload file一样,在download file时客户端可以选择任意tracker server。

    tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。由于group内的文件同步时在后台异步进行的,所以有可能出现在读到时候,文件还没有同步到某些storage server上,为了尽量避免访问到这样的storage,tracker按照如下规则选择group内可读的storage。

    1. 该文件上传到的源头storage - 源头storage只要存活着,肯定包含这个文件,源头的地址被编码在文件名中。 2. 文件创建时间戳==storage被同步到的时间戳 且(当前时间-文件创建时间戳) > 文件同步最大时间(如5分钟) - 文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。 3. 文件创建时间戳 < storage被同步到的时间戳。 - 同步时间戳之前的文件确定已经同步了 4. (当前时间-文件创建时间戳) > 同步延迟阀值(如一天)。 - 经过同步延迟阈值时间,认为文件肯定已经同步了。 该文件上传到的源头storage - 源头storage只要存活着,肯定包含这个文件,源头的地址被编码在文件名中。 2. 文件创建时间戳==storage被同步到的时间戳 且(当前时间-文件创建时间戳) > 文件同步最大时间(如5分钟) - 文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。 3. 文件创建时间戳 < storage被同步到的时间戳。 - 同步时间戳之前的文件确定已经同步了 4. (当前时间-文件创建时间戳) > 同步延迟阀值(如一天)。 - 经过同步延迟阈值时间,认为文件肯定已经同步了。

    小文件合并存储

    小文件合并存储主要解决如下几个问题:

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

    FastDFS在V3.0版本里引入小文件合并存储的机制,可将多个小文件存储到一个大的文件(trunk file),为了支持这个机制,FastDFS生成的文件fileid需要额外增加16个字节

    1. trunk file id 2. 文件在trunk file内部的offset 3. 文件占用的存储空间大小 (字节对齐及删除空间复用,文件占用存储空间>=文件大小) trunk file id 2. 文件在trunk file内部的offset 3. 文件占用的存储空间大小 (字节对齐及删除空间复用,文件占用存储空间>=文件大小)

    每个trunk file由一个id唯一标识,trunk file由group内的trunk server负责创建(trunk server是tracker选出来的),并同步到group内其他的storage,文件存储合并存储到trunk file后,根据其offset就能从trunk file读取到文件。

    文件在trunk file内的offset编码到文件名,决定了其在trunk file内的位置是不能更改的,也就不能通过compact的方式回收trunk file内删除文件的空间。但当trunk file内有文件删除时,其删除的空间是可以被复用的,比如一个100KB的文件被删除,接下来存储一个99KB的文件就可以直接复用这片删除的存储空间。

    HTTP访问支持

    FastDFS的tracker和storage都内置了http协议的支持,客户端可以通过http协议来下载文件,tracker在接收到请求时,通过http的redirect机制将请求重定向至文件所在的storage上;除了内置的http协议外,FastDFS还提供了通过apache或nginx扩展模块下载文件的支持。

    fastdfs_http.jpguploading.4e448015.gif转存失败重新上传取消fastdfs_http.jpguploading.4e448015.gif转存失败重新上传取消fastdfs_http.jpguploading.4e448015.gif转存失败重新上传取消enter image de.ion here

    其他特性

    FastDFS提供了设置/获取文件扩展属性的接口(setmeta/getmeta),扩展属性以key-value对的方式存储在storage上的同名文件(拥有特殊的前缀或后缀),比如/group/M00/00/01/some_file为原始文件,则该文件的扩展属性存储在/group/M00/00/01/.some_file.meta文件(真实情况不一定是这样,但机制类似),这样根据文件名就能定位到存储扩展属性的文件。

    以上两个接口作者不建议使用,额外的meta文件会进一步“放大”海量小文件存储问题,同时由于meta非常小,其存储空间利用率也不高,比如100bytes的meta文件也需要占用4K(block_size)的存储空间。

    FastDFS还提供appender file的支持,通过upload_appender_file接口存储,appender file允许在创建后,对该文件进行append操作。实际上,appender file与普通文件的存储方式是相同的,不同的是,appender file不能被合并存储到trunk file。

    问题讨论

    从FastDFS的整个设计看,基本上都已简单为原则。比如以机器为单位备份数据,简化了tracker的管理工作;storage直接借助本地文件系统原样存储文件,简化了storage的管理工作;文件写单份到storage即为成功、然后后台同步,简化了写文件流程。但简单的方案能解决的问题通常也有限,FastDFS目前尚存在如下问题(欢迎探讨)。

    数据安全性

    • 写一份即成功:从源storage写完文件至同步到组内其他storage的时间窗口内,一旦源storage出现故障,就可能导致用户数据丢失,而数据的丢失对存储系统来说通常是不可接受的。
    • 缺乏自动化恢复机制:当storage的某块磁盘故障时,只能换存磁盘,然后手动恢复数据;由于按机器备份,似乎也不可能有自动化恢复机制,除非有预先准备好的热备磁盘,缺乏自动化恢复机制会增加系统运维工作。
    • 数据恢复效率低:恢复数据时,只能从group内其他的storage读取,同时由于小文件的访问效率本身较低,按文件恢复的效率也会很低,低的恢复效率也就意味着数据处于不安全状态的时间更长。
    • 缺乏多机房容灾支持:目前要做多机房容灾,只能额外做工具来将数据同步到备份的集群,无自动化机制。

    存储空间利用率

    • 单机存储的文件数受限于inode数量
    • 每个文件对应一个storage本地文件系统的文件,平均每个文件会存在block_size/2的存储空间浪费。
    • 文件合并存储能有效解决上述两个问题,但由于合并存储没有空间回收机制,删除文件的空间不保证一定能复用,也存在空间浪费的问题

    负载均衡

    • group机制本身可用来做负载均衡,但这只是一种静态的负载均衡机制,需要预先知道应用的访问特性;同时group机制也导致不可能在group之间迁移数据来做动态负载均衡。

    网摘2

     

    FastDFS 介绍

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

    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足够多,数据流量是足够分散的

    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 的规则为:
    1. Round robin,所有 server 轮询使用(默认)
    2. 根据IP地址进行排序选择第一个服务器(IP地址最小者)
    3. 根据优先级进行排序(上传优先级由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安装、配置、部署(一)-安装和部署

    万次阅读 多人点赞 2014-08-16 10:53:05
    FastDFS是一个开源的,高性能的的分布式文件系统,他主要的功能包括:文件存储,同步和访问,设计基于高可用和负载均衡,FastDFS非常适用于基于文件服务的站点,例如图片分享和视频分享网站FastDFS有两个角色:跟踪...

        FastDFS是一个开源的,高性能的的分布式文件系统,他主要的功能包括:文件存储,同步和访问,设计基于高可用和负载均衡,FastDFS非常适用于基于文件服务的站点,例如图片分享和视频分享网站

    FastDFS有两个角色:跟踪服务(tracker)和存储服务(storage),跟踪服务控制,调度文件以负载均衡的方式访问;存储服务包括:文件存储,文件同步,提供文件访问接口,同时以key value的方式管理文件的元数据

    跟踪和存储服务可以由1台或者多台服务器组成,同时可以动态的添加,删除跟踪和存储服务而不会对在线的服务产生影响,在集群中,tracker服务是对等的

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

    一、开始安装:

    1. 在http://code.google.com/p/fastdfs/downloads/list下载所需文件,此外还需先安装好libevent。

    2. tar xzf FastDFS_v2.11.tar.gz

    3. cd FastDFS
    如果支持HTTP, vi make.sh,使用/WITH_HTTPD查找到这一行,输入i进入编辑模式,删除掉前面的注释#,:wq保存退出,如果需要安装成服务,则把下面一行也解开。
    ./make.sh
    ./make.sh install

    4. 准备几个空闲的端口,可以使用netstat -an | grep 端口号是否被占用。

    5. 根据实际情况修改/etc/fdfs下的配置文件,每个上面都有注释说明,如果需要HTTP,别忘了解开最下面的#include http.conf,要带一个#

    6. 启动tracker: /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf

    7. 启动storage: /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf,如果出现错误,可以到步骤5修改配置文件时设置的目录的log目录下查看具体错误原因。

    8. 到此安装配置完毕


    二、操作使用:在FastDFS安装目录bin下有以下可执行文件。


    上传文件:/usr/local/bin/fdfs_upload_file  <config_file> <local_filename>

    下载文件:/usr/local/bin/fdfs_download_file <config_file> <file_id> [local_filename]

    删除文件:/usr/local/bin/fdfs_delete_file <config_file> <file_id>

    monitor: /usr/local/bin/fdfs_monitor /etc/fdfs/client.conf

    关闭:

    killall fdfs_trackerd

    killall fdfs_storaged

    /usr/local/bin/stop.sh /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf

    /usr/local/bin/stop.sh /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf

    重启:

    /usr/local/bin/restart.sh /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf

    /usr/local/bin/restart.sh /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf


    三、测试上传:

    ./fdfs_test ../conf/client.conf upload QQ.png,可以看到文件上传成功。


    在app/fdfs407/data/data/00/3C目录下可以找到刚刚上传的图片:



    四、FastDFS上传/下载过程:

    首先客户端 client 发起对 FastDFS 的文件传输动作,是通过连接到某一台 Tracker Server 的指定端口来实现的,Tracker Server 根据目前已掌握的信息,来决定选择哪一台 Storage Server ,然后将这个Storage Server 的地址等信息返回给 client,然后 client 再通过这些信息连接到这台 Storage Server,将要上传的文件传送到给 Storage Server上。


    上传过程:


    下载过程:



    在我的项目中,一般启动2个tracker和2个storage就可以了,如下所示:

    ./fdfs_trackerd ../conf/tracker-1.conf
    ./fdfs_trackerd ../conf/tracker-2.conf
    ./fdfs_storaged ../conf/storage-g1-1.conf
    ./fdfs_storaged ../conf/storage-g2-1.conf

    下一篇文章再介绍各个如何配置各个conf文件。

    展开全文
  • FastDFS简介

    千次阅读 2019-01-08 14:34:47
    简介 FastDFS是一个开源的轻量级分布式文件系统...FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文...

    简介

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

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

    FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。

    存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key valuepair)方式表示,如:width=1024,其中的key为width,value为1024。文件metadata是文件属性列表,可以包含多个键值对。

    跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。 
    为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。 
    在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。 
    当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。 
    FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。

    FastDFS提供的功能:

    1、upload 上传文件 
    2、upload_appender:上传appender文件,后续可已对其进行append操作 
    3、upload_slave:上传从文件 
    4、download 下载文件 
    5、delete 删除文件 
    6、append:在已有文件后追加内容 
    7、set_metadata:设置文件附加属性 
    8、get_metadata:获取文件附加属性

    FastDFS的特点:

    1、分组存储、灵活简洁 
    2、对等结构、不存在单点 
    3、文件ID有FastDFS生成,作为文件访问凭证。FastDFS不需要传统的name server 
    4、和流行的web server无缝连接,FastDFS已提供apache和nginx扩展模块 
    5、大、中、小文件均可以很好支持,支持海量小文件存储 
    6、支持多块磁盘,支持但盘数据恢复 
    7、支持相同文件内容只保存一份,节省存储空间 
    8、存储服务器上可以保存文件附加属性 
    9、下载文件支持多线程方式、支持断点续传

    FastDFS架构解读:

    1、只有两个角色,tracker server和storage server,不需要存储文件索引信息 
    2、所有服务器都是对等的,不存在Master-Slave关系 
    3、存储服务器采用分组方式,同组内存储服务器上的文件完全相同 
    4、不同组的storage server之间不会相互通信 
    5、不同组的storage server之间不会相互通信 
    6、有storage server主动向tracker server报告状态信息,tracker server 之间通常不会相互通信

    FastDFS如何解决同步延迟问题?

    1、storage生成的文件名中,包含源头storage IP地址和文件创建的时间戳 
    2、源头storage定时向tracker报告同步情况,包括向目标服务器同步到的文件时间戳 
    3、tracker收到storage的同步报告后,找出该组内每台storage被同步到的时间戳(取最小值),作为storage属性保存到内存中

    FastDFS扩展模块要点:

    1、使用扩展模块来解决文件同步延迟问题 
    2、对每台storage server上部署web server,直接对外提供HTTP服务 
    3、tracker server上不需要部署web server 
    4、如果请求文件在当前storage上不存在,通过文件ID反解出源storage,直接请求源storage 
    5、目前已提供apache和nginx扩展模块 
    6、FastDFS扩展模块不依赖于FastDFS server,可以独立存在

    FastDFS扩展模块特性:

    1、仅支持HTTP HEAD和GET 
    2、支持token方式的防盗链(缺省是关闭的) 
    -ts:生成token的时间(unix时间戳) 
    -token:32未得token字符串(md5签名) 
    3、支持制定保存的缺省文件名,URL参数名为filename 
    4、支持断点续传

    上传交互过程

    client询问tracker上传到的storage,不需要附加参数;
    tracker返回一台可用的storage;
    client直接和storage通讯完成文件上传。
    下载交互过程

    client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
    tracker返回一台可用的storage;
    client直接和storage通讯完成文件下载。 
    需要说明的是,client为使用FastDFS服务的调用方,client也应该是一台服务器,它对tracker和storage的调用均为服务器间的调用。
    --------------------- 
    作者:jkxqj 
    来源:CSDN 
    原文:https://blog.csdn.net/jkxqj/article/details/78476662 
    版权声明:本文为博主原创文章,转载请附上博文链接!
    一、理论基础

    FastDFS比较适合以中小文件为载体的在线服务,比如跟NGINX(APACHE)配合搭建图片服务器。

    分布式文件系统FastDFS

    FastDFS是纯C语言实现,只支持Linux、FreeBSD等UNIX系统。

    FastDFS的两个核心概念分别是:Tracker(跟踪器)、Storage(存储节点)

            跟踪器Tracker主要做调度工作,相当于mvc中的controller的角色,在访问上起负载均衡的作用。跟踪器和存储节点都可以由一台或多台服务器构成,跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务,其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。

           跟踪器Tracker负责管理所有的Storage和group,每个Storage在启动后会连接Tracker,

      告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,

      建立group==>[storage server list]的映射表,Tracker需要管理的元信息很少,会全部存储在内存中;另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。 

            存储节点Storage采用了分卷[Volume](或分组[group])的组织方式,存储系统由一个或多个组组成,组与组之间的文件是相互独立的,所有组的文件容量累加就是整个存储系统中的文件容量。

       一个卷[Volume](组[group])可以由一台或多台存储服务器组成,一个组中的存储服务器中的文件都是相同的,组中的多台存储服务器起到了冗余备份和负载均衡的作用,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。


    1,fastdfs有三部分构成:client,tracer server,storage server;
    2,文件上传流程:
        1. Client询问Tracker server应上传到哪个Storage server;
        2. Tracker server返回一台可用的Storage server,返回的数据为该Storage server的IP地址和端口;
        3. Client直接和该Storage server建立连接,进行文件上传。
        4. Storage server返回新生成的文件ID,文件上传结束。
        5. 连接关闭。
    3,文件下载:
        1. client询问tracker可以下载指定文件的storage,参数为文件ID(组名和文件名);
        2. tracker返回一台可用的storage;
        3. client直接和storage通信完成文件下载。
        4. 连接关闭。
    总结:

    每个组都有唯一的trunk leader,组内所有trunk文件的信息,由这个trunk leader内部组织的avl树来保存。
    上传文件后,storage会向trunk leader发起申请空间的请求,这时trunk leader会使用一个全局的锁,获得了trunk存储的位置后,storage在本地写磁盘。
    下载文件时,trunk信息在文件名里面已经包含,只需要直接读即可。
    使用trunk方式主要是为了解决node过多造成读写性能下降的问题,但是引入trunk方式本身也会造成一定的性能损耗。
    目前感觉我对trunk功能还是hold不住,包括如果trunk出错,怎么样恢复trunk文件的数据,因为没有提供的官方的工具,所以不太敢用。

    1 client发出请求,accept线程catch到描述符,初始化pTask结构,填入描述符,然后将pTask通过管道给work_entrance

    2 进入storagerecvnotify_read函数

    3 根据当前的pTask->stage等于FDFSSTORAGESTAGEINIT为fd创建读事件,绑定函数clientsock_read

    4 调用storageuploadfile

    5 storageuploadfile调用storagewriteto_file

    6 storagewritetofile调用压磁盘队列函数storagedioqueuepush

    7 storagedioqueuepush将pTask->stage |= FDFSSTORAGESTAGEDIO_THREAD

    8 根据事件触发机制,clientsockread将被不断的调用,然而由于pTask->stage != FDFSSTORAGESTAGE_RECV,所以返回

    9 磁盘线程通过队列取pTask,调用pTask的处理函数diowritefile

    10 调用storageuploadfiledonecallback,调用storagenionotify,通过管道的形式将pTask压入工作进程

    11 触发storagerecvnotifyread,将task->stage的FDFSSTORAGESTAGEDIO_THREAD标志去除

    12 根据task->stage的FDFSSTORAGESTAGERECV状态,调用函数clientsock_read

    13 clientsockread读取完以后调用磁盘队列函数storagedioqueue_push

    14 重复7

    15 直到结束

    展开全文
  • FastDFS服务器搭建

    万次阅读 多人点赞 2019-05-10 01:29:05
    一、FastDFS介绍 1.1 简介 1.2FastDFS架构 1.2.1 Tracker 集群 1.2.2Storage集群 1.2.3 Storage状态收集 1.2.4 FastDFS的上传过程 1.2.5 FastDFS的文件同步 1.2.6 FastDFS的文件下载 二、安装FastDFS 2.1 ...

    目录

     

     一、FastDFS介绍

    1.1 简介

    1.2   FastDFS架构

    1.2.1 Tracker 集群

    1.2.2 Storage 集群

    1.2.3  Storage状态收集

    1.2.4 FastDFS的上传过程

    1.2.5 FastDFS的文件同步

    1.2.6 FastDFS的文件下载

    二、安装FastDFS

    2.1 环境准备

    2.2 CentOS安装GCC

    2.3 安装libevent

    2.4 安装libfastcommon

    2.5 安装FastDFS

    2.6 配置FastDFS跟踪器(Tracker)

    2.7 配置 FastDFS 存储 (Storage)

    2.8 上传测试

    三、安装配置Nginx ,http访问文件

    四、FastDFS 配置 Nginx 模块

    4.1 安装配置fastdfs-nginx-module模块

    五 最终部署结构图

    六、Java客户端

    1、首先需要搭建 FastDFS 客户端Java开发环境

    2、客户端API

    七、权限控制


     一、FastDFS介绍

    FastDFS开源地址:https://github.com/happyfish100

    1.1 简介

           FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。它只能通过 专有API对文件进行存取访问,不支持POSIX接口方式,不能mount使用。准确地讲,Google FS以及FastDFS、mogileFS、 HDFS、TFS等类Google FS都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。    

           FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

    1.2   FastDFS架构

    FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Trackerserver调度最终由Storage server完成文件上传和下载。

    FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

      Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。通过Trackerserver在文件上传时可以根据一些策略找到Storageserver提供文件上传服务。

      Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。

      Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

     

     

     

    1.2.1 Tracker 集群

             FastDFS集群中的Tracker server可以有多台,Trackerserver之间是相互平等关系同时提供服务,Trackerserver不存在单点故障。客户端请求Trackerserver采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。
     

    1.2.2 Storage 集群

    为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷由一台或多台存储服务器组成,卷内的Storage server之间是平等关系,不同卷的Storageserver之间不会相互通信,同卷内的Storageserver之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个卷的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。卷中的多台存储服务器起到了冗余备份和负载均衡的作用

    在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

    采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。

    1.2.3  Storage状态收集

             Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。

    1.2.4 FastDFS的上传过程

    FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。

    Storage Server会定期的向Tracker Server发送自己的存储信息。当Tracker Server Cluster中的Tracker Server不止一个时,各个Tracker之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker。

    当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个storage server。当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生成文件名存储文件。

     

    客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

    组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。

     虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。

    数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。

    文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
     

    1.2.5 FastDFS的文件同步

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

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

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

    1.2.6 FastDFS的文件下载

    客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。

     

    跟upload file一样,在downloadfile时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。

    tracker根据请求的文件路径即文件ID 来快速定义文件。

    比如请求下边的文件:

    1.通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问。 

    2.存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。
     

    二、安装FastDFS

    2.1 环境准备

    操作环境:CentOS7 X64,以下操作都是单机环境。

    服务列表:

    hostname ip Node Type username
    l1 192.168.0.200 tracker server,storage server  root
    l2 192.168.0.201 tracker server,storage server  root

    如果采用主机名,需做如下配置

    由于 集群内部有时需要通过主机名来进行相互通信,因此我们需要保证每一台机器的主机名都不相同。
    具体操作参见:https://blog.csdn.net/prcyang/article/details/84787480

    先做一件事,修改hosts,将文件服务器的ip与域名映射(单机TrackerServer环境),因为后面很多配置里面都需要去配置服务器地址,ip变了,就只需要修改hosts即可。

    我把所有的安装包下载或上传到 /usr/local/src/下,并解压到当前目录。

    如果要在本机访问虚拟机,在C:\Windows\System32\drivers\etc\hosts中同样增加一行

    2.2 CentOS安装GCC

    安装FastDFS需要先将官网下载的源码进行编译,编译依赖gcc环境

    [root@localhost ~]# yum -y install gcc-c++

    ps:检查gcc-c++是否已经安装(如果已安装,执行 yum -y install gcc-c++ 也会提示)

    [root@localhost src]# whereis gcc   
    gcc:[root@localhost src]#        # 未安装输出
    gcc: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz        #已安装输出

    2.3 安装libevent

    FastDFS依赖libevent库,需要安装:

    [root@localhost ~]# yum -y install libevent

    2.4 安装libfastcommon

      libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库。

    下载地址: https://github.com/happyfish100/libfastcommon/releases 选择合适的版本

    [root@localhost ~]# cd /usr/local/src/    #切换到下载目录
    [root@localhost src]# wget -O libfastcommon-1.0.39.tar.gz  https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.39 #下载(如果下载慢 可以将下载好的文件上传到此目录)
    [root@localhost src]# tar -zxvf libfastcommon-1.0.39.tar.gz      #解压
    [root@localhost src]# cd libfastcommon-1.0.39/
    # 安装
    [root@localhost libfastcommon-1.0.39]# ./make.sh 

    [root@localhost libfastcommon-1.0.39]# ./make.sh  install

    2.5 安装FastDFS

    下载地址:https://github.com/happyfish100/fastdfs/releases 选择合适的版本

    [root@localhost libfastcommon-1.0.39]# cd /usr/local/src/      #切换到下载目录

    #下载(如果下载慢 可以将下载好的文件上传到此目录)
    [root@localhost src]# wget -O fastdfs-5.11.tar.gz https://codeload.github.com/happyfish100/fastdfs/tar.gz/V5.11
    [root@localhost src]# tar -zxvf fastdfs-5.11.tar.gz   #解压
    [root@localhost src]# cd fastdfs-5.11/
    #安装
    [root@localhost fastdfs-5.11]# ./make.sh 
    [root@localhost fastdfs-5.11]# ./make.sh  install

    默认安装方式安装后的相应文件与目录

    A、服务脚本:

    /etc/init.d/fdfs_storaged
    /etc/init.d/fdfs_trackerd

    B、配置文件(这三个是作者给的样例配置文件)

    /etc/fdfs/client.conf.sample
    /etc/fdfs/storage.conf.sample
    /etc/fdfs/tracker.conf.sample

    C、命令工具在 /usr/bin/ 目录下:

    fdfs_appender_test
    fdfs_appender_test1
    fdfs_append_file
    fdfs_crc32
    fdfs_delete_file
    fdfs_download_file
    fdfs_file_info
    fdfs_monitor
    fdfs_storaged
    fdfs_test
    fdfs_test1
    fdfs_trackerd
    fdfs_upload_appender
    fdfs_upload_file
    stop.sh
    restart.sh

    2.6 配置FastDFS跟踪器(Tracker)

    配置文件详细说明参考:FastDFS 配置文件详解

    • 进入 /etc/fdfs,复制 FastDFS 跟踪器样例配置文件 tracker.conf.sample,并重命名为 tracker.conf。

    [root@localhost fastdfs-5.11]# cd /etc/fdfs/
    [root@localhost fdfs]# cp tracker.conf.sample tracker.conf
    [root@localhost fdfs]#  vim tracker.conf

    •  编辑tracker.conf ,标红的需要修改下,其它的默认即可。

    # 配置文件是否不生效,false 为生效
    disabled=false

    # 提供服务的端口
    port=22122

    # Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)
    base_path=/fastdfs/tracker

    # HTTP 服务端口 默认8080 ,建议修改 防止冲突
    http.server_port=9080

    • 创建tracker基础数据目录,即base_path对应的目录

    [root@localhost fdfs]# mkdir -p /fastdfs/tracker

    • 防火墙中打开跟踪端口(默认的22122)

    # vim /etc/sysconfig/iptables

    添加如下端口行:
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT

    重启防火墙:
    # service iptables restart

    • 启动Tracker

    初次成功启动,会在 /fdfsdfs/tracker/ (配置的base_path)下创建 data、logs 两个目录。

    [root@localhost fdfs]# /etc/init.d/fdfs_trackerd start
    [root@localhost fdfs]# service fdfs_trackerd start
    [root@localhost fdfs]# systemctl start fdfs_trackerd

    查看 FastDFS Tracker 是否已成功启动 ,

    # systemctl status fdfs_trackerd  # 查看服务状态 运行状态则算成功
     fdfs_trackerd.service - LSB: FastDFS tracker server
       Loaded: loaded (/etc/rc.d/init.d/fdfs_trackerd; bad; vendor preset: disabled)
       Active: active (exited) since 四 2019-05-09 08:57:18 CST; 6min ago
         Docs: man:systemd-sysv-generator(8)
      Process: 130913 ExecStop=/etc/rc.d/init.d/fdfs_trackerd stop (code=exited, status=2)
      Process: 131030 ExecStart=/etc/rc.d/init.d/fdfs_trackerd start (code=exited, status=0/SUCCESS)

    # netstat -tulnp|grep fdfs   # 22122端口正在被监听,则算是Tracker服务安装成功
       tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      27492/fdfs_trackerd 

    • 关闭Tracker命令:

    [root@localhost fdfs]# service fdfs_trackerd stop
    [root@localhost fdfs]# systemctl stop fdfs_trackerd #centos7 推荐
    [root@localhost fdfs]# /etc/init.d/fdfs_trackerd stop

    •  设置Tracker开机启动

    # chkconfig fdfs_trackerd on

    #systemctl enable fdfs_trackerd.service
    或者:
    # vim /etc/rc.d/rc.local
    加入配置:
    /etc/init.d/fdfs_trackerd start

    • tracker server 目录及文件结构 

    Tracker服务启动成功后,会在base_path下创建data、logs两个目录。目录结构如下:

    ${base_path}
    |__data
    | |__storage_groups.dat:存储分组信息
    | |__storage_servers.dat:存储服务器列表
    |__logs
    | |__trackerd.log: tracker server 日志文件

    2.7 配置 FastDFS 存储 (Storage)

    配置文件详细说明参考:FastDFS 配置文件详解

    • 进入 /etc/fdfs 目录,复制 FastDFS 存储器样例配置文件 storage.conf.sample,并重命名为 storage.conf

    # cd /etc/fdfs
    # cp storage.conf.sample storage.conf
    # vim storage.conf

    • 编辑storage.conf

    标红的需要修改,其它的默认即可。

    # 配置文件是否不生效,false 为生效
    disabled=false 

    # 指定此 storage server 所在 组(卷)
    group_name=group1

    # storage server 服务端口
    port=23000

    # 心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳)
    heart_beat_interval=30

    # Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)  (注 :这里不是上传的文件存放的地址,之前版本是的,在某个版本后更改了)
    base_path=/fastdfs/storage/base

    # 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。
    store_path_count=1


    # 逐一配置 store_path_count 个路径,索引号基于 0。
    # 如果不配置 store_path0,那它就和 base_path 对应的路径一样。
    store_path0=/fastdfs/storage

    # FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。 
    # 如果本参数只为 N(如: 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N * N 个存放文件的子目录。
    subdir_count_per_path=256

    # tracker_server 的列表 ,会主动连接 tracker_server
    # 有多个 tracker server 时,每个 tracker server 写一行
    tracker_server=192.168.0.200:22122
    tracker_server=192.168.0.201:22122

    # 允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定。
    sync_start_time=00:00
    sync_end_time=23:59
    # 访问端口 默认80  建议修改 防止冲突
    http.server_port=9888

    •  创建Storage基础数据目录,对应base_path目录
    # 对应base_path
    # mkdir -p /fastdfs/storage/base
    
    # 这是配置的store_path0路径,有多个要创建多个
    # mkdir -p /fastdfs/storage/
    
    • 防火墙中打开存储器端口(默认的 23000) 

    # vim /etc/sysconfig/iptables

    添加如下端口行:
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT

    重启防火墙:
    # service iptables restart

    •  启动 Storage

    启动Storage前确保Tracker是启动的。初次启动成功,会在 /fastdfs/storage/base(base_path) 目录下创建 data、 logs 两个目录。

    可以用这种方式启动
    # /etc/init.d/fdfs_storaged start
    # service fdfs_storaged start
    # systemctl start fdfs_storaged  #centos7 推荐
    

    查看 Storage 是否成功启动,

    # netstat -unltp|grep fdfs #23000 端口正在被监听,就算 Storage 启动成功。
    tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      28834/fdfs_storaged 
    # systemctl status fdfs_storaged # 查看服务状态
    ● fdfs_storaged.service - LSB: FastDFS storage server
       Loaded: loaded (/etc/rc.d/init.d/fdfs_storaged; bad; vendor preset: disabled)
       Active: active (running) since 四 2019-05-09 09:22:53 CST; 2s ago
         Docs: man:systemd-sysv-generator(8)
      Process: 23015 ExecStart=/etc/rc.d/init.d/fdfs_storaged start (code=exited, status=0/SUCCESS)
        Tasks: 1
       Memory: 184.0K
       CGroup: /system.slice/fdfs_storaged.service
               └─23023 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
    
    5月 09 09:22:53 localhost.localdomain systemd[1]: Starting LSB: FastDFS storage server...
    5月 09 09:22:53 localhost.localdomain fdfs_storaged[23015]: Starting FastDFS storage server:
    5月 09 09:22:53 localhost.localdomain systemd[1]: Started LSB: FastDFS storage server.
    
    • 关闭Storage

    [root@localhost fdfs]# service fdfs_storaged stop
    [root@localhost fdfs]# systemctl stop
    fdfs_storaged #centos7 推荐
    [root@localhost fdfs]# /etc/init.d/
    fdfs_storaged stop

    • 查看Storage和Tracker是否在通信:
    # /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
    [2019-05-09 11:34:09] DEBUG - base_path=/fastdfs/storage/base, connect_timeout=30, network_timeout=60, tracker_server_count=2, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
    
    server_count=2, server_index=0
    
    tracker server is 192.168.0.200:22122
    
    group count: 1
    
    Group 1:
    group name = group1
    disk total space = 51175 MB
    disk free space = 14251 MB
    trunk free space = 0 MB
    storage server count = 2
    active server count = 1
    storage server port = 23000
    storage HTTP port = 9888
    store path count = 1
    subdir count per path = 256
    current write server index = 0
    current trunk file id = 0
    
        Storage 1:
            id = 192.168.0.200
            ip_addr = 192.168.0.200 (localhost.localdomain)  ACTIVE
            。。。
         Storage 2:
            id = 192.168.0.201
            ip_addr = 192.168.0.201  WAIT_SYNC
    
    
    • 设置 Storage 开机启动
    # chkconfig fdfs_storaged on
    # chkconfig fdfs_storaged on
    或
    #systemctl enable fdfs_storaged.service  (推荐)
    或者:
    # vim /etc/rc.d/rc.local
    加入配置:
    /etc/init.d/fdfs_storaged  start 

    Storage 目录

    同 Tracker,Storage 启动成功后,在base_path 下创建了data、logs目录,记录着 Storage Server 的信息。
    在 store_path0/data 目录下,创建了N*N个子目录:

    [root@localhost ~]# ls /fastdfs/storage/data/
    00  05  0A  0F  14  19  1E  23  28  2D  32  37  3C  41  46  4B  50  55  5A  5F  64  69  6E  73  78  7D  82  87  8C  91  96  9B  A0  A5  AA  AF  B4  B9  BE  C3  C8  CD  D2  D7  DC  E1  E6  EB  F0  F5  FA  FF
    01  06  0B  10  15  1A  1F  24  29  2E  33  38  3D  42  47  4C  51  56  5B  60  65  6A  6F  74  79  7E  83  88  8D  92  97  9C  A1  A6  AB  B0  B5  BA  BF  C4  C9  CE  D3  D8  DD  E2  E7  EC  F1  F6  FB
    02  07  0C  11  16  1B  20  25  2A  2F  34  39  3E  43  48  4D  52  57  5C  61  66  6B  70  75  7A  7F  84  89  8E  93  98  9D  A2  A7  AC  B1  B6  BB  C0  C5  CA  CF  D4  D9  DE  E3  E8  ED  F2  F7  FC
    03  08  0D  12  17  1C  21  26  2B  30  35  3A  3F  44  49  4E  53  58  5D  62  67  6C  71  76  7B  80  85  8A  8F  94  99  9E  A3  A8  AD  B2  B7  BC  C1  C6  CB  D0  D5  DA  DF  E4  E9  EE  F3  F8  FD
    04  09  0E  13  18  1D  22  27  2C  31  36  3B  40  45  4A  4F  54  59  5E  63  68  6D  72  77  7C  81  86  8B  90  95  9A  9F  A4  A9  AE  B3  B8  BD  C2  C7  CC  D1  D6  DB  E0  E5  EA  EF  F4  F9  FE
    

    2.8 上传测试

    • 修改 Tracker 服务器中的客户端配置文件 
    # cd /etc/fdfs
    # cp client.conf.sample client.conf
    # vim client.conf
    • 修改如下配置即可,其它默认。
    # Client 的数据和日志目录
    base_path=/fastdfs/client
    
    # Tracker端口
    tracker_server=192.168.0.200:22122

    ② 上传测试

     在linux内部执行如下命令上传 namei.jpeg 图片

    # /usr/bin/fdfs_upload_file /etc/fdfs/client.conf namei.jpeg

    上传成功后返回文件ID号:group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg

    返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

    三、安装配置Nginx ,http访问文件

    上面将文件上传成功了,但我们无法下载。因此安装Nginx作为服务器以支持Http方式访问文件。同时,后面安装FastDFS的Nginx模块也需要Nginx环境。

    Nginx只需要安装到StorageServer所在的服务器即可,用于访问文件

    安装nginx 参见:https://blog.csdn.net/prcyang/article/details/90032781

    配置nginx

    # vim /usr/local/nginx/conf/nginx.conf
    配置如下
    server {
            listen       8081;
            server_name  192.168.0.200;
    
            location /group1/M00{
            alias /fastdfs/storage/data/;
             autoindex on;
    
           }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
            root   html;
           }
        }
    

    在浏览器访问之前上传的图片 http://192.168.0.200:8081/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg

    四、FastDFS 配置 Nginx 模块

    4.1 安装配置fastdfs-nginx-module模块

    •  fastdfs-nginx-module 模块说明

      FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储, 但是同组存储服务器之间需要进行文件复制, 有同步延迟的问题。

      假设 Tracker 服务器将文件上传到了 192.168.51.128,上传成功后文件 ID已经返回给客户端。

      此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.51.129,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.51.129 上取文件,就会出现文件无法访问的错误。

      而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。

    • 下载fastdfs-nginx-module

    #cd /usr/local/src
    #wget -O fastdfs-nginx-module-1.20.tar.gz  https://codeload.github.com/happyfish100/fastdfs-nginx-module/tar.gz/V1.20
    # tar -zxvf fastdfs-nginx-module-1.20.tar.gz 

    vim /usr/local/src/fastdfs-nginx-module-1.20/src/config
    修改为如下内容

    ngx_addon_name=ngx_http_fastdfs_module
    
    if test -n "${ngx_module_link}"; then
    ngx_module_type=HTTP
    ngx_module_name=$ngx_addon_name
    ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
    ngx_module_libs="-lfastcommon -lfdfsclient"
    ngx_module_srcs="$ngx_addon_dir/ngx_http_fastdfs_module.c"
    ngx_module_deps=
    CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='2561024' -DFDFS_MOD_CONF_FILENAME='"/etc/fdfs/mod_fastdfs.conf"'"
    . auto/module
    else
    HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
    CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
    CORE_LIBS="$CORE_LIBS -lfastcommon -lfdfsclient"
    CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='2561024' -DFDFS_MOD_CONF_FILENAME='"/etc/fdfs/mod_fastdfs.conf"'"
    fi

    改变的文件内容
    ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
    CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

    • 配置nginx,添加fastdfs-nginx-module 模块 
    # 先停掉nginx服务 如果没有配置为服务 则使用 # /usr/local/nginx/sbin/nginx -s stop
    # systemctl stop nginx     
    #进入nginx源码目录
    # cd /usr/local/src/nginx-1.16.0/   
    #添加fastdfs-nginx-module 模块
    #[root@localhost nginx-1.16.0]#./configure  --add-module=/usr/local/src/fastdfs-nginx-module-1.20/src
    #重新编译安装nginx
    #[root@localhost nginx-1.16.0]# make
    #[root@localhost nginx-1.16.0]# make install
    
    #验证是否加载fastdfs-nginx-module模块是否 ,有如下标红部分表示成功
    # /usr/local/nginx/sbin/nginx -V
    nginx version: nginx/1.16.0
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
    configure arguments: --add-module=/usr/local/src/fastdfs-nginx-module-1.20/src
    
    • 复制 fastdfs-nginx-module 源码中的配置文件 mod_fastdfs.conf 到/etc/fdfs 目录, 并修改

    # cp /usr/local/src/fastdfs-nginx-module-1.20/src/mod_fastdfs.conf /etc/fdfs/
    修改如下配置,其它默认

    # 连接超时时间
    connect_timeout=10
    
    # Tracker Server
    tracker_server=192.168.0.200:22122
    tracker_server=192.168.0.201:22122
    
    # StorageServer 默认端口
    storage_server_port=23000
    
    # 如果文件ID的uri中包含/group**,则要设置为true
    #url_have_group_name = true
    
    # Storage 配置的store_path0路径,必须和storage.conf中的一致
    store_path0=/fastdfs/storage
    
    • 复制 FastDFS 的部分配置文件到/etc/fdfs 目录

    #cd /usr/local/src/fastdfs-5.11/conf/
    [root@localhost conf]# cp anti-steal.jpg http.conf mime.types /etc/fdfs/

    • 配置nginx,修改nginx.conf
    # vim /usr/local/nginx/conf/nginx.conf
    修改配置,其它的默认
    在80端口下添加fastdfs-nginx模块
    location ~/group([0-9])/M00 {
        ngx_fastdfs_module;
    }

    完整配置如下 供参考

    user root;
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
        server {
    
            listen      9888 ;
            server_name  192.168.0.200;
    
           # location /group1/M00{
             # alias /fastdfs/storage/data/;
            # autoindex on;
           #}
     location ~/group[0-9]/ {
                    ngx_fastdfs_module;
                }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
            root   html;
           }
        }
    
    }
    

     

    注意:

      listen 9888端口值是要与 /etc/fdfs/storage.conf 中的 http.server_port=9888 (前面改成9888了)相对应。如果改成其它端口,则需要统一,同时在防火墙中打开该端口。

      location 的配置,如果有多个group则配置location ~/group([0-9])/M00 ,没有则不用配group。

    • 在 /fastdfs/storage 文件存储目录下创建软连接,将其链接到实际存放数据的目录,这一步可以省略。

    ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00

    • 启动nginx

    # systemctl start nginx

    • 在地址栏访问。

    能下载文件就算安装成功。注意和之前直接使用nginx路由访问不同的是,这里配置 fastdfs-nginx-module 模块,可以重定向文件链接到源服务器取文件。

    五 最终部署结构图

    :可以按照下面的结构搭建环境。

     

     

    六、Java客户端

    前面文件系统平台搭建好了,现在就要写客户端代码在系统中实现上传下载,这里只是简单的测试代码。

    1、首先需要搭建 FastDFS 客户端Java开发环境

    ① 项目中使用maven进行依赖管理,可以在pom.xml中引入如下依赖即可:

    <dependency>
       <groupId>net.oschina.zcx7878</groupId>
       <artifactId>fastdfs-client-java</artifactId>
       <version>1.27.0.0</version>
    </dependency>

    其它的方式,参考官方文档:https://github.com/happyfish100/fastdfs-client-java

    ② 引入配置文件

    可直接复制包下的 fastdfs-client.properties.sample 或者 fdfs_client.conf.sample,到你的项目中,去掉.sample。

    我这里直接复制 fastdfs-client.properties.sample 中的配置到项目配置文件 config.properties 中,修改tracker_servers。只需要加载这个配置文件即可

    2、客户端API

    个人封装的FastDFS Java API以同步到github:https://github.com/bojiangzhou/lyyzoo-fastdfs-java.git

     

    七、权限控制

    前面使用nginx支持http方式访问文件,但所有人都能直接访问这个文件服务器了,所以做一下权限控制。

    FastDFS的权限控制是在服务端开启token验证,客户端根据文件名、当前unix时间戳、秘钥获取token,在地址中带上token参数即可通过http方式访问文件。

    ① 服务端开启token验证

    修改http.conf
    # vim /etc/fdfs/http.conf
    
    设置为true表示开启token验证
    http.anti_steal.check_token=true
    
    设置token失效的时间单位为秒(s)
    http.anti_steal.token_ttl=1800
    
    密钥,跟客户端配置文件的fastdfs.http_secret_key保持一致
    http.anti_steal.secret_key=FASTDFS1234567890
    
    如果token检查失败,返回的页面
    http.anti_steal.token_check_fail=/ljzsg/fastdfs/page/403.html

     

    记得重启服务。

    ② 配置客户端

    客户端只需要设置如下两个参数即可,两边的密钥保持一致。

    # token 防盗链功能
    fastdfs.http_anti_steal_token=true
    # 密钥
    fastdfs.http_secret_key=FASTDFS1234567890

    ③ 客户端生成token

    访问文件需要带上生成的token以及unix时间戳,所以返回的token是token和时间戳的拼接。

    之后,将token拼接在地址后即可访问:file.ljzsg.com/group1/M00/00/00/wKgzgFnkaXqAIfXyAAEoRmXZPp878.jpeg?token=078d370098b03e9020b82c829c205e1f&ts=1508141521

     

     1     /**
     2      * 获取访问服务器的token,拼接到地址后面
     3      *
     4      * @param filepath 文件路径 group1/M00/00/00/wKgzgFnkTPyAIAUGAAEoRmXZPp876.jpeg
     5      * @param httpSecretKey 密钥
     6      * @return 返回token,如: token=078d370098b03e9020b82c829c205e1f&ts=1508141521
     7      */
     8     public static String getToken(String filepath, String httpSecretKey){
     9         // unix seconds
    10         int ts = (int) Instant.now().getEpochSecond();
    11         // token
    12         String token = "null";
    13         try {
    14             token = ProtoCommon.getToken(getFilename(filepath), ts, httpSecretKey);
    15         } catch (UnsupportedEncodingException e) {
    16             e.printStackTrace();
    17         } catch (NoSuchAlgorithmException e) {
    18             e.printStackTrace();
    19         } catch (MyException e) {
    20             e.printStackTrace();
    21         }
    22 
    23         StringBuilder sb = new StringBuilder();
    24         sb.append("token=").append(token);
    25         sb.append("&ts=").append(ts);
    26 
    27         return sb.toString();
    28     }

    ④ 注意事项

    如果生成的token验证无法通过,请进行如下两项检查:
      A. 确认调用token生成函数(ProtoCommon.getToken),传递的文件ID中没有包含group name。传递的文件ID格式形如:M00/00/00/wKgzgFnkTPyAIAUGAAEoRmXZPp876.jpeg

      B. 确认服务器时间基本是一致的,注意服务器时间不能相差太多,不要相差到分钟级别。

    ⑤ 对比下发现,如果系统文件隐私性较高,可以直接通过fastdfs-client提供的API去访问即可,不用再配置Nginx走http访问。配置Nginx的主要目的是为了快速访问服务器的文件(如图片),如果还要加权限验证,则需要客户端生成token,其实已经没有多大意义。

     

    参考:https://www.cnblogs.com/chiangchou/p/fastdfs.html 
    https://blog.csdn.net/zzzgd_666/article/details/81911892
    https://blog.csdn.net/sinat_40399893/article/details/80548374
    https://blog.csdn.net/kamroselee/article/details/80334621

    FastDFS 配置文件详解http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1941456&extra=page%3D1%26filter%3Ddigest%26digest%3D1

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • FastDFS原理和过程

    万次阅读 2018-07-29 18:25:31
    前言: (1)每次上传文件后都会返回一个地址,用户需要自己保存此地址。 (2)为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,...
  • FastDFS

    2019-12-18 15:18:04
    FastDFS 简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题 关于上传 流程 1、client询问...
  • FastDFS详解

    千次阅读 2018-06-01 15:26:07
    由于项目的原因需要使用到存储图片的所以经过商讨使用FastDFS来存储图片 什么是FastDFS FastDFS是一个分布式的文件系统,首先听到之句话你可能有点懵,我们一步步的拆分这句话,什么是文件系统,安装一定的...
  • FastDFS部署之踩坑.

    2020-11-21 10:23:09
    开一台新的 centos 虚拟机. 安装 jdk1.8 yum install java-1.8.0-openjdk* 自己配置环境变量也可以,个人选择. 安装Nginx所需要的环境.(此案例自己下载nginx,自己编译.) 安装环境可参考...将
  • FastDFS详解(一)——简介

    千次阅读 2017-11-06 11:05:26
    在使用fdfs之前,需要对其有一定的了解,这篇文章作为准备篇,将针对fdfs的简介,功能性,使用场景等方面进行介绍 ...余庆从整个分布式文件系统的发展说起,谈到了FastDFS文件系统的概念和具体优缺点。
  • Nginx和FastDfs完整配置过程

    万次阅读 多人点赞 2019-04-18 17:09:56
    最近需要搭建一台上传下载的服务器,所以没办法硬着头皮就是干吧。本文讲述的步骤完全就是一步血泪史,当然如果你按照我得步骤走,我保证你不会出现错误,因为这一天零2个小时,完全就是我的试错史,当然也感谢 ...
  • FastDFS学习笔记

    千次阅读 2019-01-01 22:23:58
    文章目录FastDFS入门浅学一、FastDFS引言本地存储与分布式文件系统FastDFS概述FastDFS架构FastDFS环境搭建(虚拟机)1. 创建虚拟机克隆机2. 配置虚拟机3. 下载安装gcc4. 下载安装FastDFS5. 下载安装FastDFS依赖6. 解...
  • FastDFS安装教程

    千次阅读 2017-01-13 19:12:23
    操作系统: CentOS 6.7 64bit编译工具: git, C/C++ 编译工具集(gcc/make等等)libfastcommon: V1.24FastDFS: V5.0.7fastdfs-nginx-moduleNginx 1.8.1注明: 本教程三台linux服务器,安装两台storage服务,安装一台...
  • FastDFS安装配置(整合fastDFs和nginx)

    万次阅读 2018-02-28 11:31:34
    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站...
  • 单机版Fastdfs安装部署

    千次阅读 2019-03-25 16:52:43
    1、FastDFS_v5.05.tar.gz 2、libfastcommonV1.0.7.tar.gz 3、fastdfs-nginx-module_v1.16.tar.gz 4、nginx-1.10.2.tar.gz 二、确认环境端口是否可用,也可更换fastdfs默认端口 tracker使用:22122 storage...
  • Linux FastDFS 安装部署

    2019-08-28 11:33:11
    FastDFS是是一个轻量级、高性能的开源分布式文件系统,用纯C语言开发,包括文件存储、文件同步、文件访问(上传、下载)、存取负载均衡、在线扩容、相同内容只存储一份等功能,适合有大容量存储需求的应用或系统 ...
  • fastdfs安装

    2020-04-06 10:49:54
    1.安装c依赖:yum -y install gcc-c++ 2.安装fastdfs依赖:yum -y install libevent 3.解压fastdfs-5.11.zip 和libfastcommon-1.0.36.zip 4.安装libfastcommon cdlibfastcommon-1.0.36 ./make.sh ....
  • go-fastdfs 安装版web

    2020-07-17 17:41:07
    go-fastdfs是一个基于http协议的分布式文件系统,它基于大道至简的设计理念,一切从简设计,使得它的运维及扩展变得更加简单,它具有高性能、高可靠、无中心、免维护等优点。
  • 目录 安装前准备 (1)环境CentOS7,先下载所需要的全部工具 (2)搭建的所有工具截图 (3)创建好tracker和storage文件夹 开始安装 ...安装Nginx和fastdfs-nginx-module模块 (1)解压 nginx 和 fastd...
  • 将所需要的资料上传到/usr/local/fastdfs 目录下: 1、安装gcc GCC用来对C语言代码进行编译运行,使用yum命令安装: yum -y install gcc 后面会用到解压命令(unzip),所以这里可以用yum把unzip 也装一下 yum ...
  • fastdfs安装与配置

    千次阅读 2016-08-19 10:17:00
    CleverCode发现fastdfs是一个很好的开源的轻量级分布式文件系统。 本次安装资源包下载:http://download.csdn.net/download/clevercode/9607300。 1 安装fastdfs 安装之前确认先安装了《Linux中必备常用支持库的...

空空如也

1 2 3 4 5 ... 20
收藏数 30,711
精华内容 12,284
关键字:

fastdfs