返回
Featured image of post FastDFS 学习笔记

FastDFS 学习笔记

FastDFS详解

学习目标

image-20220323120316386
image-20220323120316386

FastDFS 简介

FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。在UC基于FastDFS开发向用户提供了:网盘,社区,广告和应用下载等业务的存储服务。

FastDFS是一款开源的轻量级分布式文件系统纯C实现,支持Linux、FreeBSD等UNIX系统类google FS,不是通用的文件系统,只能通过专有API访问,目前提供了C、Java和PHP API为互联网应用量身定做,解决大容量文件存储问题,追求高性能和高扩展性FastDFS可以看做是基于文件的key value pair存储系统,称作分布式文件存储服务更为合适。

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

存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS 同时对文件的metadata进行管理。

所谓的文件metadata就是文件相关的属性,以键值对(K,V)的方式表示,如:size=1024,其中key为size,value为1024.文件的metadata是文件属性的列表,可以包含多个键值对。

跟踪器和存储器节点都可以又一台或多台服务器构成。跟踪器和存储器节点中的服务器均可以随时增加或减少而不会影响线上服务。其中 跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时进行增加或减少。

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

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

FastDFS 中的文件标识分为两个部分:卷名和文件名,两者缺一不可。

架构图

上传流程

  1. client询问 tracker 提供上传文件的storage,不需要附加参数;
  2. tracker 返回一台可用的storage;
  3. client直接和storage通讯完成文件的上传;

下载流程

  1. client询问tracker下载文件的storage,参数为文件标识(组名和文件名);
  2. tracker返回一台可用的storage;
  3. client直接和storage通讯完成文件下载;

术语介绍

  • TrackerServer 跟踪服务器,主要做任务的调度工作,在访问上起负载均衡的作用,记录storage server 的状态,是连接Client 和 Storage Serve的枢纽。
  • Storage Server:存储服务器,文件和meta data都保存在存储服务器上
  • group:组,也成为卷,同组内服务器上的文件是完全相同的
  • 文件标识:包括两部分:组名和文件名(包含路径)
  • meta data:文件相关属性,键值对方式,如:size=1023

同步机制

同一组内 storage server 之间时对等的,文件上传,删除等操作可以在任意一台 storage server上进行;

文件同步旨在同组内的storage server之间进行。采用 push 方式,既源服务器同步给目标服务器;

源服务器才需要同步,备份数据不需要再次同步,否则就构成环路了;

上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的所有数据(包含源头数据和备份数据)同步给改新增服务器·

FastDFS 和 其他文件存储的简单对比

FastDFS 和 集中存储方式对比

指标 FastDFS NFS 集中存储设备如:NetApp、NAS
线性扩容
文件高并发访问性能 一般
文件访问方式 专用API POSIX POSIX
硬件成本 较低 中等
相同文件内容只保存一份 支持 不支持 不支持

FastDFS 和 mogileFS对比

指标 FastDFS mogileFS
系统简洁性 简洁 只有两个角色: tracker和storage 一般 有三个角色: tracker,storage和存储文件信息的MySQL DB
系统性能 很高 没有使用数据库,文件同步直接点对点,不经过tracker中转 高 使用MySQL来存储文件索引信息,文件同步通过tracker调度和中转
系统稳定性 高 C语言开发,可以支持高并发和高负载 一般 Perl语言开发,高并发和高负载一般
RAID方式 分组(组内冗余) 动态冗余,灵活性一般
通信协议 专用协议,下载文件支持HTTP HTTP
技术文档 较详细 较少
文件附加属性(metadata) 支持 不支持
相同内容文件只保存一份 支持 不支持
下载文件时支持文件偏移量(断点续传) 支持 不支持

总结

FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。

  • 跟踪器主要做调度工作,在访问上起负载均衡的作用。

  • 存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口,FastDFS同时对文件的meta data进行管理。

FastDFS特性

  • 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
  • 支持相同内容的文件只保存一份,节约磁盘空间
  • 下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用
  • 支持在线扩容
  • 支持主从文件
  • 存储服务器上可以保存文件属性(meta-data)V2.0网络通信采用libevent,支持大并发访问,整体性能更好

