最近看到一篇不错的写百度网盘如何实现的文章,写的简单易懂,原文链接:http://www.aboutyun.com/thread-8125-1-1.html
问题导读
1.百度网盘是如何分配空间的?
2.对于用户大量上传数据是如何处理的?
3.网盘是如何实现妙传的?
4.你对软件、云技术是否有新的认识?
前段时间在使用百度网盘时,突然发现百度网盘可以免费领取 2TB 空间啦!
网络硬盘大家可能都或多或少的接触过,不得不说在万物皆云的时代里,这是一种非常好的网络工具,而对我们这种穷到掉渣的免费用户来说,硬盘空间简直就是硬伤,刚开始使用的时候真是为了空间,各种折腾(做他那里所谓的任务),到头来也才扩充了5G左右。现在好了,随随便便、轻轻松松就有了2T的空间。
而这突如其来的2T空间是如何实现的呢?
事实是这样滴!
假如我想要为每个用户提供 1G 的网络存储空间。
如果服务器上有一颗 1000G 的硬盘可以全部为用户提供数据储存,如果每个用户分配 1G 的最大储存空间,那么能分配给多少个用户使用呢?
你一定说是 1000/1=1000 个用户。
但是事实上你这么分配了,你会发现每个用户平时根本不会上传 1G 的东西将容量占的满满的,有多有少,但平均用户平时只上传 50M 的文件,也就是说,如果你将 1000G 的硬盘分给 1000个人使用,但只有效利用了其中的 50M*1000=50G 的空间,剩余 950G 的空间基本都完全浪费了。
那么怎么解决呢?
你可以变通一下,将这 1000G 的空间分配给 20000个用户使用,每个人的上传上限容量还是1G,但每人平时还是平均上传 50M 的数据,那么 20000*50M=1000G,这下子就把宝贵的服务器上的存储空间充分利用了。但你又怕这样分配给 20000个人后,万一某一刻人们突然多上传点数据,那么用户不是就觉察出来你分给人家的 1G 空间是假的了吗?所以可以不分配那么多人,只分配给 19000 人,剩下一些空间做应急之用。
突然发现一下子将可分配的用户数量翻了 19倍啊,了不起。那还有没有办法更加有效的利用一下呢?
如果我有 1000个 以上的服务器,一个服务器上有 1000G 空间,那么我们每个服务器上都要留下 50G 的空白空间以备用户突然上传大数据时导致数据塞满的情况,那么我这 1000个服务器上就空出了 1000台*50G=50000G 的空间被浪费了,多么可惜。所以攻城狮们发明了存储集群,使得一个用户的数据可以被分配在多个服务器上存储,但在用户那看起来只是一个 1G 的连续空间,那么就没必要在每个服务器上预留出应急的空间了,甚至可以充分的将前一个服务器塞满后,在将数据往下一个服务器中塞。这样保证了服务器空间的 最大利用,如果某一刻管理员发现用户都在疯狂上传数据(在一个大规模用户群下,这样的概率少之又少)导致我现有提供的空间不够了,没关系,只需要随手加几块硬盘或者服务器就解决了。
好吧,这下子我们的服务器空间利用高多了,可以将一定量的空间分配给最多的用户使用了。但有没有更好的改进方案呢?
管理员有一天发现,即使每个用户平均下来只存储 50M 的东西,但这 50M 也不是一蹴而就的,是随着1-2年的使用慢慢的达到这个数量的,也就是说,一个新的用户刚刚注册我的网络空间时,不会上传东西,或者只上传一点非常小的东西。那么我为每一个用户都初始分配了 50M 的空间,即使将来2年后他们会填满这 50M ,但这期间的这空间就有很多是浪费的啊。所以聪明的攻城狮说:既然我们可以分布式、集群式存储,一个用户的数据可以分布在多个服务器上,那么我们就假设一开始就给一个新注册的用户提供 0M 的空间,将来他用多少,我就给他提供多少存储空间,这样就彻底的保证硬盘的利用了。但用户的前端还是要显示 1G 的。
工程师的这个点子,使得我在建立网盘初期能用 1台 1000G 的服务器提供了大约 1000000 人来注册和使用,随着注册的人多了,我也有钱了,也可以不断增加服务器以提供他们后期的存储了。同时因为一部分服务器完成了一年多购买,我的购买成本也下来了。
那么…这就结束了吗?
若是邮箱提供商的话,这样的利用率够高了。但网盘就不一样了。
聪明的工程师发现:不同于邮箱,大家的内容和附件绝大多数都是自创的和不同的。但网盘上大家上传的东西很多都是重复的。
比如:张三今天下载了一部《TOKYO HOT》上传到了自己的网盘上,李四在三天后也下载了一模一样的《TOKYO HOT》上传到了网络硬盘上,随着用户的增多,你会发现总共有 1000个人上传了1000份一模一样的文件到你宝贵的服务器空间上,所以工程师想出一个办法,既然是一样的文件,我就只存一份不久好啦,然后在用户的前端显示是没人都有一份不久行啦。当某些用户要删除这个文件的时候,我并不真的删除,只需要在前端显示似乎删除了,但后端一直保留着以供其他拥有此文件的用户下载。直到所有使用此文件的用户都删除了这个文件我再真的将其删除吧。
这样子随着存储的数据越来越多,注册的用户越来越多,其上传的重复数据越来越多。你发现这样的检测重复文件存储的效率越来越大。这样算下来似乎每个人上传的不重复的文件只能平均 1M/用户。这下子你可以提供超过50倍的用户使用您这有限的空间了。
但伴随着使用,你又发现一个规律:
张三上传的《TOKYO HOT N0124》和李四上传的《TH n124》是同一个文件,只不过文件名不一样,难道我就不能识别出他们是一个文件,然后只将其分别给不同的用户保存成不同的文件名不就行啦?确实可行,但这要利用一些识别文件相同性的算法,例如MD5值等。只要两个文件的 MD5 值一样,文件大小一样,我就认为它们是相同的文件,只需要保存一份文件并给不同的用户记作不同的文件名就好了。
有一天你发现,因为每一个文件都需要计算 MD5 值,导致 CPU 负荷很大,而且本来一样的文件非要浪费带宽上传回来才可以检测一致性,能改进一下吗?
聪明的工程师写了个小软件或小插件,美其名曰“上传控件”,将计算 MD5 的工作利用这个软件交给了上传用户的电脑来完成,一旦计算出用户要上传的数据和服务器上已经存储的某个数据是一样的,就干脆不用上传了,直接在用户那里标记上这个文件已经按照 XX 文件名上传成功了。这个过程几乎是瞬间搞定了,并给其起了个高富帅的名字“秒传”!
通过以上这么多步骤,你发现本来你只能给 1000用户 提供网络空间的,这么多改进办法后,在用户端显示 1G 空间不变的情况下,近乎可以为 1000000个用户 提供网络空间了。
这样若是您哪天心情好,对外宣传说:我要将每个用户的存储空间上限提升到 1TB。那么每个用户平均还是只上传 50M 数据,只有极个别的用户上传了突破 1G 原始空间的数据,你会发现所付出的成本近乎是微乎其微的。
辛勤的攻城狮还在为如何更有效率的利用服务器提供的磁盘空间在不屑努力和挖掘着……

