FastDFS分布式文件系统

Posted g0rez

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastDFS分布式文件系统相关的知识,希望对你有一定的参考价值。

第1章 FastDFS入门

1.1 分布式文件系统

分布式文件系统 (Distributed File System) 是一个软件/软件服务器,这个软件可以用来管理文件。但这个软件所管理的文件通常不是在一个服务器节点上,而是在多个服务器节点上,这些服务器节点通过网络相连构成一个庞大的文件存储服务器集群,这些服务器都用于存储文件资源,通过分布式文件系统来管理这些服务器上的文件。

常见的分布式文件系统有:FastDFS、GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS等。

分布式文件系统与传统文件系统对比

传统方式弊端

  • 如果用户数量多,IO操作比较多,对磁盘访问压力很大

  • 如果磁盘发生故障,会造成数据丢失

  • 存储容量有限

1.2 FastDFS简介

FastDFS是一个开源的轻量级分布式文件系统,为互联网应用量身定做,简单、灵活、高效,采用C语言开发,由阿里巴巴开发并开源。

FastDFS对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载、文件删除)等,解决了大容量文件存储的问题,特别适合以文件为载体的在线服务,如相册网站、文档网站、图片网站、视频网站等等。

FastDFS充分考虑了冗余备份、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

1.3 FastDFS发展历史

​ 2008年4月项目启动,7月发布第一个版本V1.00,两年时间内持续升级到V1.29

​ 2010年8月推出V2.00

​ 2011年6月推出V3.00

​ 2012年10月推出V4.0.0

​ 2013年12月推出V5.0.0

​ 截止目前最新版是V5.11(2017年6月发布)

​ FastDFS系统架构从第一个版本发布后一直没有大的调整,高版本完全兼容低版本的数据,可以做到平滑升级,推荐更新升级到最新版本

​ FastDFS代码托管在github上:https://github.com/happyfish100/fastdfs

1.4 FastDFS整体架构

​ FastDFS文件系统由两大部分构成,一个是客户端,一个是服务端

​ 客户端通常指我们的程序,比如我们的Java程序去连接FastDFS、操作FastDFS,那我们的Java程序就是一个客户端,FastDFS提供专有API访问,目前提供了C、Java和php几种编程语言的API,用来访问FastDFS文件系统。

​ 服务端由两个部分构成:一个是跟踪器(tracker),一个是存储节点(storage)

​ 跟踪器(tracker)主要做调度工作,在内存中记录集群中存储节点storage的状态信息,是前端Client和后端存储节点storage的枢纽。因为相关信息全部在内存中,Tracker server的性能非常高,一个较大的集群(比如上百个group)中有3台就足够了。

​ 存储节点(storage)用于存储文件,包括文件和文件属性(meta data)都保存到存储服务器磁盘上,完成文件管理的所有功能:文件存储、文件同步和提供文件访问等。

第2章 FastDFS环境搭建

2.1 FastDFS安装

2.1.1 安装前的准备

(1) 检查Linux上是否安装了 gcc、libevent、libevent-devel

  • yum list installed | grep gcc

  • yum list installed | grep libevent

  • yum list installed | grep libevent-devel

(2) 如果没有安装,则需进行安装

yum install gcc libevent libevent-devel -y

2.1.2 安装 libfastcommon 库

libfastcommon 库是 FastDFS 文件系统运行需要的公共 C 语言函数库

注意:目前最新版本的v1.0.39和最新版的FastDFS5.11不兼容,所有我们这里使用的版本是v1.0.36 下载地址:https://github.com/happyfish100

(1) 将下载好的libfastcommon文件上传到Linuxs(/opt)

(2) 解压下载下来的tar.gz压缩包到当前目录

tar -zxvf libfastcommon-1.0.36.tar.gz

(3) 切换到解压后的libfastcommon目录

cd libfastcommon-1.0.36

(4) 执行make脚本进行编译

./make.sh