FastDFS安装

安装资料和教程

(89条消息) 运维之路-CentOS7安装FastDFS_往復不息的博客-CSDN博客

链接:https://pan.baidu.com/s/1LAG2DegCoFZUgOJCNnUS3w?pwd=1234 提取码:1234 –来自百度网盘超级会员V4的分享

安装准备

  1. 上传安装包

  2. 安装运行环境

    yum -y install cmake make gcc-c++
    
  3. 安装fastdfs核心库 libfastcommon-V1.0.43.tar.gz

    # 创建安装目录
    mkdir -p /usr/local/fastdfs
    # 解压
    tar -zxvf libfastcommon-V1.0.43.tar.gz -C /usr/local/fastdfs
    
    # 进入解压目录
    cd /usr/local/fastdfs/libfastcommon-1.0.43
    
    # 编译并安装
    ./make.sh
    ./make.sh install
    
    # 创建fastdfs依赖软连接
    ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so 
    ln -s /usr/local/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so 
    ln -s /usr/local/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so 
    

安装fastdfs

  1. 解压并安装 fastdfs-V6.06.tar.gz

    # 解压
    tar -zxvf fastdfs-V6.06.tar.gz -C /usr/local/fastdfs
    # 进入解压路径
    cd /usr/local/fastdfs/fastdfs-6.06
    # 编译并安装
    ./make.sh
    ./make.sh install
    

    安装后,FastDFS主程序所在位置是:

    • /usr/bin 可执行文件所在位置

    • /usr/include/fastdfs 插件所在的位置

    • /etc/fdfs 配置文件和配置文件模板所在位置

      配置tracker.conf就是一台tracker服务器

      配置storage.conf就是一台storage服务器,所以tracker和storage可以在同一台服务器上

      /etc/fdfs
      ├── client.conf.sample
      ├── storage.conf.sample
      ├── storage_ids.conf.sample
      └── tracker.conf.sample
      
    • /etc/init.d/ 服务脚本所在的位置

      /etc/init.d
      ├── fdfs_storaged
      ├── fdfs_trackerd
      ├── functions
      └── README
      
  2. 配置tracker服务器

    tracker:

    • 端口:22122
    • base_path:/fastdfs/tracker

    创建配置文件

    # 进入 `/etc/fdfs` 配置文件和配置文件模板所在位置
    cd /etc/fdfs
    
    # 通过模板创建一份配置文件
    cp tracker.conf.sample tracker.conf
    # 修改配置文件
    vim tracker.conf
    ----
    port = 22122
    base_path = /fastdfs/tracker
    ----
    
    # 创建base_path目录
    mkdir -p /fastdfs/tracker
    

    启动 tracker服务

    # 进入启动脚本文件目录
    cd /etc/init.d/
    
    # 启动
    ./fdfs_trackerd start
    
    # 关闭
    # ./fdfs_trackerd stop
    
    # 重启
    # ./fdfs_trackerd restart
    
    # 查看启动状态
    # ./fdfs_trackerd status
    # ps -ef|grep fdfs
    

    开启启动

    vim /etc/rc.d/rc.local

    添加一下命令

    /etc/init.d/fdfs_trackerd start
    
  3. 配置storage服务器

    storage可以配置在另一台服务器操作和tracker解压一样

    storage:

    • port:23000
    • base_path(基础信息位置): /fastdfs/storage/base
    • store_path0(存放文件位置): /fastdfs/storage/store
    • tracker_server(跟踪器服务地址,配置多个就多条): 121.4.122.141:22122

    创建配置文件

    # 进入 `/etc/fdfs` 配置文件和配置文件模板所在位置
    cd /etc/fdfs
    
    # 通过模板创建一份配置文件
    cp tracker.conf.sample tracker.conf
    # 修改配置文件
    vim tracker.conf
    ----
    port = 23000
    base_path =  /fastdfs/storage/base
    store_path0 = /fastdfs/storage/store
    tracker_server = 121.4.122.141:22122
    ----
    
    # 创建base_path目录和文件存储目录
    mkdir -p /fastdfs/storage/base
    mkdir -p /fastdfs/storage/store
    

    启动 storage服务

    # 进入启动脚本文件目录
    cd /etc/init.d/
    
    # 启动
    ./fdfs_storaged start
    
    # 关闭
    # ./fdfs_storaged stop
    
    # 重启
    # ./fdfs_storaged restart
    
    # 查看启动状态
    # ./fdfs_storaged status
    # ps -ef|grep fdfs
    

    查看存储文件的目录

    启动成功查看文件存储结构

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

    我们发现他的目录结构使用的两层十六进制命名的,接下来我们通过一个api模块进行上传测试,查看文件访问路径的结构。

    group1/M00/00/00/eQR6jWI66g-ALzyCAA_BttUvEqM.tar.gz

