FastDFS软件介绍


1.什么是FastDFS

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

2.FastDFS架构

FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。Tracker server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。Storage server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。

2.2.1Tracker集群

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

2.2.2Storage集群

Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。

2.2.3Storage状态收集

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

2.2.4文件上传流程

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

2.2.5文件下载流程

tracker根据请求的文件路径即文件ID 来快速定义文件。 
比如请求下边的文件: 
group1/M00/00/10/agIBmlee7fOATa1MAAFw6fBcZXY841.png 
1.通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问。 
2.存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。

个人理解

1.FastDFS是一个文件存储服务,无论是什么类型的文件都可以存储,不仅仅是可以用作图片服务器的。

2.上传文件的流程就是通过nginx进行http访问,nginx找到trackerServer,给了trackerServer一个文件,trackerServer拿到这个文件之后,根据自己的规则存储到指定的storageServer的相应路径下。 
同时,trackerServer会生成文件在服务器上的存储路径,通过nginx返回给客户端,客户端拿到这个路径,在前面加上服务器地址就可以访问这个文件了。

3.不难看出,在服务器上需要安装三个部分:分模块一步一步安装就不容易出错了

3.1 trackerServer

3.2 storageServer

3.3 nginx和fastDFS整合

安装准备

  1. 点击下面的链接,下载文件并上传到服务器,里面包含所有需要用到的软件(nginx请参照nginx安装教程) 
    http://106.2.1.154/group1/M00/00/10/agIBmlee9ZuAO9ZDAAmmYclEtSk827.rar

  2. 安装libevent工具包

    yum -y install libevent

  3. 安装libfastcommonv1.0.7工具包

    • 解压缩
    • ./make.sh
    • ./make.sh install

安装步骤

本示例为单trackerServer和storageServer,集群不做说明


安装trackerServer

  1. 解压缩fastDFS_v5.05.tar.gz(tracker和storage在同一个包内,所以只需要解压一次)

    • .make.sh
    • .make.sh install

    安装完成后在/usr/bin/目录下有以fdfs开头的文件都是编译出来的。配置文件都放到/etc/fdfs文件夹。

  2. 把解压目录目录下的conf文件夹下的文件都复制到/etc/fdfs下

    cp /root/FastDFS/conf /etc/fdfs

  3. 配置tracker服务。修改/etc/fdfs/tracker.conf文件

    base_path=/home/yuqing/fastdfs

    将该路径改为自己定义的路径,该路径必须存在,用于存放数据和日志文件。

  4. 启动tracker

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

    重启:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

  5. 设置开机自动启动

    编辑配置:vim /etc/rc.d/rc.local

    添加命令:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

安装storageServer

  1. 如果和trackerServer不是安装在同一台服务器,需要重复执行上个步骤中的1和2两个步骤。

  2. 配置storage服务。修改/etc/fdfs/storage.conf文件

    base_path=/home/yuqing/fastdfs:storage服务日志存放路径,该路径必须存在

    store_path0=/home/yuqing/fastdfs:图片的保存路径,该路径必须存在

    tracker_server=192.168.25.133:22122:指定tracker服务器的ip和端口

  3. 启动storageServer

    启动:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

    重启:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

  4. 设置开机自启动

    编辑 vim /etc/rc.d/rc.local

    添加 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

  5. 修改防火墙设置,添加如下规则

    修改防火墙命令:vim /etc/sysconfig/iptables

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT 
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT 
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT 
    重启防火墙:service iptables restart

接下来就可以测试我们是否搭建成功了

完成测试


使用自带的test进行测试

  1. 配置客户端

    vim /etc/fdfs/client.conf:修改配置文件

    base_path=/home/fastdfs/client:客户端日志文件保存路径

    tracker_server=192.168.25.133:22122:指定tracker的ip和端口

  2. 测试

    /usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/test.jpg:在Linux内部进行图片上传

  3. 结果

    当出现如下画面时,说明配置成功了,其中的地址即为该文件的访问地址。但是此时我们还不可以通过外网访问,因为还没有配置http服务,接下来,安装Nginx。 

搭建Nginx提供Http外网访问

