FastDFS

作者: 懒猫随笔 | 来源:发表于2020-07-07 13:25 被阅读0次

    1.FastDFS介绍

    1.1FastDFS构成

    image.png

    FastDFS由存储服务器(Storage Server)、 跟踪服务器(Tracker Server)和客户端(Client)构成。

    • storage server:storage以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。
      group内每个storage的存储依赖于本地文件系统,storage可配置多个数据存储目录。storage接受到写文件请求时,会根据配置好的规则,选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多,在storage第一次启动时,会在每个数据存储目录里创建2级子目录,默认每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。

    • group :组,也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。

    • tracker server:跟踪服务器,主要做调度工作,起负载均衡的作用。集群中所有存储组和存储服务器的状态信息记录在内存中,所以占用内存很小。
      storage在启动后会连接tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。
      由于tracker上的元信息都是由storage汇报的信息生成的,不需要持久化任何数据,所以tracker非常容易扩展,直接增加tracker机器即可。

    • client:作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互,以客户端库的方式提供给用户使用。

    1.2 FastDFS特性

    • 分组存储,灵活简洁、对等结构,不存在单点
    • 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
    • 文件ID由FastDFS生成,作为文件访问凭证,FastDFS不需要传统的name server
    • 和流行的web server无缝衔接,FastDFS已提供apache和nginx扩展模块
    • 中、小文件均可以很好支持,支持海量小文件存储
    • 支持多块磁盘,支持单盘数据恢复
    • 支持相同内容的文件只保存一份,节约磁盘空间
    • 支持在线扩容 支持主从文件
    • 存储服务器上可以保存文件属性(meta-data)V2.0网络通信采用libevent,支持大并发访问,整体性能更好
    • 下载文件支持多线程方式,支持断点续传

    2. Linux下FastDFS的安装

    1. 安装编译环境
    yum install git gcc gcc-c++ make automake vim wget libevent -y
    
    1. 安装libfastcommon 基础库
    mkdir /usr/local/src/fastdfs
    cd /usr/local/src/fastdfs
    git clone https://github.com/happyfish100/libfastcommon.git -depth 1
    cd libfastcommon/
    ./make.sh && ./make.sh install
    
    1. 安装FastDFS
    cd /usr/local/src/fastdfs
    wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
    tar -zxvf V5.11.tar.gz
    cd fastdfs-5.11
    ./make.sh && ./make.sh install
    #配置文件准备
    cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
    cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
    cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf 
    cp /root/fastdfs/fastdfs-5.11/conf/http.conf /etc/fdfs
    cp /root/fastdfs/fastdfs-5.11/conf/mime.types /etc/fdfs
    
    vim /etc/fdfs/tracker.conf
    #需要修改的内容如下
    port=22122 
    base_path=/home/fastdfs
    
    vim /etc/fdfs/storage.conf
    #需要修改的内容如下
    port=23000 
    base_path=/home/fastdfs # 数据和日志文件存储根目录
    store_path0=/home/fastdfs # 第一个存储目录
    tracker_server=192.168.32.128:22122  #当前服务器的ip地址
    http.server_port=8888 #http访问端口,看情况修改
    
    1. 启动tracker和storage服务
    mkdir /home/fastdfs -p
    /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
    /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
    #查看所有运行的端口
    netstat -ntlp  #启动正常会显示22122和23000端口
    
    1. 测试上传
    vim /etc/fdfs/client.conf
    #需要修改的内容如下
    base_path=/home/fastdfs
    #tracker服务器IP和端口
    tracker_server=192.168.32.128:22122 
    
    #保存后测试,返回ID表示成功 如:group1/M00/00/00/xxx.png  temp.png是我预先准备的图片
    /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/fastdfs/temp.png
    group1/M00/00/00/wKjTiF7h5EWASb5aAACGZa9JdFo611.png
    
    1. 安装fastdfs-nginx-module模块(为了使用nginx访问fastdfs上传的文件)
    cd /usr/local/src/fastdfs
    wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz
    tar -xvf V1.20.tar.gz
    cd fastdfs-nginx-module-1.20/src
    vim config
    修改第5 行 和 15 行 修改成
    ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
    CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
    修改完成后保存
    cp mod_fastdfs.conf /etc/fdfs/
    vim /etc/fdfs/mod_fastdfs.conf
    #需要修改的内容如下
    tracker_server=192.168.32.128:22122 
    url_have_group_name=true
    store_path0=/home/fastdfs
    修改完成后保存退出
    mkdir -p /var/temp/nginx/client
    
    1. 安装nginx
    yum -y install pcre-devel openssl openssl-devel
    cd /usr/local/src/fastdfs
    wget http://nginx.org/download/nginx-1.15.6.tar.gz
    tar -zxvf nginx-1.15.6.tar.gz
    cd nginx-1.15.6/
    # 添加fastdfs-nginx-module模块
    ./configure --add-module=/usr/local/src/fastdfs/fastdfs-nginx-module-1.20/src
    编译安装
    make && make install
    查看模块是否安装上
    /usr/local/nginx/sbin/nginx -V
    

    nginx配置文件添加server

    vim /usr/local/nginx/conf/nginx.conf
    server {
       listen       8888; #storage.conf里的http.server_port端口
       server_name  localhost;
       location  ~/group[0-9]/ {
            ngx_fastdfs_module;
       }
     }
    #修改后保存退出,启动nginx
    /usr/local/nginx/sbin/nginx
    

    访问上传的图片

    关闭防火墙
    systemctl stop firewalld
    http://192.168.32.128:8888/group1/M00/00/00/xxx.png
    

    3. FastDFS 功能原理

    3.1 文件上传内部原理

    image.png
    1. 选择tracker server和group
      tracker接收到upload_file的请求时,会为该文件分配一个可以存储该文件的group,使用store_lookup(tracker.conf中的配置)配置group的规则:
    • 0、Round robin,所有的group间轮询
    • 1、Specified group,指定某一个确定的group
    • 2、Load balance,剩余存储空间多的group优先
    1. 选择storage server
      选择group后,tracker在group中选择一个storage给客户端,使用store_server(tracker.conf中的配置)配置storage的规则:
    • 0、Round robin,在group内的所有storage间轮询
    • 1、First server ordered by ip,按ip排序
    • 2、First server ordered by priority,按优先级排序(优先级在storage上配置)
    1. 选择storage path
      客户端向storage发送写请求,storage会为文件分配一个数据存储目录,使用store_path(storage.conf中的配置)配置存储规则:
    • 0、Round robin,多个存储目录间轮询
    • 2、剩余存储空间最多的优先
    1. 生成文件名
      由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。
    2. 返回文件id
      由group、存储目录、两级子目录、内部文件名、文件后缀名拼接而
    group1/M00/00/00/xxx.png
    

    3.2 文件下载

    image.png
    1. 客户端可以选择任意tracker server。
    2. 客户端发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后使用download_server 规则为该请求选择一个storage用来服务读请求。如下:
    • 0: 轮询方式,可以下载当前文件的任意一个 storage server进行轮询
    • 1: 哪个为源storage server 就用哪个
      由于group内的文件同步时在后台异步进行的,所以有可能出现在读到时候,文件还没有同步到某些storage server ,为了尽量避免访问到这样的storage,会有相应的文件同步规则。

    3.2 文件同步

    storage写完文件后,会由后台线程将文件同步至同group内其他的storage。
    每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,storage会以时间戳的方式记录向group内其他storage同步的进度。tracke在选择storage的时候会以同步进度作为参考

    3.4 文件删除

    删除处理流程与文件下载类似

    1. Client询问Tracker server可以删除指定文件的Storage server,参数为文件ID(包含组名和文件名)。
    2. Tracker server返回一台可用的Storage server。
    3. Client直接和该Storage server建立连接,完成文件删除。

    3.5 断点续传

    通过upload_appender_file接口完成,与普通文件不同的是,appender file不能被合并存储到trunk file。续传流程与文件上传类似,先定位到源storage,完成完整或部分上传,再通过binlog进行同group内server文件同步。

    3.6 文件HTTP访问支持

    FastDFS的tracker和storage都内置了http协议的支持。tracker在接收到请求时,通过http的redirect机制将请求重定向至文件所在的storage上

    4.FastDFS 集群配置

    192.168.32.128 192.168.32.129 92.168.32.130
    tracker tracker tracker
    storage(group1) storage(group1) storage(group2)
    nginx nginx nginx
    1. 配置tracker集群
      为了方便测试集群效果,将选择group的规则(server_lookup)改为轮询(此处只是为了查看集群效果,可按自己需求配置)
    vim /etc/fdfs/tracker.conf
    store_lookup=0 # 0是轮询,1是指定组,2是剩余存储空间多的group优先
    
    1. 配置storage集群
    vim /etc/fdfs/storage.conf
    tracker_server=192.168.32.128:22122
    tracker_server=192.168.32.129:22122
    tracker_server=192.168.32.120:22122
    group_name=group1 #注意组名 192.168.32.130 配置是 group2
    port=23000 #storage 的端口号,同一个组的 storage 端口号必须相同
    
    #配置完成后保存配置,然后重启tracker和storage服务
    /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
    /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
    
    1. 查看storage的日志 查看tracker集群信息
    cat /usr/local/src/fastdfs/logs/storaged.log
    

    如果报错可以先关闭防火墙

    systemctl stop firewalld
    
    1. 查看存储集群信息
    /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
    
    1. 更改client配置
    vim /etc/fdfs/client.conf
    tracker_server=192.168.32.128:22122
    tracker_server=192.168.32.129:22122
    tracker_server=192.168.32.130:22122
    
    1. Nginx 和 FastDFS集群结合
      更改mod_fastdfs插件配置
    vim /etc/fdfs/mod_fastdfs.conf
    tracker_server=192.168.32.128:22122
    tracker_server=192.168.32.129:22122
    tracker_server=192.168.32.130:22122
    group_name=group1 #注意组名 如果是group2 则一定要改
    

    nginx配置参考单机搭建
    最后 可以通过nginx访问任意一台服务器

    5 FastDFS优化

    5.1 最大连接数设置

    配置文件:tracker.conf 和 storage.conf
    参数名:max_connections
    缺省值:256
    说明:fastdfs的老版本会分配 max_connections 个buffer,在设置过大的情况下浪费内存。v5.0.4对预分配使用增量方式。tracker一次预分配1024
    个,storage一次预分配256个。
    

    使用v5.04及后续版本,可以根据实际需要将 max_connections 设置为一个较大的数值,比如 10240甚至更大。
    注意此时需要将一个进程允许打开的最大文件数调大到超过max_connections否则FastDFS server启动会报错。
    vi /etc/security/limits.conf 重启系统生效
    soft nofile 65535
    hard nofile 65535
    另外,对于32位系统,请注意使用到的内存不要超过3GB

    5.2 工作线程数设置

    配置文件:tracker.conf 和 storage.conf
    参数名: work_threads
    缺省值:4
    说明:为了避免CPU上下文切换的开销,以及不必要的资源消耗,不建议将本参数设置得过大。为了发挥出多个CPU的效能,系统中的线程数总和,应等于CPU总数。
    对于tracker server,公式为:
          work_threads + 1 = CPU数
    对于storage,公式为:
          work_threads + 1 + (disk_reader_threads + disk_writer_threads) *
    store_path_count = CPU数
    

    5.3 storage磁盘读写线程设置

    配置文件: storage.conf
    参数名:disk_rw_separated:磁盘读写是否分离
    参数名:disk_reader_threads:单个磁盘读线程数
    参数名:disk_writer_threads:单个磁盘写线程数
    如果磁盘读写混合,单个磁盘读写线程数为读线程数和写线程数之和,对于单盘挂载方式,磁盘读写线程分别设置为1即可
    如果磁盘做了RAID,那么需要酌情加大读写线程数,这样才能最大程度地发挥磁盘性能
    

    5.4 storage同步延迟相关设置

    配置文件: storage.conf
    参数名:sync_binlog_buff_interval:将binlog buffer写入磁盘的时间间隔,取值大于0,缺省值为60s
    参数名:sync_wait_msec:如果没有需要同步的文件,对binlog进行轮询的时间间隔,取值大于0,缺省值为200ms
    参数名:sync_interval:同步完一个文件后,休眠的毫秒数,缺省值为0
    为了缩短文件同步时间,可以将上述3个参数适当调小即可
    

    相关文章

      网友评论

          本文标题:FastDFS

          本文链接:https://www.haomeiwen.com/subject/kmeaqktx.html