网站文件系统发展&&分布式文件系统fastDFS

 

网站文件系统发展

 

1、单机时代的图片服务器架构

   初创时期由于时间紧迫,开发人员水平也很有限等原因。所以通常就直接在website文件所在的目录下,建立1个upload子目录,用于保存用户上传的图片文件。如果按业务再细分,可以在upload目录下再建立不同的子目录来区分。例如:upload\QA,upload\Face等

优点:实现起来最简单,无需任何复杂技术,就能成功将用户上传的文件写入指定目录。保存数据库记录和访问起来倒是也很方便。

缺点:上传方式混乱,严重不利于网站的扩展。

 

2、单独立文件服务器

   随着公司的业务不断的发展,将服务和文件放在同一服务器下面的弊端越来越明显;这个时候就该上线独立的图片服务器系统;通过ftp或者ssh工具将文件上传到图片服务器的某个目录下面,在通过ngnix或者apache服务器来做图片的访问,给图片服务器配置独立的子域名,例如 img.xx.com。在业务处理文件时通过ftp或者ssh将文件上传到文件服务器,返回给程序一个独立域名的图片url地址,网站正常访问的时候就通过这个URL地址来访问文件。

优点:图片访问是很消耗服务器资源的(因为会涉及到操作系统的上下文切换和磁盘I/O操作)。分离出来后,Web/App服务器可以更专注发挥动态处理的能力;独立存储,更方便做扩容、容灾和数据迁移;方便做图片访问请求的负载均衡,方便应用各种缓存策略(HTTP Header、Proxy Cache等),也更加方便迁移到CDN。

缺点:单机存在性能瓶颈,容灾、垂直扩展性稍差

 

3、分布式文件系统

   业务继续发展,单独单台的服务器存储和响应也很快到达了瓶颈,新的业务要求,文件访问高响应性,高可用性来响应业务对系统的要求。分布式文件系统,一般分为三块内容来配合,服务的存储、访问的仲裁系统,文件存储系统,文件的容灾系统来构成,总裁系统相当于文件服务器的大脑,根据一定的算法来决定文件存储的位置,文件存储系统负责报错文件,容灾系统负责文件系统和自己的相互备份。

优点:扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行

缺点:系统复杂度稍高,需要更多服务器

 

 

分布式文件系统fastDFS

1、什么是FastDFS

FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。在UC基于FastDFS开发向用户提供了:网盘,社区,广告和应用下载等业务的存储服务。

 

2、FastDFS架构和原理

FastDFS服务端有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)。

tracker server:跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。相比GFS中的master更为精简,不记录文件索引信息,占用的内存量很少。

storage server:存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。

client:客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。

 

Tracker相当于FastDFS的大脑,不论是上传还是下载都是通过tracker来分配资源;客户端一般可以使用ngnix等静态服务器来调用或者做一部分的缓存;存储服务器内部分为卷(或者叫做组),卷于卷之间是平行的关系,可以根据资源的时候情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的

 

上传机制

首先客户端请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求上传文件,存储服务器接收到请求后,生产文件file_id并且将文件内容写入磁盘返回给客户端file_id和路径信息、文件名,客户端保存相关信息上传完毕

下载机制

客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。

 

 

3、如何搭建fastDFS

请参考以下文章:

FastDFS + Nginx 反向代理缓存 安装与配置

地址:http://www.linux178.com/storage/fastdfs-nginx-cache.html

 

4、使用java调用fastDFS

以下代码是一个spring mvc中一个完整的上传请求

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    @ResponseBody
    public Object upload(@RequestParam MultipartFile file) {
        UploadResponse res = new UploadResponse();
        try {
            if(file.isEmpty()){
                res.setRet_code(UserCodeEnum.ERR_FILE_NULL.getCode());
                res.setRet_msg(UserCodeEnum.ERR_FILE_NULL.getDesc());
            }else{
                logger.info("UserController-upload-request-file=" + file.getOriginalFilename());

                String tempFileName = file.getOriginalFilename();
                //fastDFS方式
                ClassPathResource cpr = new ClassPathResource("fdfs_client.conf");
                ClientGlobal.init(cpr.getClassLoader().getResource("fdfs_client.conf").getPath());
                byte[] fileBuff = file.getBytes();
                String fileId = "";
                String fileExtName = tempFileName.substring(tempFileName.lastIndexOf("."));

                //建立连接
                TrackerClient tracker = new TrackerClient();
                TrackerServer trackerServer = tracker.getConnection();
                StorageServer storageServer = null;
                StorageClient1 client = new StorageClient1(trackerServer, storageServer);

                //设置元信息
                NameValuePair[] metaList = new NameValuePair[3];
                metaList[0] = new NameValuePair("fileName", tempFileName);
                metaList[1] = new NameValuePair("fileExtName", fileExtName);
                metaList[2] = new NameValuePair("fileLength", String.valueOf(file.getSize()));

                //上传文件
                fileId = client.upload_file1(fileBuff, fileExtName, metaList);

                res.setHead_img(UserConstants.FILE_IMG_URL+fileId);

                res.setRet_code(UserCodeEnum.SUCCESS.getCode());
                res.setRet_msg(UserCodeEnum.SUCCESS.getDesc());
            }

            logger.info("UserController-upload-response-" + JsonUtils.o2j(res));
        } catch (Exception e) {
            res.setRet_code(UserCodeEnum.ERR_UNKNOWN.getCode());
            res.setRet_msg(UserCodeEnum.ERR_UNKNOWN.getDesc());
            logger.error("UserController-upload-error", e);
        }
        return res;
    }