注意: make编译的时候如果报错,需解决错误后再次进行make**,通常发生错误是由于Linux**缺少某些依赖库导致,根据错误提示解决错误

(5) 执行make install进行安装

./make.sh install

至此 libfastcommon 库安装完毕

2.1.3 安装FastDFS

FastDFS没有Windows版本,不能在Windows下使用。

FastDFS需要安装部署在Linux环境下,我们这里使用的是fastdfs-5.11版本(201901)

下载地址:https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz

(1)将下载好的FastDFS文件上传到Linux(/opt)

(2)解压下载下来的tar.gz压缩包到当前目录

tar -zxvf fastdfs-5.11.tar.gz

(3)切换到解压后FastDFS的目录

cd fastdfs-5.11

(4)执行make脚本进行编译

./make.sh

(5)执行make install进行安装

./make.sh install

至此FastDFS安装完成

所有编译出来的文件存放在/usr/bin目录下

所有配置文件存放在/etc/fdfs目录下

(6)查看安装后的效果

A、查看FastDFS相关的可执行程序
ll /usr/bin/fdfs*

/usr/bin是Linux的环境变量,可通过echo $PATH查看

B、查看FastDFS的配置文件
ll /etc/fdfs/

(7)另外注意需要把解压后的fastdfs-5.11/conf目录下的两个文件拷贝到/etc/fdfs/ ,否则后续会有很多奇怪问题不好解决

cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/

这两个文件后续需要用到,所以先拷贝过去

2.2 FastDFS配置

2.2.1去掉/etc/fdfs/目录下FastDFS配置文件的后缀名

2.2.2修改tracker.conf文件

默认指向的FastDFS作者余庆的目录,因为在我们的机器上不存在,所有手动改一下

base_path=/opt/fastdfs/tracker #配置tracker存储数据的目录

2.2.3修改storage.conf文件

base_path=/opt/fastdfs/storage          #storage存储数据目录

store_path0=/opt/fastdfs/storage/files     #真正存放文件的目录

tracker_server=192.168.137.142:22122    #注册当前存储节点的跟踪器地址

2.2.4在Linux服务器上创建上面指定的目录

/opt/fastdfs/tracker

/opt/fastdfs/storage

/opt/fastdfs/storage/files

2.2.5然后启动FastDFS

2.3 FastDFS启动

FastDFS服务启动需要启动两个脚本:

2.3.1启动FastDFS的tracker服务

在任意目录下执行:

fdfs_trackerd /etc/fdfs/tracker.conf

2.3.2启动FastDFS的storage服务

在任意目录下执行:

fdfs_storaged /etc/fdfs/storage.conf

2.3.3查看启动进程

有启动的执行命令即为启动成功

2.3.4查看storage是否已经注册到了tracker下

fdfs_monitor /etc/fdfs/storage.conf

2.3.5首次启动storage后,会在配置的路径下创建存储文件的目录

2.4 FastDFS重启

2.4.1重启tracker

fdfs_trackerd /etc/fdfs/tracker.conf restart

2.4.2重启storage

fdfs_storaged /etc/fdfs/storage.conf restart

2.5 FastDFS关闭

2.5.1关闭tracker执行命令

在任意目录下执行:

fdfs_trackerd /etc/fdfs/tracker.conf stop

2.5.2关闭storage执行命令

在任意目录下执行:

fdfs_storaged /etc/fdfs/storage.conf stop

2.5.3或者kill关闭fastdfs,但不建议在线上使用 kill -9 强制关闭,因为可能会导致文件信息不同步问题

2.6 FastDFS测试

​ FastDFS安装完成之后,可以使用fdfs_test脚本测试文件上传

2.6.1测试之前,需要修改client.conf配置文件,修改两个配置

  • base_path=/opt/fastdfs/client

  • tracker_server=192.168.179.128:22122

  • 在/opt/fastdfs/目录下创建client

2.6.2测试文件上传

  • 准备需要上传的文件

  • 执行上传命令
