Welcome everyone

FastDFS初步学习

大数据 汪明鑫 735浏览 0评论

分布式文件系统

在大数据时代,单机文件存储已经不太彳亍了

于是乎诞生了各种分布式文件系统、云存储等

之前了解hadoop在虚拟机上搭建过hadoop和hdfs集群

hdfs是一个分布式文件系统,把上传的数据分片存储

 

分布式文件系统是面对互联网的需求而产生,互联网时代对海量数据如何存储?靠简单的增加硬盘的个数已经满足
不了我们的要求,因为硬盘传输速度有限但是数据在急剧增长,另外我们还要要做好数据备份、数据安全等。
采用分布式文件系统可以将多个地点的文件系统通过网络连接起来,组成一个文件系统网络,结点之间通过网络进
行通信,一台文件系统的存储和传输能力有限,我们让文件在多台计算机上存储,通过多台计算共同传输。

分布式文件系统解决了海量文件存储及传输访问的瓶颈问题,对海量视频、图片等文件的管理。

 

考虑到毕设图片和上传的资料的存储问题,直接存储感觉编码量较大,
就寻思着有什么中间件可以拿来使用,直接指定ip + port,便可实现文件的上传和下载

 

FastDFS介绍

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

上传文件成功会返回给客户端一个fileId,是文件的标识,也可以表示文件存放的目录,
下载时传这个fileId,就可以下载对应的文件

 

 

FastDFS架构

FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Tracker
server调度最终由Storage server完成文件上传和下载。

 

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

 

上传流程 & 下载流程

 

文件上传:


 

文件下载:

 

图中画的很明白就不一一赘述了

fileId是由组名+存放路径+文件名组成

 

 

FastDFS安装

安装比较繁琐,可以参考  https://www.cnblogs.com/Eivll0m/p/5378328.html

我也搞了半天,就一台阿里云服务器,虚拟机上的centOS有几个,但是版本太低

可以先把tracker,storage安在一台机器上,先体验一把

 

启动tracker,storage

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

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

 

 

tracker,storage都启起来了

 

但是nginx还没有配置,之后再配置

 

FastDFS的java客户端

 

首先要引入2个依赖

 <dependency>
            <groupId>net.oschina.zcx7878</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.27.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>

 

fastdfs-client-java 是提供的java客户端

可以在maven中心仓库中找到

https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java

 

 

配置文件:

在resources路径下创建config目录,config目录下创建 fastdfs-client.properties

fastdfs.connect_timeout_in_seconds = 5 
fastdfs.network_timeout_in_seconds = 30 
fastdfs.charset = UTF-8 
fastdfs.tracker_servers = tracker的ip:22122

 

上传文件

//上传文件
    @Test
    public void testUpload() throws IOException, MyException {

        //加载配置文件
        ClientGlobal.initByProperties("config/fastdfs-client.properties");

        //创建TrackerClient
        TrackerClient trackerClient = new TrackerClient();

        //获取tracker
        TrackerServer trackerServer = trackerClient.getConnection();

        //获取storage
        StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);

        //创建TrackerClient
        StorageClient1 storageClient1 = new StorageClient1(trackerServer,storageServer);

        //上传文件
        String filePath = "e:/a.jpg";
        String fileId = storageClient1.upload_file1(filePath, "jpg", null);  //上传成功后得到的id
        System.out.println("fileId : "+fileId);

        // group1/M00/00/00/rBGcalylpKGAZRzMAABHEBghxQ4101.jpg
    }

 

group1/M00/00/00/rBGcalylpKGAZRzMAABHEBghxQ4101.jpg 就是传说中的fileId

我们验证下文件上传是否成功,和返回的fileId

 

说明文件成功上传

其实group1/M00/00/00/ 就是对应上图路径中的 /home/fastdfs/fdfs_storage/data/00/00

 

 

下载文件

//下载文件
    @Test
    public void testDownload() throws IOException, MyException {

        //加载配置文件
        ClientGlobal.initByProperties("config/fastdfs-client.properties");

        //创建TrackerClient
        TrackerClient trackerClient = new TrackerClient();

        //连接tracker
        TrackerServer trackerServer = trackerClient.getConnection();

        //获取storage
        StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);

        //创建TrackerClient
        StorageClient1 storageClient1 = new StorageClient1(trackerServer,storageServer);

        //下载文件
        String fileId= "group1/M00/00/00/rBGcalylpKGAZRzMAABHEBghxQ4101.jpg";
        byte[] bytes = storageClient1.download_file1(fileId);

        FileOutputStream fileOutputStream = new FileOutputStream(new File("d:/1.jpg"));
        fileOutputStream.write(bytes);

    }

 

只需要传一个fileId就可以得到该文件的字节流

 

查询文件

 //查询文件
    @Test
    public void testQueryFile() throws IOException, MyException {
        //加载配置文件
        ClientGlobal.initByProperties("config/fastdfs-client.properties");

        //创建TrackerClient
        TrackerClient trackerClient = new TrackerClient();

        //连接tracker
        TrackerServer trackerServer = trackerClient.getConnection();

        //获取storage
        StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);

        //创建TrackerClient
        StorageClient1 storageClient1 = new StorageClient1(trackerServer,storageServer);

        FileInfo fileInfo = storageClient1.query_file_info("group1", "M00/00/00/rBGcalylpKGAZRzMAABHEBghxQ4101.jpg");
        System.out.println(fileInfo);
    }

 

 

后面需要学习并搭建一个nginx,目的是为了可以通过外网http访问到图片

就像这样

 

然后再学习一些的fastdfs的java客户端常用 api,争取能把FastDFS用到项目上来解决文件的存储管理

 

 

转载请注明:汪明鑫的个人博客 » FastDFS初步学习

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz