FastDFS存储系统

背景

FastDFS 是一个分布式文件存储系统,利用文件服务器集群提供文件上传下载等服务。其分成两部分:Tracker Server和Storage Server

  • Tracker Server:负责负载和调度,文件上传/下载的时候,需要先将上传的请求发送给Tracker Server,Tracker与Storage Server联系沟通,确定好文件对应的ID(文件存储的网络地址信息),然后将该文件ID返回给客户端,该文件ID用于日后访问该文件的索引信息。当文件下载的时候,则需要由客户端(程序端)将文件的ID上传到Track Server,Track Server根据文件ID获取文件所在的Storage Server的IP和端口,然后将其返回给客户端。
  • Storage Server:负责文件存储,服务端上传的文件都存放在Storage Server中,它是利用操作系统的文件管理来实现

Track Server和Storage Server都可以实现集群,且在各自的集群中每个节点的地位都是相等的,类似于redis中的集群。

文件上传的时候,会返回对应的文件索引信息(文件ID),需要客户端自行保存,如下:

image-20201107082557144

  • group1:文件上传后,该文件所在的组(storage server)信息。
  • M00:Storage配置的虚拟路径。与磁盘选项store_path*对应。如果配置了store_path0,则为M00,若是store_path1,则为M01
  • 02/44:数据两级目录。每个虚拟磁盘路径下都会创建两级目录,用于存储数据文件
  • wKgDrE….sh:文件存储在服务器的名称。当文件上传到服务器的时候,Storage Server会根据Hash算法对文件的内容生成对应的Hash值,不同文件对应的Hash值不同(文件指纹),然后再结合Storage存储文件时的一些随机信息,生成文件名进行返回。该文件名中包含的内容:源存储服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

FastDFS存储系统解决大量文件存储的问题,并且在文件服务器已经满的情况下,可以通过添加Storage Server组的方式快速拓展,而且FastDFS可以对重复的文件只存储一遍(貌似还得安装别的拓展)。

环境搭建

Libfastcommon

  1. 下载依赖包,该包是FastDFS的依赖环境,必须安装

    1
    2
    # FastDFS官网:https://github.com/happyfish100/
    wget https://github.com/happyfish100/libfastcommon/archive/master.zip
  2. 解压并安装

    1
    2
    3
    4
    tar -zxvf master.zip
    cd libfastcommon-master
    ./make.sh
    ./make.sh install

FastDFS

  1. 下载FastDFS包,该包是FastDFS的包

    1
    wget https://github.com/happyfish100/fastdfs/archive/master.zip
  2. 解压并安装

    1
    2
    3
    4
    tar -zxvf master.zip
    cd fastdfs-master
    ./make.sh
    ./make.sh install

Nginx配置FastDFS

  1. nginx手动编译的时候需要安装依赖环境,此处我们尝试用nginx加载动态模块的方式

    1
    2
    3
    4
    5
    # 这里的安装包跟nginx提供的组件相关,视情况安装,因为我图简单直接apt install nginx
    sudo apt-get install openssl libssl-dev
    sudo apt-get install libpcre3 libpcre3-dev
    sudo apt-get install zlib1g-dev libgd-dev
    sudo apt-get install libxml2 libxml2-dev libxslt-dev
  2. 拉取拓展插件,和自己服务器上对应版本的nginx包

    1
    2
    3
    4
    5
    # 拉取nginx
    wget http://nginx.org/download/nginx-1.18.0.tar.gz

    # 拉取fastdfs-nginx-module拓展包
    wget https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zip
  3. 解压并编译

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    unzip nginx-1.18.0.tar.gz
    unzip master.zip

    # 查看当前nginx的配置,将configure部分的内容全部复制下来
    nginx -V

    # 获取fastdfs-nginx-module解压后的文件夹下src的绝对路径,因为编译动态模块文件的时候需要用到它
    # 此处是/usr/home/shuai/fastdfs-nginx-module/src

    # 编译nginx使用的文件的动态模块,configure的内容在原有配置的内容后,再追加fastdfs-nginx-module模块的路径
    cd nginx-1.18.0
    ./configure ... --add-dynamic-module=/home/shuai/fastdfs-nginx-module/src
    make
    make module

    # 执行完毕后,进入nginx-1.18.0/objs目录下,找到ngx_http_fastdfs_module.so文件
    sudo cp ngx_http_fastdfs_module.so /usr/lib/nginx/modules/
  4. 修改nginx配置文件,追加内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # 修改的是/etc/nginx/nginx.conf
    # nginx在读取文件的时候是需要权限的,因此可能需要配置有读取图片文件夹内容的用户
    # 此处我使用的是本机的用户
    user shuai;

    # 在配置文件顶部导入编译好的模块
    load_module /usr/lib/nginx/modules/ngx_http_fastdfs_module.so;

    # 在http配置项增加server配置信息
    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;
    }
    }
  5. 将第二步下载的fastdfs-nginx-module中src文件夹下的mod_fastdfs.conf复制到fdfs配置文件夹中

    1
    sudo cp /home/shuai/Desktop/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
  6. 修改mod_fastdfs.conf配置文件内容

    1
    2
    3
    4
    connect_timeout = 10
    tracker_server = 192.168.85.129:22122 # tracker服务器所在的IP和端口
    url_have_group_name = true # 配置返回的url中包含组的名称
    store_path0 = /home/shuai/fastdfs/storage # storage存放的路径
  7. 将下载的FastDFS解压包中的http.conf和mine.types复制到fdfs的配置文件夹中

    1
    2
    sudo cp ~/Desktop/fastdfs-master/conf/http.conf /etc/fdfs/
    sudo cp ~/Desktop/fastdfs-master/conf/mime.types /etc/fdfs/
  8. 配置完成后,重启nginx服务器

    1
    sudo nginx -s reload
  9. 上传文件,然后通过域名配置进行访问

    1
    https://127.0.0.1:8888/group1/M00/02/14/asdfhjalskdflaskhjdf.png

配置Tracker服务

  1. 创建Tracker日志文件及相关内容的存放目录

    1
    2
    # 这个目录随自己定
    sudo makedir -p /home/shuai/fastdfs/tracker
  2. 创建tracker的配置文件

    1
    sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
  3. 修改tracker.conf配置文件的内容

    1
    2
    3
    4
    5
    6
    7
    8
    # 绑定tracker的IP地址,不设置则会绑定该服务器下所有的IP信息
    bind-addr = 192.168.85.129

    # 绑定服务的IP
    port = 22122

    # 配置Tracker服务时存放的一些文件的路径
    base_path=/home/shuai/fastdfs/tracker
  4. 启动服务,并查看以下端口运行情况

    1
    2
    sudo service fdfs_trackerd start
    netstat -lntup | grep 22122

配置Storage服务

  1. 创建storage文件存放的目录

    1
    mkdir -p ~/fastdfs/storage
  2. 创建storage的配置文件

    1
    sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
  3. 修改storage.conf配置文件的内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 绑定storage的IP地址,不设置则会绑定该服务器下所有的IP信息
    # 要是绑定了,你没法上传文件,那就先注释掉这个试试
    bind-addr = 192.168.85.129

    # 绑定服务的IP
    port = 23000

    # 配置Storage服务时存放的一些日志零碎文件的路径
    base_path=/home/shuai/fastdfs/storage

    # 配置Storage服务存放上传下载的文件路径
    store_path0=/home/shuai/fastdfs/storage

    # 配置Tracker服务所在的服务器IP和端口
    tracker_server=192.168.85.129:22122
  4. 运行服务,并查看运行情况

    1
    2
    sudo service fdfs_storaged start
    netstat -lntup | grep 23000

配置Client

  1. 创建Client服务的配置文件

    1
    sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
  2. 修改client.conf的配置内容

    1
    2
    3
    4
    5
    # tracker服务的路径
    base_path=/home/python/fastdfs/tracker

    # 连接tracker服务的服务器IP和端口号
    tracker_server=192.168.85.129:22122
  3. 测试文件上传是否存在问题:前提是fdfs_trackerd和fdfs_storaged服务都已经启动

    1
    2
    # 执行如下命令,只要能返回类似:group1/M00/02/14/asdfhjalskdflaskhjdf.png类似的,就表示服务正常启动了
    fdfs_upload_file /etc/fdfs/client.conf 1.png
  4. 然后将该文件复制到django项目中,用于django与fastdfs进行交互