使用官方提供的nginx插件fastdfs-nginx-module_v1.16.tar.gz,对nginx重新编译。

  1. 解压插件压缩包 (本例为root目录下)

    tar -zxvf fastdfs-nginx-module_v1.16.tar.gz

  2. 修改解压缩包文件下的/root/fastdfs-nginx-module/src/config文件

    把其中的local去掉,如下图:

  3. 解压缩nginx,并进入该目录

    tar -zxf nginx-1.8.0.tar.gz

  4. 对nginx进行config

    ./configure \

    --prefix=/usr/local/nginx \

    --pid-path=/var/run/nginx/nginx.pid \

    --lock-path=/var/lock/nginx.lock \

    --error-log-path=/var/log/nginx/error.log \

    --http-log-path=/var/log/nginx/access.log \

    --with-http_gzip_static_module \

    --http-client-body-temp-path=/var/temp/nginx/client \

    --http-proxy-temp-path=/var/temp/nginx/proxy \

    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \

    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \

    --http-scgi-temp-path=/var/temp/nginx/scgi \

    --add-module=/root/fastdfs-nginx-module/src

    注意:

    最后一行--add-module=/root/fastdfs-nginx-module/src其中的/root/fastdfs-nginx-module/src 
    为fastdfs-nginx-module_v1.16.tar.gz的解压路径。

    上边将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录

  5. 安装nginx

    make

    make install

  6. 复制并修改nginx和fasts整合的配置文件

    cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs

    vim /etc/fdfs/mod_fastdfs.conf

    base_path=/tmp 日志存放位置

    tracker_server=192.168.25.133:22122 tracerServer的服务器地址

    url_have_group_name = true 是否包含组名group

    store_path0=/home/fastdfs/storage 图片保存路径,就是包含data的那个路径,这个别弄错了

  7. 复制文件

    cp /usr/lib64/libfdfsclient.so /usr/lib/ 32位软件

  8. 修改nginx访问配置

    server {
        listen       80;
        server_name  192.168.25.133;
        location /group1/M00/{
            #root /home/FastDFS/fdfs_storage/data;
            ngx_fastdfs_module;`
        }
    }
    
  9. 设置nginx自启动

    ① 首先编写脚本文件

    vi /etc/init.d/nginx

    nginxd=/usr/local/nginx/sbin/nginx
    nginx_config=/usr/local/nginx/conf/nginx.conf
    nginx_pid=/var/run/nginx.pid
    RETVAL=0
    prog="nginx"
    
    . /etc/rc.d/init.d/functions
    
    . /etc/sysconfig/network
    
    [ ${NETWORKING} = "no" ] && exit 0
    [ -x $nginxd ] || exit 0
    
    start() {
    if [ -e $nginx_pid ];then
    echo "nginx already running...."
    exit 1
    fi
    echo -n $"Starting $prog: "
    daemon $nginxd -c ${nginx_config}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
    return $RETVAL
    }
    
    stop() {
        echo -n $"Stopping $prog: "
        killproc $nginxd
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
    }
    
    reload() {
        echo -n $"Reloading $prog: "
        killproc $nginxd -HUP
        RETVAL=$?
        echo
    }
    
    case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    reload)
        reload
        ;;
    restart)
        stop
        start
        ;;
    status)
        status $prog
        RETVAL=$?
        ;;
    *)
    echo $"Usage: $prog {start|stop|restart|reload|status|help}"
    exit 1
    esac
    exit $RETVAL
    

    wq保存退出

    ② 设置文件的访问权限

    `chmod a+x /etc/init.d/nginx`
    (a+x ==> all user can execute  所有用户可执行)
    

    ③ nginx状态、启动、重启、停止

    /etc/init.d/nginx status 查看状态

    /etc/init.d/nginx start 启动

    /etc/init.d/nginx stop 停止

    /etc/init.d/nginx restart 重启

    ④加入到rc.local文件中

    vim /etc/rc.local

    /etc/init.d/nginx start 下次系统重启后,nginx会自启动

  10. 现在就可以用外网访问已经上传的图片了

    我们可以用内部测试test工具来进行上传图片(返回本文档第一部分查看),将返回的结果复制到浏览器,就可以访问上传的文件了。图片的话会直接在浏览器打开。

    终于搭建好了,不过还没完,还要和Java进行结合,才能利用起来。

Java整合+工具类


官方提供了jar包,已经在教程开始的文件中了,下载下来,放到项目中去,接下来就看具体的java代码流程了。

编写了工具类的word使用说明书,更加详细,下载地址如下 
http://106.2.1.154/group1/M00/00/10/agIBmlefHwaAePorAAG2DpjKZy840.docx

  1. 使用java基础代码操作的流程

    java

    @Test
    public void testUpload() throws Exception {
        // 1、把FastDFS提供的jar包添加到工程中
        // 2、初始化全局配置。加载一个配置文件。
        ClientGlobal.init("D:\\workspaces-itcast\\JaveEE18\\taotao- manager\\taotao-manager-web\\src\\main\\resources\\properties\\client.conf");
        // 3、创建一个TrackerClient对象。
        TrackerClient trackerClient = new TrackerClient();
        // 4、创建一个TrackerServer对象。
        TrackerServer trackerServer = trackerClient.getConnection();
        // 5、声明一个StorageServer对象,null。
        StorageServer storageServer = null;
        // 6、获得StorageClient对象。
        StorageClient storageClient = new StorageClient(trackerServer,  storageServer);
        // 7、直接调用StorageClient对象方法上传文件即可。
        String[] strings = storageClient.upload_file("D:\\Documents\    \Pictures\\images\\2f2eb938943d.jpg", "jpg", null);
        for (String string : strings) {
            System.out.println(string);
        }
    }
    

    配置文件Client.conf

    tracker_server=192.168.25.133:22122

  2. 使用工具类上传

    测试方法

    @Test
    public void testFastDfsClient() throws Exception {
        FastDFSClient client = new FastDFSClient("D:\\workspaces-itcast\\JaveEE18\\taotao-manager\\taotao-manager-web\\src\\main\\resources\\properties\\client.conf");
        String uploadFile = client.uploadFile("D:\\Documents\\Pictures\\images\\200811281555127886.jpg", "jpg");
        System.out.println(uploadFile);//返回的是文件的
    }
    

    工具类代码

    package com.maxrocky.tools;
    
    import java.io.File;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.csource.common.NameValuePair;
    import org.csource.fastdfs.ClientGlobal;
    import org.csource.fastdfs.StorageClient1;
    import org.csource.fastdfs.StorageServer;
    import org.csource.fastdfs.TrackerClient;
    import org.csource.fastdfs.TrackerServer;
    
    public class FastDFSClient {
    
    private TrackerClient trackerClient = null;
    private TrackerServer trackerServer = null;
    private StorageServer storageServer = null;
    private StorageClient1 storageClient = null;
    
    public FastDFSClient(String conf) throws Exception {
        if (conf.contains("classpath:")) {
            conf = conf.replace("classpath:", this.getClass().getResource("/").getPath());
        }
        ClientGlobal.init(conf);
        trackerClient = new TrackerClient();
        trackerServer = trackerClient.getConnection();
        storageServer = null;
        storageClient = new StorageClient1(trackerServer,   storageServer);
    }
    
    /**
    * 上传文件方法
    * <p>Title: uploadFile</p>
    * <p>Description: </p>
    * @param fileName 文件全路径
    * @param extName 文件扩展名,不包含(.)
    * @param metas 文件扩展信息
    * @return
    * @throws Exception
    */
    public String uploadFile(String fileName, String extName, NameValuePair[] metas) throws Exception {
        String result = storageClient.upload_file1(fileName, extName, metas);
        return result;
    }
    
    public String uploadFile(String fileName) throws Exception {
        return uploadFile(fileName, null, null);
    }
    
    public String uploadFile(String fileName, String extName) throws Exception {
        return uploadFile(fileName, extName, null);
    }
    
    /**
    * 上传文件方法
    * <p>Title: uploadFile</p>
    * <p>Description: </p>
    * @param fileContent 文件的内容,字节数组
    * @param extName 文件扩展名
    * @param metas 文件扩展信息
    * @return
    * @throws Exception
    */
    public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) throws Exception {
        String result = storageClient.upload_file1(fileContent, extName, metas);
        return result;
    }
    
    public String uploadFile(byte[] fileContent) throws Exception {
        return uploadFile(fileContent, null, null);
    }
    
     public String uploadFile(byte[] fileContent, String extName) throws Exception {
        return uploadFile(fileContent, extName, null);
     }
    }

FastDFS搭建及java整合代码【转】的更多相关文章

  1. 20.fastDFS集群java代码测试

    1.工程结构   2.代码内容 FastdfsClientTest.java代码   package cn.itcast.fastdfs.cliennt; import java.io.File; i ...

  2. 搭建Nginx+JAVA环境

    搭建Nginx+JAVA环境 Apache对Java的支持很灵活,他们的结合度也很高,例如Apache+Tomcat和Apache+resin等都可以实现对Java应用的支持.Apache一般采用一个 ...

  3. Intellij IDEA采用Maven+Spring MVC+Hibernate的架构搭建一个java web项目

    原文:Java web 项目搭建 Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring ...

  4. pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页

    java 后台代码实现分页 demo 实力 自己写的 标签分页 package com.cszoc.sockstore.util; import java.util.HashMap;import ja ...

  5. 经典KMP算法C++与Java实现代码

    前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...

  6. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  7. 分享:根据webservice WSDL地址自动生成java调用代码及JAR包

    分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...

  8. [原创]Java静态代码检查工具介绍

    [原创]Java静态代码检查工具介绍 一  什么是静态代码检查? 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数 ...

  9. 最近开始研究PMD(一款采用BSD协议发布的Java程序代码检查工具)

    PMD是一款采用BSD协议发布的Java程序代码检查工具.该工具可以做到检查Java代码中是否含有未使用的变量.是否含有空的抓取块.是否含有不必要的对象等.该软件功能强大,扫描效率高,是Java程序员 ...

随机推荐

  1. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

  2. CI框架整合yar

    第一步:在CI框架中libraries目录下建立yar.php 文件 内容: <?php /** * yar 接口 */ class Yar { /** * 构造函数 * * @return v ...

  3. swift学习笔记之-方法部分

    //方法部分 import UIKit //方法(Methods) /*方法是与某些特定类型相关联的函数,类.结构体.枚举都可以定义实例方法 实例方法(Instance Methods): 1.属于某 ...

  4. cocos2d-x CCScrollView和CCTableView的使用(转载)

    转载请注明来自:Alex Zhou的程序世界,本文链接:http://codingnow.cn/cocos2d-x/1024.html //============================== ...

  5. Angularjs的My97DatePicker扩展

    对于日期控件来说,My97DatePicker算得上是个优秀的东东了.好几个项目都用的它. 新项目中也是一样,不过区别是使用的Angularjs.二者不会冲突,不过以往情况下使用的 ng-model ...

  6. 使用 array_multisort 对多维数组排序

    array_multisort() 函数对多个数组或多维数组进行排序. 用法详看:http://www.w3school.com.cn/php/func_array_multisort.asp 例子: ...

  7. Beetl2.2使用说明书20151201

    李家智<xiandafu@126.com> Table of Contents 1. 什么是Beetl 2. 基本用法 2.1. 从GroupTemplate开始 2.2. 模板基础配置 ...

  8. iOS 字体滚动效果 ScrollLabel

    写了一个简单的字体滚动效果. 用了一种取巧的方式,传入两个一摸一样的Label(当然也可以是别的视图), 话不多说,代码里面讲解. SEScrollLabel.h #import <UIKit/ ...

  9. 剑指Offer:连续子数组的最大和

    题目: 输入一个整型数组, 数组里有正数也有负数. 数组中的一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值. 要求时间复杂度为O(n) #include <stdio.h> ...

  10. 学习如何写PHP MVC框架(1) -- 路由

    说到PHP开发web,自然离不开开发框架,开发框架为我们提供了灵活的开发方式,MVC层分离,业务解耦等... 第一篇先来简单点的,说说MVC框架的路由功能... 一般的单入口框架路由都是这样的结构: ...