zoukankan      html  css  js  c++  java
  • Day08_分布式文件系统FastDFS研究

    分布式文件系统 fastDFS研究

    教学目标

    1)了解分布式文件系统的概念及应用场景

    2)理解fastDFS的工作原理

    3)掌握fastDFS存取文件方法

    1 什么是分布式文件系统

    1.1 技术应用场景

    传智播客拥有大量优质的视频教程,并且免费提供给用户去下载,文件太多如何高效存储?用户访问量大如何保证下载速度?今天讲解的分布式文件系统将解决这些问题。

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

    1.2 什么是分布式文件系统

    1.2.1什么是文件系统

    计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。

    文件系统通常使用硬盘和光盘这样的存储设备,并维护文件在设备中的物理位置。但是,实际上文件系统也可能仅仅是一种访问数据的界面而已,实际的数据是通过网络协议(如NFS、SMB、9P等)提供的或者内存上,甚至可能根本没有对应的文件(如proc文件系统)。

    严格地说,文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型(Abstract data type)。

    总结:文件系统是负责管理和存储文件的系统软件,它是操作系统和硬件驱动之间的桥梁,操作系统通过文件系统 提供的接口去存取文件,用户通过操作系统访问磁盘上的文件。如下图:

    常见的文件系统:FAT16/FAT32、NTFS、HFS、UFS、APFS、XFS、Ext4等 。

    思考:如果没有文件系统我们该怎么管理自己的文件?

    1.2.2 什么是分布式文件系统

    分布式文件系统(Distributed File System,DFS)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点(可简单的理解为一台计算机)相连;或是若干不同的逻辑磁盘分区或卷标组合在一起而形成的完整的有层次的文件系统。DFS为分布在网络上任意位置的资源提供一个逻辑上的树形文件系统结构,从而使用户访问分布在网络上的共享文件更加简便。单独的 DFS共享文件夹的作用是相对于通过网络上的其他共享文件夹的访问点 。

    为什么会有分布文件系统呢?

    分布式文件系统是面对互联网的需求而产生,互联网时代对海量数据如何存储?靠简单的增加硬盘的个数已经满足 不了我们的要求,因为硬盘传输速度有限但是数据在急剧增长,另外我们还要要做好数据备份、数据安全等。

    采用分布式文件系统可以将多个地点的文件系统通过网络连接起来,组成一个文件系统网络,结点之间通过网络进 行通信,一台文件系统的存储和传输能力有限,我们让文件在多台计算机上存储,通过多台计算共同传输。如下 图:

    好处:

    1、一台计算机的文件系统处理能力扩充到多台计算机同时处理。
    2、一台计算机挂了还有另外副本计算机提供数据。
    3、每台计算机可以放在不同的地域,这样用户就可以就近访问,提高访问速度。
    

    1.3 主流的分布式文件系统

    1、NFS

    网络文件系统(英语:Network File System,缩写作 NFS)是一种分布式文件系统,力求客户端主机可以访问服务器端文件,并且其过程与访问本地存储时一样,它由Sun微系统(已被甲骨文公司收购)开发,于1984年发布。

    它基于开放网络运算远程过程调用(ONC RPC)系统:一个开放、标准的RFC系统,任何人或组织都可以依据标准实现它。

    1)在客户端上映射NFS服务器的驱动器。
    2)客户端通过网络访问NFS服务器的硬盘完全透明。
    

    2、GFS

    Google文件系统(英语:Google File System,缩写为GFS或GoogleFS),一种专有分布式文件系统,由Google公司开发,运行于Linux平台上。尽管Google在2003年公布了该系统的一些技术细节,但Google并没有将该系统的软件部分作为开源软件发布。

    2013年,Google公布了Colossus项目,作为下一代的Google文件系统。

    1)GFS采用主从结构,一个GFS集群由一个master和大量的chunkserver组成。
    2)master存储了数据文件的元数据,一个文件被分成了若干块存储在多个chunkserver中。
    3)用户从master中获取数据元信息,从chunkserver存储数据。
    

    3、HDSF

    Apache Hadoop是一款支持数据密集型分布式应用程序并以Apache 2.0许可协议发布的开源软件框架。它支持在商品硬件构建的大型集群上运行的应用程序。Hadoop是根据谷歌公司发表的MapReduce和Google文件系统的论文自行实现而成。所有的Hadoop模块都有一个基本假设,即硬件故障是常见情况,应该由框架自动处理。

    Hadoop框架透明地为应用提供可靠性和数据移动。它实现了名为MapReduce的编程范式:应用程序被分割成许多小部分,而每个部分都能在集群中的任意节点上运行或重新运行。此外,Hadoop还提供了分布式文件系统,用以存储所有计算节点的数据,这为整个集群带来了非常高的带宽。MapReduce和分布式文件系统的设计,使得整个框架能够自动处理节点故障。它使应用程序与成千上万的独立计算的电脑和PB级的数据连接起来。现在普遍认为整个Apache Hadoop“平台”包括Hadoop内核、MapReduce、Hadoop分布式文件系统(HDFS)以及一些相关项目,有Apache Hive和Apache HBase等等。

    1)HDFS采用主从结构,一个HDFS集群由一个名称结点和若干数据结点组成。名称结点存储数据的元信息,一个完整的数据文件分成若干块存储在数据结点。

    2)客户端从名称结点获取数据的元信息及数据分块的信息,得到信息客户端即可从数据块来存取数据。

    1.4 分布式文件服务提供商

    1)阿里的OSS

    阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务。您可以通过本文档提供的简单的REST接口,在任何时间、任何地点、任何互联网设备上进行上传和下载数据。基于OSS,您可以搭建出各种多媒体分享网站、网盘、个人和企业数据备份等基于大规模数据的服务。
    

    2)七牛云存储

    3)百度云存储

    2 什么是fastDFS

    2.1 fastDSF介绍

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

    为什么要使用fastDFS呢?

    上边介绍的NFS、GFS都是通用的分布式文件系统,通用的分布式文件系统的优点的是开发体验好,但是系统复杂 性高、性能一般,而专用的分布式文件系统虽然开发体验性差,但是系统复杂性低并且性能高。fastDFS非常适合 存储图片等那些小文件,fastDFS不对文件进行分块,所以它就没有分块合并的开销,fastDFS网络通信采用 socket,通信速度很快。

    2.2 fastDSF工作原理

    2.2.1 fastDSF架构

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

    如下图:

    1)Tracker

    Tracker Server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提 供文件上传服务。可以将tracker称为追踪服务器或调度服务器。

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

    2)Storage

    Storage Server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己 的文件系统而是使用操作系统的文件系统来管理文件。可以将storage称为存储服务器。

    Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容 量之和。一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storage server 之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个组的存储容量为该组内的存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。

    采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由 tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。

    3)Storage状态收集

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

    2.2.2 文件上传流程

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

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

    2.2.3 文件下载流程

    tracker根据请求的文件路径即文件ID来快速定义文件。

    比如请求下边的文件:

    1.通过组名,tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问。

    2.存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。

    3 fastDFS入门

    3.1 fastDFS安装与配置

    安装教程参考链接:https://www.cnblogs.com/artwalker/p/13500207.html

    3.2 文件上传下载测试

    3.2.1搭建环境

    这里我们使用javaApi测试文件的上传,java版本的fastdfs-client地址在:https://github.com/happyfish100/fastdfs-client-java,参考此工程编写测试用例。

    1)创建maven工程

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>xc-framework-parent</artifactId>
            <groupId>com.xuecheng</groupId>
            <version>1.0-SNAPSHOT</version>
            <relativePath>../xc-framework-parent/pom.xml</relativePath>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>test-fastdfs</artifactId>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java -->
            <dependency>
                <groupId>net.oschina.zcx7878</groupId>
                <artifactId>fastdfs-client-java</artifactId>
                <version>1.27.0.0</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-io</artifactId>
                <version>1.3.2</version>
            </dependency>
        </dependencies>
    
    </project>
    
    1. 配置文件

    在classpath:config下创建fastdfs-client.properties文件

    fastdfs.connect_timeout_in_seconds = 5 #http连接超时时间
    fastdfs.network_timeout_in_seconds = 30 #tracker与storage网络通信超时时间
    fastdfs.charset = UTF-8 #字符编码
    fastdfs.tracker_servers = 10.211.55.13:22122 #tracker服务器地址,多个地址中间用英文逗号分隔
    

    3.2.2 文件上传

    //上传文件
        @Test
        public void testUpload(){
    
            try {
                //加载fastdfs-client.properties配置文件
                ClientGlobal.initByProperties("config/fastdfs-client.properties");
                //定义TrackerClient,用于请求TrackerServer
                TrackerClient trackerClient = new TrackerClient();
                //连接tracker
                TrackerServer trackerServer = trackerClient.getConnection();
                //获取Stroage
                StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
                //创建stroageClient
                StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
                //向stroage服务器上传文件
                //本地文件的路径
                String filePath = "d:/logo.png";
                //上传成功后拿到文件Id
                String fileId = storageClient1.upload_file1(filePath, "png", null);
                System.out.println(fileId);
                //group1/M00/00/01/wKhlQVuhU3eADb4pAAAawU0ID2Q159.png
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    

    3.2.3 文件下载

    //下载文件
        @Test
        public void testDownload() {
            try {
                //加载fastdfs-client.properties配置文件
                ClientGlobal.initByProperties("config/fastdfs-client.properties");
                //定义TrackerClient,用于请求TrackerServer
                TrackerClient trackerClient = new TrackerClient();
                //连接tracker
                TrackerServer trackerServer = trackerClient.getConnection();
                //获取Stroage
                StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
                //创建stroageClient
                StorageClient1 storageClient1 = new StorageClient1(trackerServer, storeStorage);
                //下载文件
                //文件id
                String fileId = "group1/M00/00/00/CtM3DV82NfuAGyaGAAbISIubyYk709.png";
                byte[] bytes = storageClient1.download_file1(fileId);
                //使用输出流保存文件
                FileOutputStream fileOutputStream = new FileOutputStream(new File("/Users/XinxingWang/Desktop/md文档/学成在线/Day08 课程图片管理 分布式文件系统/logo.png"));
                fileOutputStream.write(bytes);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (MyException e) {
                e.printStackTrace();
            }
        }
    

    3.3 搭建图片虚拟主机

    3.3.1 在storage上安装Nginx

    在 storage server 上安装 nginx 的目的是对外通过 http 访问 storage server 上的文 件。使用 nginx 的模块 FastDFS-nginx-module 的作用是通过 http 方式访问 storage 中 的文件,当 storage 本机没有要找的文件时向源 storage 主机代理请求文件。

    在storage上安装nginx(安装FastDFS-nginx-module模块)

    3.3.2 配置Nginx图片服务虚拟机主机

    图片服务虚拟主机的作用是负载均衡,将图片请求转发到storage server上。

    通过图片服务虚拟主机请求图片流程图

    4 总结

    通过本次课程的学习您要达到以下目标:

    1)了解分布式文件系统的概念及应用场景

    分布式文件系统是通过网络将单机上的文件系统组成一个网络文件系统。 
    分布式文件系统主要应用在大型互联网项目中,实现图片存储、音视频存储等服务。 
    分布式文件系统的优点:可以快速扩容存储,提高文件访问速度。
    

    2)理解fastDFS的工作原理

    fastDFS由tracker和storage组成,它们都可以部署集群。
    tracker负责调度,storage负责存储。
    

    3)掌握fastDFS存取文件方法

    客户端与fastDFS采用socket协议通信,可以采用官方提供的java版本的fastDSF-client快速开发。
    

    4)能够动手搭建一个fastDSF文件服务器

  • 相关阅读:
    focus([[data],fn]) 当元素获得焦点时,触发 focus 事件。
    dblclick([[data],fn]) 当双击元素时,会发生 dblclick 事件。
    click([[data],fn]) 触发每一个匹配元素的click事件。
    change([[data],fn]) 当元素的值发生改变时,会发生 change 事件。
    blur([[data],fn]) 当元素失去焦点时触发 blur 事件。
    toggle([speed],[easing],[fn]) 用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的 click 事件。
    hover([over,]out)
    triggerHandler(type, [data])
    trigger(type,[data]) 在每一个匹配的元素上触发某类事件。
    one(type,[data],fn) 为每一个匹配元素的特定事件(像click)绑定一个一次性的事件处理函数。
  • 原文地址:https://www.cnblogs.com/artwalker/p/13502534.html
Copyright © 2011-2022 走看看