百度网盘是如何实现妙传的相关推荐

  1. python调用百度网盘开放平台接口上传本地文件

    本文章是为如何在没有GUI的环境下,使用指令行上传文件到百度网盘提供一个思路,其他操作请自行查询官方文档拓展. 前期工作 申请成为开发者 创建应用 记录AppKey和SecreKey,后续开发需要使用 ...

  2. python 调取百度网盘API,实现上传下载

    向AI转型的程序员都关注了这个号

  3. linux环境下,模拟百度网盘上传、下载文件

    目录 1.题目 2.运行截图 3.总体设计 4.详细设计 5.源码 5.1服务端 5.2客户端 1.题目 1)模仿百度网盘实现一个文件上传.下载.浏览的终端网盘; 2)能够实现文件和目录的存储; 3) ...

  4. 2019的百度网盘下载速度太慢老是限速怎么解决?

    还在为Mac百度网盘下载速度慢而烦恼吗?百度云盘又是一个非常实用的分享工具,可支持图片.视频.音乐.文档.种子以及其他资源分类储存,但是,百度网盘客户端限速后一般只有几十K的下载速度,今天要给大家分享 ...

  5. 用户盘云存储——百度网盘

    近期一直在学习用户盘之类的问题,上午正好有机遇和大家分享一下. 百度网盘 百度网盘是百度推出的一项云存储服务,初次注册即有机遇得取15GB的空间,前目有Web版.Windows客户端.Android手 ...

  6. 在服务器上使用百度网盘下载资源

    雁引愁心去,山衔好月来.--李白<与夏十二登岳阳楼> 前言 最近在使用时发现,上传资源的时候十分缓慢,这是个十分棘手的问题,因为如果文件十分巨大的话,那么上传文件将费时费力,所以我就在想有 ...

  7. 百度网盘VIP功能免费用!官方出品的这个文件管理App,太赞了!

    点击上方"涛哥聊Python",选择"星标"公众号 重磅干货,第一时间送达 小北之前买了个iPad,但不习惯苹果的文件管理,自带的实在是太不好用了. 于是就想起 ...

  8. AutoDL使用百度网盘来进行数据的交互

    文章目录 1. 简介 2. 操作 2.1. 设置密码 2.1.1. 登录网盘 2.2. 访问网盘中的数据 2.3. 将数据放入到网盘中 1. 简介 AutoDL上面其实是可以直接使用百度网盘.阿里云盘 ...

  9. linux下备份mysql上传到网盘_Linux命令行上传文件到百度网盘

    最近在学习 MySQL 的 bin-log 时候考虑到数据备份的问题,突然想到如果能将数据通过 Linux 命令行方式备份到百度网盘,那是一件多么牛逼的事情.百度网盘有免费的 2TB 存储空间,而且有 ...