fdfs_test /etc/fdfs/client.conf upload /root/aa.txt 

This is FastDFS client test program v5.11

Copyright (C) 2008, Happy Fish / YuQing

FastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit.
Please visit the FastDFS Home Page http://www.csource.org/ 
for more detail.

[2021-11-28 22:37:52] DEBUG - base_path=/opt/fastdfs/client, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0

tracker_query_storage_store_list_without_group: 
	server 1. group_name=, ip_addr=192.168.137.142, port=23000

group_name=group1, ip_addr=192.168.137.142, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463.txt
source ip address: 192.168.137.142
file timestamp=2021-11-28 22:37:52
file size=15
file crc32=3529255
example file url: http://192.168.137.142/group1/M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463.txt
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463_big.txt
source ip address: 192.168.137.142
file timestamp=2021-11-28 22:37:52
file size=15
file crc32=3529255
example file url: http://192.168.137.142/group1/M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463_big.txt
  • 切换到存储目录查看文件上传情况

2.6.3FastDFS生成的文件目录结构及名称示例

2.6.4测试文件删除

fdfs_delete_file /etc/fdfs/client.conf group1/要删除的文件路径

之前上传的文件主文件:M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463.txt 和从文件: M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463_big.txt -m那个文件是属性信息文件

fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463.txt
fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463_big.txt

2.6.5注意

  • 没有搭建集群默认只有一个组group1

  • 后缀名包含-m的为属性文件(meta)

  • 在Linux中并没有磁盘一说,是虚拟的

第3章 分布式文件系统FastDFS的HTTP访问

3.1 概述

在文件上传的时候,上传成功的信息中有提示我们可以通过某个路径去访问上传的文件,但是我们直接访问这个路径,却不可以,那么已经上传到FastDFS文件系统中的文件,我们如何在浏览器中访问呢?

FastDFS提供了一个nginx扩展模块,利用该模块,我们可以通过Nginx访问已经上传到FastDFS上的文件

3.2 前期准备工作

3.2.1 将Fastdfs的Nginx扩展模块源代码上传到Linux上

3.2.2 解压下载下来的fastdfs-nginx-module-master.zip 文件

unzip fastdfs-nginx-module-master.zip

3.3 安装Nginx并且添加fastDFS模块

因为这个模块必须在Nginx的安装的过程中才能添加,所有我们需要重新安装一个nginx,为了和原来已安装的Nginx进行区分,我们把新安装的Nginx取名为nginx_fdfs

3.3.1 将Nginx的tar包上传到Linux上

3.3.2 解压上传的Nginx文件

3.3.3 切换至解压后的Nginx主目录,执行配置操作

cd nginx-1.14.2
./configure --prefix=/usr/local/nginx_fdfs --add-module=/opt/fastdfs-nginx-module-master/src
  • –prefix是指定nginx安装路径

  • –add-module指定fastDFS的nginx模块的源代码路径

3.3.4 执行命令进行编译

make

3.3.5 执行命令进行安装

make install

3.3.6 以上安装Nginx的FastDFS扩展模块注意事项

我们知道,Nginx的安装需要Linux安装相关的几个库,否则编译会出现错误,这几个库分别是:

  • gcc编译器是否安装

    检查是否安装:yum list installed | grep gcc

    执行安装:yum install gcc -y

  • openssl库是否安装

    检查是否安装:yum list installed | grep openssl

    执行安装:yum install openssl openssl-devel -y

  • pcre库是否安装

    检查是否安装:yum list installed | grep pcre

    执行安装:yum install pcre pcre-devel -y

  • zlib库是否安装

    检查是否安装:yum list installed | grep zlib

    执行安装:yum install zlib zlib-devel -y

yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel –y

3.4 FastDFS的Nginx访问配置

3.4.1将/opt/fastdfs-nginx-module-master/src(自己实际存放Nginx扩展模块的目录)目录下的mod_fastdfs.conf文件拷贝到 /etc/fdfs/目录下,这样才能正常启动Nginx

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

