FastDFS(分布式文件系统)的安装与整合使用

本贴最后更新于 2982 天前,其中的信息可能已经时异事殊



1FastDFS(分布式文件系统)

C实现,支持LinuxFreeBSDUNIX系统– google FS,不是通用的文件系统,只能通过专有API访问,目前提供了CJavaPHP API 为互联网应用量身定做,解决大容量文件存储

问题,追求高性能和高扩展性– FastDFS可以看做是基于文件的key value pair存储系统,称作分布式文件存储服务更为合适



2FastDFS提供的功能

 upload:上传普通文件,包括主文件

 upload_appender:上传appender文件,后续可以对其进行append操作

 upload_slave:上传从文件

 download:下载文件

 delete:删除文件

 append:在已有文件后追加内容

 set_metadata:设置文件附加属性

 get_metadata:获取文件附加属性



3FastDFS的特点

 分组存储,灵活简洁

 对等结构,不存在单点

 文件IDFastDFS生成,作为文件访问凭证。FastDFS不需要传统的name server

 和流行的web server无缝衔接,FastDFS已提供apachenginx扩展模块

 大、中、小文件均可以很好支持,支持海量小文件存储

 支持多块磁盘,支持单盘数据恢复

 支持相同文件内容只保存一份,节省存储空间

 存储服务器上可以保存文件附加属性

  下载文件支持多线程方式,支持断点续传


4架构示意图、文件上传流程、文件下载流程

                 

文件上传流程:

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


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

文件下载流程: 

 



5图片服务器的搭建

搭建的图片服务器的架构 


下载FastDFS

trackerstorage使用相同的安装包,下载地址:http://sourceforge.net/projects/FastDFS/ https://github.com/happyfish100/FastDFS(推荐)

本教程下载:FastDFS_v5.05.tar.gz



安装环境

CentOS6.4 32

需要gcc的编译环境

需要libevent的包。


yum -y install libevent


安装步骤

 Tracker的安装

第一步:把源码包上传到linux系统。

第二步:解压缩libfastcommonV1.0.7.tar.gz包。

第三步:进入/root/libfastcommon-1.0.7文件夹执行./make.sh./make.sh install

第四步:把/usr/lib64/libfastcommon.so文件向/usr/lib文件夹下复制一份。

第五步:把FastDFS_v5.05.tar.gz解压缩。

第六步:进入/root/FastDFS目录执行:


./make.sh、./make.sh install


第七步:配置trackerServer

  1. /root/FastDFS/conf目录下的所有的文件复制到/etc/fdfs目录下。
  2. 编辑/etc/fdfs/tracker.conf


第八步:启动tracker服务


/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart


Storage服务的安装

如果storagetracker不在同一台服务上需要重复执行3.5.4.1Tracker的安装的第一步到第六步。

配置Storage服务:

需要修改/etc/fdfs/storage.conf文件。

vim /etc/profile/storage.conf

 

启动服务:

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

测试上传服务

可以使用fdfs_test测试上传。

第一步:修改客户端的配置文件。

vim /etc/fdfs/client.conf

 

第二步:上传文件。


/usr/bin/fdfs_test client.conf upload anti-steal.jpg


访问图片

使用FastDFSNginx插件和Nginx配合,实现图片的访问。Nginx需要安装到storage服务所在的服务器。

需要使用fastdfs-nginx-module_v1.16.tar.gz

安装步骤:

第一步:把插件包解压缩。fastdfs-nginx-module_v1.16.tar.gz

第二步:编辑/root/fastdfs-nginx-module/src/config文件。

删除其中的local字样。



第三步:把/root/fastdfs-nginx-module/src/mod_fastdfs.conf文件复制到/etc/fdfs目录下。

第四步:把/usr/lib64/libfdfsclient.so文件复制到/usr/lib目录下

第五步:编译Nginx

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=/usr/java/fastdfs/fastdfs-nginx-module/src


配置Nginx



启动:

tracker

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

启动的日志显示先停止5619进程(实际环境不是5619)再启动,如下图:

注意:如果没有显示上图要注意是否正常停止原有进程。

  • 设置开机自动启动。

vim /etc/rc.d/rc.local

将运行命令行添加进文件:

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart 

storage

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

启动的日志显示先停止8931进程(实际环境不是8931)再启动,如下图:

注意:如果没有显示上图要注意是否正常停止原有进程。

  • 设置开机自动启动
vim /etc/rc.d/rc.local

将运行命令行添加进文件:

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


6配置文件内容和启动Nginx

