分布式文件系统服务器FastDFS

1. 什么是FastDFS

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

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

Tracker server 做用是负载均衡和调度,经过 Tracker server 在文件上传时能够根据一些 策略找到 Storage server 提供文件上传服务。能够将 tracker 称为追踪服务器或调度服务 器。nginx

Storage server 做用是文件存储,客户端上传的文件最终存储在 Storage 服务器上, Storageserver 没有实现本身的文件系统而是利用操做系统 的文件系统来管理文件。能够将 storage 称为存储服务器。git

服务端两个角色:github

Tracker:管理集群,tracker 也能够实现集群。每一个 tracker 节点地位平等。收集 Storage 集群的状态。django

Storage:实际保存文件 Storage 分为多个组,每一个组之间保存的文件是不一样的。每 个组内部能够有多个成员,组成员内部保存的内容是同样的,组成员的地位是一致的,没有 主从的概念。ubuntu

2.文件上传流程

首先客户端请求Tracker服务获取到存储服务器的ip地址和端口,而后客户端根据返回的IP地址和端口号请求上传文件,存储服务器接收到请求后生产文件,而且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息,客户端保存相关信息上传完毕。vim

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

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

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

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

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

内部机制以下:

一、选择tracker server

当集群中不止一个tracker server时,因为tracker之间是彻底对等的关系,客户端在upload文件时能够任意选择一个trakcer。
选择存储的group
当tracker接收到upload file的请求时,会为该文件分配一个能够存储该文件的group,支持以下选择group的规则:

  • 一、Round robin,全部的group间轮询
  • 二、Specified group,指定某一个肯定的group
  • 三、Load balance,剩余存储空间多多group优先

二、选择storage server

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

  • 一、Round robin,在group内的全部storage间轮询
  • 二、First server ordered by ip,按ip排序
  • 三、First server ordered by priority,按优先级排序(优先级在storage上配置)

三、选择storage path

当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持以下规则:

  • 一、Round robin,多个存储目录间轮询
  • 二、剩余存储空间最多的优先

四、生成Fileid

选定存储目录以后,storage会为文件生一个Fileid,由storage server ip、文件建立时间、文件大小、文件crc32和一个随机数拼接而成,而后将这个二进制串进行base64编码,转换为可打印的字符串。
选择两级目录
当选定存储目录以后,storage会为文件分配一个fileid,每一个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜想),路由到其中一个子目录,而后将文件以fileid为文件名存储到该子目录下。

五、生成文件名

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

3.文件下载流程

客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,而后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。

跟upload file同样,在download file时客户端能够选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、建立时间等信息,而后为该请求选择一个storage用来服务读请求。因为group内的文件同步时在后台异步进行的,因此有可能出如今读到时候,文件尚未同步到某些storage server上,为了尽可能避免访问到这样的storage,tracker按照以下规则选择group内可读的storage。

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

4.同步时间管理

当一个文件上传成功后,客户端立刻发起对该文件下载请求(或删除请求)时,tracker是如何选定一个适用的存储服务器呢?
其实每一个存储服务器都须要定时将自身的信息上报给tracker,这些信息就包括了本地同步时间(即,同步到的最新文件的时间戳)。而tracker根据各个存储服务器的上报状况,就可以知道刚刚上传的文件,在该存储组中是否已完成了同步。同步信息上报以下图:

写文件时,客户端将文件写至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生成一个同步时间戳。

精巧的文件ID-FID

说到下载就不得不提文件索引(又称:FID)的精巧设计了。文件索引结构以下图,是客户端上传文件后存储服务器返回给客户端,用于之后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

  • 组名:文件上传后所在的存储组名称,在文件上传成功后有存储服务器返回,须要客户端自行保存。
  • 虚拟磁盘路径:存储服务器配置的虚拟路径,与磁盘选项store_path*对应。
  • 数据两级目录:存储服务器在每一个虚拟磁盘路径下建立的两级目录,用于存储数据文件。
  • 文件名:与文件上传时不一样。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件建立时间戳、文件大小、随机数和文件拓展名等信息。

快速定位文件

知道FastDFS FID的组成后,咱们来看看FastDFS是如何经过这个精巧的FID定位到须要访问的文件。

  • 一、经过组名tracker可以很快的定位到客户端须要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问;
  • 二、存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”能够很快定位到文件所在目录,并根据文件名找到客户端须要访问的文件。

