FastDFS分布式文件系统介绍及单机版安装

一、分布式文件系统

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

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

GFS(Google File System)
--------------------------------------
Google公司为了满足本公司需求而开发的基于Linux的专有分布式文件系统

HDFS
--------------------------------------
Hadoop 实现的一个分布式文件系统(Hadoop Distributed File System),简称HDFS

Lustre
---------------------------------------
是一个大规模的、安全可靠的,具备高可用性的集群文件系统,它是由SUN公司开发和维护的

Ceph
---------------------------------------
是加州大学圣克鲁兹分校的Sage weil攻读博士时开发的分布式文件系统

GridFS
---------------------------------------
GridFS是MongoDB之上的分布式文件系统,其利用了MongoDB的分布式存储机制并通过MongoDB来存储文件数据和文件元数据

MogileFS
---------------------------------------
由memcahed的开发公司danga,开发的一款采用perl开发的产品,目前国内使用mogielFS的有图片托管网站yupoo等

mooseFS
---------------------------------------
相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差

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

二、什么是FastDFS

FastDFS是一个开源的轻量级分布式文件系统,为互联网应用量身定做,简单、灵活、高效,采用C语言开发,由阿里巴巴开发并开源,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

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

三、FastDFS发展历史

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

2、2010年8月推出V2.00

3、2011年6月推出V3.00

4、2012年10月推出V4.00

5、2013年12月推出V5.00

6、2017年3月推出V5.10

7、2018年6月推出V5.12(截止目前最新版)

8、详细发展历史查看: https://github.com/happyfish100/fastdfs/blob/master/HISTORY

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

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

四、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)都保存到存储服务器磁盘上,完成文件管理的所有功能:文件存储、文件同步和提供文件访问等;

五、FastDFS下载
           FastDFS没有Windows版本,不能在Windows下使用;FastDFS需要安装部署在Linux环境下;下载地址:https://github.com/happyfish100/fastdfs/releases,下载安装版本为FastDFS5.11

六、FastDFS安装

  1. 安装前的准备
    1. 检查Linux上是否安装了 gcc、libevent、libevent-devel,执行如下yum命令检查:
    2. yum list installed | grep gcc
    3. yum list installed | grep libevent
    4. yum list installed | grep libevent-devel
    5. 如果没有安装,则需进行安装,执行如下命令安装:
    6. yum install gcc libevent libevent-devel -y
  2. 安装 libfastcommon 库
    1. libfastcommon 库是 FastDFS 文件系统运行需要的公共 C 语言函数库
    2. 安装libfastcommon 库的步骤如下
      1. 下载 libfastcommon 源代码包
        1. 下载地址:https://github.com/happyfish100
        2. 安装包地址:https://github.com/happyfish100/libfastcommon/archive/V1.0.36.tar.gz
      2. 解压下载下来的tar.gz压缩包:tar -zxvf libfastcommon-1.0.36.tar.gz
      3. 切换到解压后的libfastcommon目录:cd libfastcommon-1.0.36
      4. 执行make脚本进行编译:./make.sh
        1. 注意:第4步make编译的时候如果报错,需解决错误后再次进行make,通常发生错误是由于Linux缺少某些依赖库导致,根据错误提示解决错误
      5. 执行make install进行安装:./make.sh install
      6. 至此 libfastcommon 库安装完毕
  3. 安装FastDFS
    1. FastDFS才是我们真正的分布式文件系统,安装步骤如下:
      1. 下载FastDFS,下载地址:https://github.com/happyfish100/fastdfs/releases
      2. 解压下载下来的tar.gz包:tar -zxvf fastdfs-5.11.tar.gz
      3. 切换到解压后的目录:cd fastdfs-5.11
      4. 执行编译: ./make.sh
      5. 然后再执行安装 ./make.sh install
        1. 至此FastDFS安装完成,安装后所有编译出来的文件存放在/usr/bin目录下,所有配置文件存放在/etc/fdfs目录下,使用命令查看:ll /usr/bin/fdfs*
      6. 另外注意需要把解压后的fastdfs-5.11/conf目录下的两个文件拷贝到/etc/fdfs/ 
        1. cp http.conf /etc/fdfs/
        2. cp mime.types /etc/fdfs/
      7. 这两个文件后续需要用到,所以先拷贝过去,原因:让fastdfs-nginx-module的配置文件调用

七、FastDFS配置

  1. FastDFS安装后配置文件位于/etc/fdfs/目录下,修改该目录下的配置文件
  2. 把所有的.sample后缀都去掉,使用 mv 命令改文件名,去掉文件名后缀。尽量使用cp复制在改名(备份,备份,备份)
    1. 修改tracker.conf文件
      1. base_path=/opt/fastdfs/tracker
      2. 新建 mkdir -p /opt/fastdfs/tracke
      3. 不然会报:
    2. 修改storage.conf文件
      1. base_path=/opt/fastdfs/storage
      2. store_path0=/opt/fastdfs/storage/files
      3. tracker_server=192.168.184.133:22122
      4. 新建文件夹:
      5. mkdir -p /opt/fastdfs/storage
      6. mkdir -p /opt/fastdfs/storage/files
      7. 如果配置store_path0该配置了,就得创键file文件,如果不配置则默认使用base_path
    3. 然后启动FastDFS