​ 文件访问地址结构又 组名称+虚拟地址+两层十六进制文件加地址+文件名组成

Nginx安装

  1. 解压 nginx-1.16.1.tar.gz 、fastdfs-nginx-module-1.22.tar.gz 到 /user/local/fastdfs

    tar -zxvf nginx-1.16.1.tar.gz -C /user/local/fastdfs/
    tar -zxvf fastdfs-nginx-module-1.22.tar.gz -C /user/local/fastdfs/
    
  2. 进入fastdfs的nginx模组目录 /usr/local/fastdfs/fastdfs-nginx-module-1.22 修改配置文件

    • CORE_INCS: /usr/include/fastdfs /usr/include/fastcommon/
  3. 安装ngxin依赖

    yum install -y install libpcre3 libpcre3-dev openssl libssl-dev libperl-dev pcre-devel openssl openssl-devel
    
  4. 配置Nginx安装信息

    cd /usr/local/fastdfs/nginx-1.16.1/
    ./configure --prefix=/usr/local/nginx --add-module=/usr/local/fastdfs/fastdfs-nginx-module-1.22/src/
    mkdir -p /var/temp/nginx
    
    make
    make install
    
  5. Nginx模块配置

    • tracker_server=121.4.122.141:22122 (tracker服务器)
    • group_name=group1(组)
    • url_have_group_name = true (url中是否包含组名)
    • store_path0=/fastdfs/storage/store/ (storage存放文件的位置)

    拷贝模块配置文件到 /etc/fdfs

    cp /usr/local/fastdfs/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
    

    修改关键配置

    tracker_server=121.4.122.141:22122
    group_name=group1
    url_have_group_name = true
    store_path0=/fastdfs/storage/store/
    

    拷贝http相关配置

    cp /usr/local/fastdfs/fastdfs-6.06/conf/http.conf  /etc/fdfs/
    cp /usr/local/fastdfs/fastdfs-6.06/conf/mime.types  /etc/fdfs/
    ln -s /usr/local/lib64/libfdfsclient.so /usr/lib64/libfdfsclient.so 
    ln -s /fastdfs/storage/store/data/ /fastdfs/storage/store/data/M00
    

    修改nginx配置

    
    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       8888;
            server_name  localhost;
            location ~/group[0-9]/M00 {
                ngx_fastdfs_module;
            }
    
            location = /50x.html {
                root   html;
            }
        }
    
    }
    
    

    重启 storage 服务器并启动nginx

    # 重启 storage
    /etc/init.d/fdfs_storaged restart
    # 启动nginx
    ./usr/local/nginx/sbin/nginx
    

    上传一张图片进行测试

    # 上传图片
    /usr/local/bin/fdfs_upload_file /etc/fdfs/client.conf ben-neale-zpxKdH_xNSI-unsplash.jp
    # 图片地址
    group1/M00/00/00/eQR6jWI9QzWAVfiEAAXCMYpvFwU049.jpg
    

    访问测试

    http://121.4.122.141:8888/group1/M00/00/00/eQR6jWI9QzWAVfiEAAXCMYpvFwU049.jpg
    
Licensed under CC BY-NC-SA 4.0