fastDFS java客户端配置文件fdfs_client.conf配置如下:

connect_timeout = 30
network_timeout = 60
charset = ISO8859-1
http.tracker_http_port = 8090
http.anti_steal_token = no
http.secret_key = 123456

tracker_server = 192.168.11.***:22122

 

参考:

http://blog.chinaunix.net/uid-20196318-id-4058561.html

http://tech.uc.cn/?p=221

 

时间: 2024-10-25 05:12:42

网站文件系统发展&&分布式文件系统fastDFS的相关文章

分布式文件系统-FastDFS

  一.FastDFS简介 一.FastDFS简介 FastDFS是由国人余庆所开发,其项目地址:https://github.com/happyfish100  FastDFS是一个轻量级的开源分布式文件系统,主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡.  支持存储服务器在线扩容,支持相同的文件只保存一份,节约磁盘.  FastDFS只能通过Client API访问,不支持POSIX访问方式.  FastDFS适合中大型网站使用,用来存储资源文件(如:图片.文档.视

C#和.NET中如何利用FastDFS打造分布式文件系统

背景 海量存储.系统负载的迁移.服务器吞吐的瓶颈等等 让文件系统独立于业务系统 提高整个项目的扩展性以及可维护性 目前主流的方案 MFS FASTDFS GFS LUSTRE HADOOP等等 我选择的是FASTDFS 用一句广告语来说 "免费.快速.找得到".FASTDFS的作者是淘宝的资深架构师余庆,很诙谐.很有爱!!!其他方案还没玩过 暂不评论. 简介 FastDFS是一款开源的轻量级分布式文件系统纯C实现,支持Linux.FreeBSD等UNIX系统类google FS,不是通

FastDFS+Nginx搭建分布式文件系统

一,关于FastDFS      FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传.下载等服务.      如上图,其中tracker并不保存实际的图片,而是起到一个协调的作用,具体的图片存储在storage里面.但我们页面上通过url读取图片的时候,我们读取的还是storager的地址,但是storager本身是不带

分布式文件系统FastDFS设计原理

  原文地址: http://blog.chinaunix.net/uid-20196318-id-4058561.html FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server).存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务.   Storage server Storage server(后简称st

各种分布式文件系统的比较

适合做通用文件系统的有 MooseFS,GlusterFS,Lustre. MooseFS 支持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多,易用,稳定,对小文件很高效. + 支持文件元信息 + mfsmount 很好用 + 编译依赖少,文档全,默认配置很好 + mfshdd.cfg 加 * 的条目会被转移到其它 chunk server,以便此 chunk server 安全退出 + 不要求 chunk server 使用的文件系统格

Windows Server 2003分布式文件系统特性

微软为了推动他们的Windows存储技术而进行了大量的投入.其中的一个非常关键的措施是在Windows Server 2003上不断投入成本,发展了一些新的分布式文件系统(DFS)特性. 分布式文件系统(DFS)是微软存储策略的基石,这一点在他们关于配置文件服务器的策略指南(在微软的官方网站上可以查到)上有所体现,这本指南还包括关于策划和实现基于分布式文件系统解决方案的进一步的资料. 下面介绍新的分布式文件系统(DFS)特性在技术上的一些亮点以及它们如何为用户提供长期的利益. 第一点好处是新技术

TFS分布式文件系统应用

TFS是淘宝开源的一套高性能文件存储系统,在阿里广泛应用, 除了自建文件系统,在应用上云的大趋势下,还可以使用阿里云的对象存储OSS服务:阿里云对象存储OSS首页 一.关于TFS TFS(Taobao File System)是一个高可扩展.高可用.高性能.面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问. TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用在淘宝各

当下流行的分布式文件系统大阅兵

当下流行的分布式文件系统大阅兵 本文对目前数种分布式文件系统进行简单的介绍.当前比较流行的分布式文件系统包括:Lustre.Hadoop.MogileFS.FreeNAS.FastDFS.NFS.OpenAFS.MooseFS.pNFS.以及GoogleFS. Lustre(www.lustre.org) lustre是一个大规模的.安全可靠的,具备高可用性的集群文件系统,它是由SUN公司开发和维护.该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数量存储系

Hadoop白皮书(1):分布式文件系统HDFS简介

Hadoop 分布式文件系统 (HDFS) 是运行在通用硬件上的分布式文件系统.HDFS 提供了一个高度容错性和高吞吐量的海量数据存储解决方案.HDFS 已经在各种大型在线服务和大型存储系统中得到广泛应用,已经成为各大网站等在线服务公司的海量存储事实标准,多年来为网站客户提供了可靠高效的服务. 随着信息系统的快速发展,海量的信息需要可靠存储的同时,还能被大量的使用者快速地访问.传统的存储方案已经从构架上越来越难以适应近几年来的信息系统业务的飞速发展,成为了业务发展的瓶颈和障碍. HDFS 通过一