网站文件系统发展

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)@ResponseBodypublic 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 = 123456tracker_server = 192.168.11.***:22122

参考:

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

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

网站文件系统发展分布式文件系统fastDFS相关推荐

  1. 从文件系统到分布式文件系统

    关注+星标公众号,不错过精彩内容 来源 | 博文视点Broadview 提醒:文末有福利! 我们无时无刻不在使用文件系统,进行开发时在使用文件系统,浏览网页时在使用文件系统,玩手机时也在使用文件系统. ...

  2. 从单机文件系统到分布式文件系统

    文件及硬盘管理是计算机操作系统的重要组成部分,文件是存储在硬盘上的,文件的读写访问速度必然受到硬盘的物理限制,那么如何才能1分钟完成一个100T大文件的遍历呢? 做软件开发时,必然要经常和文件系统打交 ...

  3. hadoop分布式文件系统_Hadoop分布式文件系统简介

    hadoop分布式文件系统 HDFS是Apache Software Foundation项目和Apache Hadoop项目的子项目(请参阅参考资料 ). Hadoop是存储诸如TB和PB之类的大量 ...

  4. linux 文件系统 dfs,分布式文件系统fastDFS 机器硬件要求

    复制内容到剪贴板 代码:top - 14:18:28 up 233 days, 10:56,  1 user,  load average: 0.01, 0.02, 0.00 Tasks: 278 t ...

  5. FastDFS 分布式文件系统入门

    1 简介 分布式文件系统(Distributed File System,DFS)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点(可简单的理解为一台计算机)相连:或 ...

  6. 学习——分布式文件系统 fastDFS

    1 什么是分布式文件系统 1.1 技术应用场景 文件太多如何高效存储?用户访问量大如何保证下载速度?这些问题都可以通过分布式文件系统解决.分布式文件系统解决了海量文件存储及传输访问的瓶颈问题,对海量视 ...

  7. 分布式存储--理解分布式文件系统、分布式块存储、分布式对象存储、分布式数据库

    1. 单机文件系统 vs 分布式文件系统 传统单机文件系统是计算机中一个非常重要的组件,为存储设备提供一致的访问和管理方式.在不同的操作系统中,文件系统会有一些差别,但也有一些共性几十年都没怎么变化: ...

  8. 各类分布式文件系统的区别和概述 | HDFS、GFS、Ceph、TFS、Moosefs、IPFS等

    文章目录 参考 分布式文件系统定义 各类系统对比图 各类文件系统简介 shepdog shepdog基本架构 Ceph FastDFS fastDFS介绍 Tracker server 追踪服务器 S ...

  9. 2021年大数据Hadoop(七):HDFS分布式文件系统简介

    2021大数据领域优质创作博客,带你从入门到精通,该博客每天更新,逐渐完善大数据各个知识体系的文章,帮助大家更高效学习. 有对大数据感兴趣的可以关注微信公众号:三帮大数据 目录 HDFS分布式文件系统 ...

最新文章

  1. Rails插件:CanCan权限验证插件学习总结
  2. vs2017 2019 下载更新慢的解决方法
  3. 164. Leetcode 435. 无重叠区间 (贪心算法-贪心区间)
  4. linux硬盘检测工具,CrazyDiskInfo 硬盘检测工具 Linux版 | 厘米天空
  5. 如何建立MSSQL数据库
  6. OpenGL ES Emulator横向比较
  7. Struts2标签-checkbox只读属性设置
  8. Build.VERSION类
  9. pytorch教程之nn.Sequential类详解——使用Sequential类来自定义顺序连接模型
  10. C# 处理图像三种方法对比
  11. 区块链赋能供应链金融
  12. PLC扩展模块总线连接方式?IO扩展模块和主模块。西门子用到的总线中的一种背板总线简单介绍扩展模块中也有控制芯片(CPU)(或者类似SPI协议芯片),除了扩展模块(SM)还有扩展板(SB)
  13. Python基础入门知识(1)
  14. python泰坦尼克号数据预测_泰坦尼克号幸存者预测 python 详解
  15. 【论文笔记 | TGRS 2021】多内容互补网络:MCCNet
  16. JavaScript保姆级教程
  17. 海南大学838信号与系统专业课的感悟
  18. M1芯片完美运行安卓模拟器,简单无坑
  19. Android Studio - 北极狐 | 2020.3.1 补丁 2 现已推出
  20. 网友自曝:编程从入门到放弃!方法比选择更重要!

热门文章

  1. 基于virtualbox的centos7安装jdk1.8
  2. java 不刷新页面_java – 更新jsp页面的内容而不刷新
  3. python 网络请求框架_python 框架
  4. java单例模式深入详解_javascript 模块依赖管理的本质深入详解
  5. formdata 接受参数中带有class 对象_浅析JAVA中的反射机制及对Servlet的优化
  6. python123第九周测验答案2020_脑筋急转弯:什么牛是最好骗的?这答案能笑死人...
  7. java 文本词频统计_Java实现中文词频统计
  8. java中的saturn_Saturn分布式调度平台系列:高屋建瓴之设计原理简析
  9. 7wifi模块多少钱_APP开发要多少钱?创业者估算成本的四个方法
  10. openstack horizon dashboard_OpenStack最新版本:Ussuri发布亮点