八、FastDFS启动

  1. FastDFS服务启动需要启动两个脚本:
    1. 启动FastDFS的tracker服务,在任意目录下执行:fdfs_trackerd /etc/fdfs/tracker.conf
    2. 启动FastDFS的storage服务,在任意目录下执行:fdfs_storaged /etc/fdfs/storage.conf
  2. 首次启动storage后,它会在配置的路径下创建存储文件的目录,前提是配置的路径要存在,不存在服务都起不来,所以上面七步骤中有提示要创键文件夹
  3. 查看启动进程:ps -ef | grep fdfs ,有启动的执行命令即为启动成功;
  4. 查看storage是否已经登记到了tracker下:fdfs_monitor /etc/fdfs/storage.conf

九、FastDFS关闭

  1. 关闭FastDFS,执行如下命令:
    1. 关闭tracker执行命令,在任意目录下执行:fdfs_trackerd /etc/fdfs/tracker.conf stop
    2. 关闭storage执行命令,在任意目录下执行:fdfs_storaged /etc/fdfs/storage.conf stop
    3. 或者kill关闭fastdfs,但不建议kill -9 强制关闭,因为可能会导致文件信息不同步问题

十、FastDFS重启

  1. 重启FastDFS,执行如下命令:
    1. 重启tracker执行命令:fdfs_trackerd /etc/fdfs/tracker.conf restart
    2. 重启storage执行命令:fdfs_storaged /etc/fdfs/storage.conf restart

十一、FastDFS测试

  1. FastDFS安装完成之后,可以使用fdfs_test脚本测试文件上传,执行命令:
  2. 测试之前,需要修改client.conf配置文件,修改两个配置:
    1. base_path=/opt/fastdfs/client
    2. tracker_server=192.168.184.133:22122
    3. 新建文件夹:
    4. mkdir -p /opt/fastdfs/client
  3. 测试文件上传,执行命令:
    1. fdfs_test /etc/fdfs/client.conf upload /root/testfastfds.txt
  4. 测试文件删除,执行命令:
    1. fdfs_delete_file  /etc/fdfs/client.conf  group1/M00/00/00/wKi4hVzVCW-AR0ZTAAAAIIe1k0c233_big.txt
  5. FastDFS生成的文件目录结构及名称示例:
    1.  

//////////////////////////一道亮丽的风景线//////////////////////////

十二、安装Nginx的FastDFS扩展模块

  1. 概述
    1. 已经上传到FastDFS文件系统中的文件,我们如何在浏览器中访问呢?FastDFS V4.05 以后的版本就把内置 HTTP服务去掉了,所以我们测试上传成功了,但是却无法访问。
    2. FastDFS提供了一个Nginx扩展模块,利用该模块,我们可以通过Nginx访问已经上传到FastDFS上的文件
  2. 下载
    1. 下载fastdfs的nginx扩展模块源代码:
    2. wget https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zip
    3. 解压下载下来的fastdfs-nginx-module-master.zip 文件:
    4. unzip fastdfs-nginx-module-master.zip
  3. 安装Nginx并且添加fastDFS模块
    1. 下载nginx:wget http://nginx.org/download/nginx-1.12.2.tar.gz
    2. 解压下载下来的nginx文件,执行命令:tar -zxvf nginx-1.12.2.tar.gz
    3. 切换至解压后的nginx主目录,执行命令:cd nginx-1.12.2
    4. 切换到解压后的nginx-1.12.1目录下,执行configure命令:
      1. ./configure --prefix=/usr/local/fastdfs/nginx_fdfs --add-module=/home/soft/fastdfs/fastdfs-nginx-module-master/src
      2. 其中--prefix是指定nginx安装路径,--add-module指定fastDFS的nginx模块的源代码路径
    5. 执行命令进行编译:make
    6. 执行命令进行安装:make install
    7. 以上安装Nginx的FastDFS扩展模块注意事项
      1. 我们知道,nginx是C语言开发,因此同样需要gcc,还需要安装pcre,因为nginx的http模块需要用到pcre,还需要zlib,它提供了解压缩,还需要openssl,Nginx的安装需要Linux安装相关的几个库,否则编译会出现错误,这几个库分别是:
      2. gcc编译器是否安装?
        1. 检查是否安装:yum list installed | grep gcc
        2. 执行安装:yum install gcc -y
      3. openssl库是否安装?
        1. 检查是否安装:yum list installed | grep openssl
        2. 执行安装:yum install openssl openssl-devel -y
      4. pcre库是否安装?
        1. 检查是否安装:yum list installed | grep pcre
        2. 执行安装:yum install pcre pcre-devel -y
      5. zlib库是否安装?
        1. 检查是否安装:yum list installed | grep zlib
        2. 执行安装:yum install zlib zlib-devel -y
      6. 一次性安装,执行如下命令:
        1. yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
  4. 配置
    1. 将/home/soft/fastdfs/fastdfs-nginx-module-master/src目录下的mod_fastdfs.conf文件拷贝到 /etc/fdfs/目录下,这样才能正常启动Nginx
      1. mod_fastdfs.conf 专门配置Nginx的扩展模块的
    2. 修改mod_fastdfs.conf配置文件:
      1. base_path=/opt/fastdfs/nginx_mod
      2. tracker_server=192.168.184.133:22122
      3. store_path0=/opt/fastdfs/storage/files
      4. url_have_group_name = true
      5. 创键文件夹:
      6. mkdir -p /opt/fastdfs/nginx_mod
      7. 其他路径都存在所以不用创键
    3. 配置Nginx的配置文件
      1. #拦截请求路径中包含 /group[1-9]/M0[0-9] 的请求,使用 fastdfs的Nginx 模块进行转发:
        location ~ /group[1-9]/M0[0-9] {
             ngx_fastdfs_module;
        }
      2. 如果出现404访问不到,检查一下 url_have_group_name = false,如果为false改为true
  5. 启动与测试
    1. 启动带有fastdfs模块的Nginx
    2. 重启fastDFS服务进程,执行如下命令:(不重启也可以)
      1. fdfs_trackerd /etc/fdfs/tracker.conf restart
      2. fdfs_storaged /etc/fdfs/storage.conf restart
    3. 重新上传一个文件进行测试验证:fdfs_test /etc/fdfs/client.conf upload /root/testfastfdsnginx.txt
    4. 在浏览器访问上传的文件,显示访问成功
    5. 当遇到400错误, 检查配置/etc/fdfs/mod_fastdfs.conf
    6. url_have_group_name=true  
    7. 该配置表示访问路径中是否需要带有group1,改为true表示路径中需要有group1