3.4.2修改mod_fastdfs.conf配置文件

base_path=/opt/fastdfs/nginx_mod

tracker_server=192.168.137.142:22122

url_have_group_name = true

store_path0=/opt/fastdfs/storage/files

3.4.3在/opt/fastdfs/目录下创建nginx_mod目录

3.4.4配置Nginx的配置文件

cd /usr/local/nginx_fdfs/conf/
vim nginx.conf

#拦截请求路径中包含 /group[1-9]/M0[0-9] 的请求,用 fastdfs的Nginx 模块进行转发

location ~ /group[1-9]/M0[0-9]   

   ngx_fastdfs_module; 


ngx_fastdfs_module; #这个指令不是Nginx本身提供的,是扩展模块提供的,根据这个指令找到FastDFS提供的Nginx模块配置文件,然后找到Tracker,最终找到Stroager

3.5 FastDFS的Nginx访问启动与测试

3.5.1启动带有Fastdfs模块的Nginx

/usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf

3.5.2重启或启动FastDFS服务进程

fdfs_trackerd /etc/fdfs/tracker.conf restart

fdfs_storaged /etc/fdfs/storage.conf restart

3.5.3上传一个文件进行测试验证

fdfs_test /etc/fdfs/client.conf upload /root/aa.txt

3.5.4在浏览器访问上传的文件

当遇到400错误,检查配置/etc/fdfs/mod_fastdfs.conf url_have_group_name=true

该配置表示访问路径中是否需要带有group1,改为true表示路径中需要有group1

http://192.168.137.142/group1/M00/00/00/wKiJjmGkZleAU4KMAAAADwA12ic919.txt

3.5.5扩展

模拟大型网站用户头像的处理方式,上传一张图片,然后自己写一个html页面,src指向上传的图片

第4章 FastDFS在Java项目中开发示例

4.1 在实际项目开发中,FastDFS提供的主要功能

  • upload:上传文件

  • download:下载文件

  • delete:删除文件

4.2 FastDFS文件系统的Java客户端

FastDFS文件系统Java客户端是指采用Java语言编写的一套程序,专门用来访问fastDFS文件系统,其实就是一个jar包。

注意:大家如果能连上 mvnrepository上搜索到的用友云提供的fastdfs-client,那大家就下载那个jar包使用,如果连不上,这个jar包需要我们自己来打

4.2.1 下载官方的源代码

从https://codeload.github.com/happyfish100/fastdfs-client-java/zip/master 上下载FastDFS源代码到本地

4.2.2 解压

4.2.3 采用maven命令编译成jar安装到本地maven库

mvn clean install

4.2.4 在Java程序中使用它提供的API来访问FastDFS文件系统

4.3 文件上传功能的实现

4.3.1 需求

使用Java客户端,编程操作fastDFS分布式文件系统,上传本地文件到FastDFS服务器上

4.3.2 实现步骤

(1) 使用IDEA创建普通的maven项目,不需要使用模板

(2) 在pom.xml文件中添加我们打包好的FastDFS本地仓库的jar包(FastDFS的java客户端依赖)

<!--加入FastDFS的java客户端依赖-->
 <dependencies>
   <dependency>
     <groupId>org.csource</groupId>
     <artifactId>fastdfs-client-java</artifactId>
     <version>1.27-SNAPSHOT</version>
   </dependency>
 </dependencies>

可以在这查看jar包里面的内容

(3) 拷贝源代码包中的fdfs_client.conf文件到resources目录下,在里面主要配置tracker地址

tracker_server = 192.168.137.142:22122

(4) 编写代码,进行上传测试

在com.g0rez.fastdfs包下创建FastDFS类,在其中编写上传代码