简易FastDFS架构

5  FastDFS安装

5.1 安装fastdfs依赖包

1. 解压缩libfastcommon-master.zip

2. 进入到libfastcommon-master的目录中

3. 执行 ./make.sh

4. 执行 sudo ./make.sh install

 

5.2 安装fastdfs

1. 解压缩fastdfs-master.zip

2. 进入到 fastdfs-master目录中

3. 执行 ./make.sh

4. 执行 sudo ./make.sh install

 

5.3 配置跟踪服务器tracker

1. sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf

2. 在/home/python/目录中建立目录 fastdfs/tracker     

mkdir –p /home/python/fastdfs/tracker

3. 编辑/etc/fdfs/tracker.conf配置文件    sudo vim /etc/fdfs/tracker.conf

修改 base_path=/home/python/fastdfs/tracker

 

5.4 配置存储服务器storage

1. sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

2. 在/home/python/fastdfs/ 目录中建立目录 storage

   mkdir –p /home/python/fastdfs/storage

3. 编辑/etc/fdfs/storage.conf配置文件  sudo vim /etc/fdfs/storage.conf

修改内容:

base_path=/home/python/fastdfs/storage

store_path0=/home/python/fastdfs/storage

tracker_server=本身ubuntu虚拟机的ip地址:22122

 

5.5 启动tracker 和 storage

sudo service fdfs_trackerd start

sudo service fdfs_storaged start

 

5.6 测试是否安装成功

1. sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf

2. 编辑/etc/fdfs/client.conf配置文件  sudo vim /etc/fdfs/client.conf

修改内容:

base_path=/home/python/fastdfs/tracker

tracker_server=本身ubuntu虚拟机的ip地址:22122

3. 上传文件测试:

fdfs_upload_file /etc/fdfs/client.conf 要上传的图片文件

若是返回相似group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg的文件id则说明文件上传成功

 

5.7 安装nginx及fastdfs-nginx-module

1. 解压缩 nginx-1.8.1.tar.gz

2. 解压缩 fastdfs-nginx-module-master.zip

3. 进入nginx-1.8.1目录中

4. 执行

sudo ./configure --prefix=/usr/local/nginx/ --add-module=fastdfs-nginx-module-master解压后的目录的绝对路径/src

 

sudo ./make

sudo ./make install

5. sudo cp fastdfs-nginx-module-master解压后的目录中src下的mod_fastdfs.conf  /etc/fdfs/mod_fastdfs.conf

6. sudo vim /etc/fdfs/mod_fastdfs.conf

修改内容:

connect_timeout=10

tracker_server=本身ubuntu虚拟机的ip地址:22122

url_have_group_name=true

store_path0=/home/python/fastdfs/storage

7. sudo cp 解压缩的fastdfs-master目录中的http.conf  /etc/fdfs/http.conf

8. sudo cp 解压缩的fastdfs-master目录中的mime.types /etc/fdfs/mime.types

9.sudo vim /usr/local/nginx/conf/nginx.conf

在http部分中添加配置信息以下:

server {

            listen       8888;

            server_name  localhost;

            location ~/group[0-9]/ {

                ngx_fastdfs_module;

            }

            error_page   500 502 503 504  /50x.html;

            location = /50x.html {

            root   html;

            }

        }

10. 启动nginx

sudo /usr/local/nginx/sbin/nginx

6. 使用python客户端上传测试

1. workon django_py3

2. 进入fdfs_client-py-master.zip所在目录

3. pip install fdfs_client-py-master.zip

4.进行文件上传

>>> from fdfs_client.client import Fdfs_client

>>> client = Fdfs_client('/etc/fdfs/client.conf')

>>> ret = client.upload_by_filename('test')

>>> ret

{'Group name':'group1','Status':'Upload successed.', 'Remote file_id':'group1/M00/00/00/

        wKjzh0_xaR63RExnAAAaDqbNk5E1398.py','Uploaded size':'6.0KB','Local file name':'test'

        , 'Storage IP':'192.168.243.133'}

官方接口文档 https://github.com/jefforeilly/fdfs_client-py

相关文章
相关标签/搜索