server{

  listen       80;

        server_name  localhost;

        location /group1/M00/ {

        fastdfs-nginx-module;

        }

}

server{

  listen       80;

        server_name  localhost;

        location / {

            proxy_pass http://server_ls;

            index  index.html index.htm;

        }

    } 

upstream server_lb{

    server 127.0.0.1:8080;

}

 

server{

        listen       81;

        server_name  localhost;   

        location /image/ {

            root   /usr/images;

}


server {

        listen       80;

        server_name   http://server_lb;

        location / {

            proxy_pass http://server_lb;

            index  index.html index.htm;

        }

}



7使用java客户端上传图片

@Service

publicclass PictureService {

     @Value("${IMAGE_SERVER_URL}")

     private String ImageServerURL;

     publicMap uploadFile(MultipartFile uploadFile) {

         //在此实现图片上传

         try {

              FastDFSClient client = new FastDFSClient("classpath:resource/client.conf");

              //取图片的原始名称

              String filename = uploadFile.getOriginalFilename();

              //取扩展名

              String ext = filename.substring(filename.lastIndexOf(".") + 1);

              String url = client.uploadFile(uploadFile.getBytes(), ext);

              //拼接url

              url = ImageServerURL + url;

              //返回Map数据

              Mapresult = new HashMap<>();

              result.put("error", 0);

              result.put("url"url);

              returnresult;

         } catch (Exception e) {

              e.printStackTrace();

              //返回Map数据

              Mapresult = new HashMap<>();

              result.put("error", 1);

              result.put("message""上传失败");

             

              returnresult;

         }

     }

}

安装FastDFSjava客户端

 

把工程导入到workspace中,然后maven install


 


linux 安装FastDFS实现分布式文件服务器

上传图片

开发步骤:

第一步:在pom文件中添加jar包的依赖。

第二步:创建一个测试类。

第三步:创建一个上传文件使用的配置文件。需要知道trackerServer的位置。

第四步:加载配置文件。

第五步:创建一个TrackerClient对象,直接new

第六步:通过TrackerClient对象获得一个TrackerServer对象。

第七步:创建一个StorageServer的引用。Null

第八步:创建StorageClient对象

第九步:使用StorageClient对象上传文件

配置文件的内容:

tracker_server=192.168.25.133:22122

代码实现:

publicclass TestFastDFS {

     @Test

     publicvoid testUpload() throws Exception {

         // 第一步:在pom文件中添加jar包的依赖。

         // 第二步:创建一个测试类。

         // 第三步:创建一个上传文件使用的配置文件。需要知道trackerServer的位置。

         // 第四步:加载配置文件。

         ClientGlobal.init("D:/workspaces/web/src/main/resources/resource/client.conf");

         // 第五步:创建一个TrackerClient对象,直接new

         TrackerClient trackerClient = new TrackerClient();

         // 第六步:通过TrackerClient对象获得一个TrackerServer对象。

         TrackerServer trackerServer = trackerClient.getConnection();

         // 第七步:创建一个StorageServer的引用。Null

         StorageServer storageServer = null;

         // 第八步:创建StorageClient对象

         StorageClient storageClient = new StorageClient(trackerServerstorageServer);

         // 第九步:使用StorageClient对象上传文件

         String[] strings = storageClient.upload_appender_file("D:/Documents/Pictures/images/2f2eb938943d.jpg""jpg"null);

         for (String string : strings) {

              System.out.println(string);

         }

         trackerServer.close();

     }

}

 

1.1   使用封装的工具类上传

FastDFSClient 

package com.liwei.controller.utils;

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);
    }
}

@Test

     publicvoid testUtilUpload() throws Exception {

         FastDFSClient client = new FastDFSClient("D:/workspaces/web/src/main/resources/resource/client.conf");

         String string = client.uploadFile("D:/Documents/Pictures/images/2010051018445059.jpg", "jpg", null);

         System.out.println(string);

     }

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3186 引用 • 8212 回帖 • 1 关注
  • 分布式
    80 引用 • 149 回帖 • 4 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 1 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    221 引用 • 473 回帖
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    21 引用 • 245 回帖 • 248 关注
  • gRpc
    11 引用 • 9 回帖 • 60 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 2 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    346 引用 • 1801 回帖 • 3 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 725 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 625 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 465 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 181 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖 • 1 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    285 引用 • 728 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 632 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 606 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    30 引用 • 123 回帖 • 1 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 657 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 619 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 127 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 338 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 1 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    942 引用 • 1459 回帖 • 31 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 257 关注