package com.g0rez.fastdfs;
import org.csource.common.MyException;
import org.csource.fastdfs.*;
import java.io.IOException;
public class FastDFS 
   public static void main(String[] args) 
     fileUpload();
   
   //上传文件的方法
   public static void fileUpload()
     TrackerServer trackerServer = null;
     StorageServer storageServer = null;
     try 
       //1.加载配置文件,默认去classpath下加载
       ClientGlobal.init("fdfs_client.conf");
       //2.创建TrackerClient对象
       TrackerClient trackerClient = new TrackerClient();
       //3.创建TrackerServer对象
       trackerServer = trackerClient.getConnection();
       //4.创建StorageServler对象
       storageServer = trackerClient.getStoreStorage(trackerServer);
       //5.创建StorageClient对象,这个对象完成对文件的操作
       StorageClient storageClient = new StorageClient(trackerServer,storageServer);
       //6.上传文件 第一个参数:本地文件路径 第二个参数:上传文件的后缀 第三个参数:文件信息
       String [] uploadArray = storageClient.upload_file("D:/aa.txt","txt",null);
       for (String str:uploadArray) 
         System.out.println(str);
       
      catch (IOException e) 
       e.printStackTrace();
      catch (MyException e) 
       e.printStackTrace();
      finally 
       if(storageServer != null)
         try 
           storageServer.close();
          catch (IOException e) 
           e.printStackTrace();
         
       
       if(trackerServer != null)
         try 
           trackerServer.close();
          catch (IOException e) 
           e.printStackTrace();
         
       
     
   
 

(5) 运行程序,在Linux上,FastDFS存储目录下查看上传文件内容

4.4 将文件上传功能中的公共代码进行封装

(1) 需求

因为使用FastDFS进行文件操作代码大多都是通用的,所以我们这里在FastDFS类中将通用的功能进行封装,并提供上传、下载、删除文件的方法

注意:这里只是简单的封装,如果多线程会有问题

(2) 实现步骤

A、抽取获取StorageClient的方法
public static StorageClient getStorageClient() throws IOException, MyException 
   //1.加载配置文件,默认去classpath下加载
   ClientGlobal.init("fdfs_client.conf");
   //2.创建TrackerClient对象
   TrackerClient trackerClient = new TrackerClient();
   //3.创建TrackerServer对象
   trackerServer = trackerClient.getConnection();
   //4.创建StorageServler对象
   storageServer = trackerClient.getStoreStorage(trackerServer);
   //5.创建StorageClient对象,这个对象完成对文件的操作
   StorageClient storageClient = new StorageClient(trackerServer,storageServer);
   return storageClient;
 
B、定义两个全局变量
private static TrackerServer *trackerServer* = null;
private static StorageServer *storageServer* = null;
C、抽取关闭资源的方法
public static void closeFastDFS() 
   if (storageServer != null) 
     try 
       storageServer.close();
      catch (IOException e) 
       e.printStackTrace();
     
   
   if (trackerServer != null) 
     try 
       trackerServer.close();
      catch (IOException e) 
       e.printStackTrace();
     
   
 
D、改造文件上传的方法
public static void fileUpload()
   try 
     //1. 获取StorageClient对象
     StorageClient storageClient = getStorageClient();
     //2.上传文件 第一个参数:本地文件路径 第二个参数:上传文件的后缀 第三个参数:文件信息
     String [] uploadArray = storageClient.upload_file("D:/aa.txt","txt",null);
     for (String str:uploadArray) 
       System.out.println(str);
     
    catch (IOException e) 
     e.printStackTrace();
    catch (MyException e) 
     e.printStackTrace();
    finally 
     closeFastDFS();
   
 
E、下载文件的方法
//下载文件的方法
 public static void fileDownload()
   try 
     //1. 获取StorageClient对象
     StorageClient storageClient = getStorageClient();
     //2.下载文件 返回0表示成功,其它均表示失败
     int num = storageClient.download_file("group1",
         "M00/00/00/wKjrgFxOqueAAPWKAAAAKAM14xY563.txt","E:/bb.txt");
     System.out.println(num);
    catch (IOException e) 
     e.printStackTrace();
    catch (MyException e) 
     e.printStackTrace();
    finally 
     closeFastDFS();
   
 