最新文章

  1. 《OpenCV3编程入门》学习笔记10 角点检测(二)Shi-Tomasi角点检测
  2. 科学家利用脑机接口让患者正常发声
  3. cordova打包安卓app
  4. 单片机 PWM输出 c
  5. c语言深度剖析第三版pdf_入门到入坟,蕴含全网最强知识点3283页笔记、pdf教程,活到老,学到老...
  6. c语言封闭曲线分割平面_高手的平面课堂:8种常用的设计排版方式,告别通宵加班...
  7. 手把手教你用express搭建个人博客(二)
  8. 【原理篇】推荐系统之矩阵分解模型
  9. 开发错误记录2 .MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
  10. Bean的作用域scope
  11. et中计算机的快捷键,新手求助ET软件快捷键(求实用型的)
  12. wifi连接过程抓包
  13. 太美医疗:药物警戒(PV)人员的职业发展之道
  14. ping不通云服务器,ping不通云服务器是什么原因
  15. 一文说透hive中的分桶及抽样查询
  16. 测试用例-------纸杯
  17. pstate0 vid数值意义_光行差成因和物理意义新解及其验证方法
  18. android 小米加载大图,Android手机拍照或从本地相册选取图片设置头像。适配小米、华为、7.0...
  19. objectArx --- ADS篇
  20. PXE实现系统批量自动安装

热门文章

  1. 手把手教你白嫖一个服务器并搭建自己的远程Notebook
  2. Navicat ORA-12737 ZHS16GBK
  3. 实验11-2-7 统计专业人数 (15 分)
  4. JavaSE-类和对象基础
  5. 控制台也能炫-chrome浏览器控制台输出彩色文字
  6. AVL-Cruise纯电动汽车仿真建模教程-能量回收策略的实现
  7. c语言写字符舞蹈,C语言实现舞伴问题
  8. iTouch3-32G升级4.2.1并越狱
  9. 【新概念4】【7】Bats
  10. STM32单片机IAP介绍