十三、FastDFS提供的主要功能

   upload:上传文件,download:下载文件,delete:删除文件

十四、FastDFS文件系统的Java客户端

  1. fastDFS文件系统Java客户端是指采用Java语言编写的一套程序,专门用来访问fastDFS文件系统
  2. 由于maven仓库里没有该依赖所以:
  3. 下载官方的源代码:https://github.com/happyfish100/fastdfs-client-java/archive/master.zip
  4. 解压fastdfs-client-java-master,采用maven命令编译成jar安装到本地maven库:mvn clean install
  5. 在Java程序中使用它提供的API来访问fastDFS文件系统

十五、FastDFS开发示例

使用Java客户端,编程操作fastDFS分布式文件系统:

引入依赖:

<dependency>
    <groupId>org.csource</groupId>
    <artifactId>fastdfs-client-java</artifactId>
    <version>1.27-SNAPSHOT</version>
</dependency>

代码:

在类路径中配置该文件:fdfs_client.conf配置,tracker_server可以配置多个

connect_timeout = 2
network_timeout = 30
charset = UTF-8
tracker_server=192.168.184.133:22122

代码:

public class FastService {
    public static void main(String[] args) throws IOException, MyException {

        //1、初始化配置连接信息
        ClientGlobal.init("fdfs_client.conf");
        //检查加载配置结果
        System.out.println("加载配置结果:ClientGlobal.configInfo(): " + ClientGlobal.configInfo());

        //2、创建一个Tracker的客户端对象
        TrackerClient trackerClient = new TrackerClient();

        //3、通过Tracker的客户端对象,获取到一个Tracker服务器对象
        TrackerServer  trackerServer = trackerClient.getConnection();

        //4、通过Tracker的客户端对象和Tracker服务器对象,获取到一个Storage服务器对象
        StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);

        //5、通过Tracker服务器对象和Storage服务器对象,构造一个Storage客户端对象
        StorageClient storageClient = new StorageClient(trackerServer, storageServer);


        //有了上面的5步,接下来就可以正式去操作FastDFS了
        //文件上传
        String[] strArray = storageClient.upload_file("G:/test.txt", "txt", null);

        for (String str : strArray) {
            System.out.println(str);
        }


        //文件下载,返回值0表示下载成功,其他值都是下载失败,比如:-1, 1, -22 都是失败的
        //strArray[0]       group_name
        //strArray[1]       remote_filename
        //G:/测试下载.txt   local_filename
        int download = storageClient.download_file(strArray[0], strArray[1], "G:/测试下载.txt");
        System.out.println("下载结果:"+download);

        //文件删除,返回值0表示删除成功,其他值都是删除失败,比如:-1, 1, -22 都是失败的
        //int delete = storageClient.delete_file(strArray[0], strArray[1]);
        //System.out.println("删除结果:"+delete);

    }

}

 

猜你喜欢

转载自blog.csdn.net/qq_39669058/article/details/90052402
今日推荐