F、 删除文件的方法
//删除文件的方法
 public static void fileDelete()
   try 
     //1. 获取StorageClient对象
     StorageClient storageClient = getStorageClient();
     //2.删除文件 返回0表示成功,其它均表示失败
     int num = storageClient.delete_file("group1",
         "M00/00/00/wKjrgFxOqueAAPWKAAAAKAM14xY563.txt");
     System.out.println(num);
    catch (IOException e) 
     e.printStackTrace();
    catch (MyException e) 
     e.printStackTrace();
    finally 
     closeFastDFS();
   
 
G、主方法调用不同的方法进行测试

第5章 FastDFS在web项目中的应用


第6章 FastDFS分布式文件系统集群

6.1 架构图

  • 如果你公司刚好用这个,那你就会搭建集群

  • 涉及到多个Linux,你可以更进一步熟悉一下Linux

  • 提升自己驾驭复杂环境的能力

6.2 环境搭建步骤

搭建一个FastDFS分布式文件系统集群,推荐至少部署6个服务器节点

6.2.1 安装6个迷你版的Linux

好的 机器不配 结束 具体搭建过程参考附录 不难

第7章 简历

熟悉分布式文件系统FastDFS的环境安装与部署,并具有项目应用经验

第八章 完整代码附录

FastDFS工具类

package com.g0rez.fastdfs;

import org.csource.common.MyException;
import org.csource.fastdfs.*;

import java.io.IOException;

public class FastDFSUtil 
    public static void main(String[] args) 
//        upload();
//        download();
//        delete();
    
    /**
     * group1
     * M00/00/00/rBGl7mGbNrGAfMGHAAJjeL0lh6I888.jpg
     */

    /**
     * 文件上传
     */
    public static void upload()
        TrackerServer ts = null;
        StorageServer ss = null;
        //读取FastDFS的配置文件用于将所有的tracker的地址读取到内存中
        try 
            ClientGlobal.init("fastdfs.conf");
            TrackerClient tc = new TrackerClient();
            ts = tc.getConnection();
            ss = tc.getStoreStorage(ts);
            //定义storage的客户端对象,需要使用这个对象来完成具体的文件上传下载和删除操作
            StorageClient sc = new StorageClient(ts, ss);
            /**
             *文件上传
             *参数1为需要上传的文件的绝对路径
             *参数2为需要上传的文件的扩展名
             *参数3为文件的属性文件通常不上传
             *返回一个strinq数组这个数据对我们非常总要必须妥善保管建议存入数据库
             * group1
             * M00/00/00/rBGl7mGbJ5-AN_qjAAJjeL0lh6I419.jpg
             * 数组中的第一个元素为文件所在的组名
             * 数组中的第二个元素为文件所在远程路径名
             */
            String[] result = sc.upload_file("C:/Users/86138/Pictures/Saved Pictures/tp.jpg",
                    "jpg",
                    null);
            for (String str:result) 
                System.out.println(str);
            
         catch (IOException e) 
            e.printStackTrace();
         catch (MyException e) 
            e.printStackTrace();
         finally 
            if (ss != null) 
                try 
                    ss.close();
                 catch (IOException e) 
                    e.printStackTrace();
                
            
            if (ts != null) 
                try 
                    ts.close();
                 catch (IOException e) 
                    e.printStackTrace();
                
            

        

    

    /**
     * 文件下载
     */
    public static void download()
        TrackerServer ts = null;
        StorageServer ss = null;
        //读取FastDFS的配置文件用于将所有的tracker的地址读取到内存中
        try 
            ClientGlo

以上是关于FastDFS分布式文件系统的主要内容,如果未能解决你的问题,请参考以下文章

FastDFS(分布式文件系统)使用介绍

FastDFS(分布式文件系统)使用介绍

FastDFS分布式文件系统

FastDFS分布式文件系统

FastDFS分布式文件系统

FastDFS分布式文件系统