本文来自知乎 @杜鑫 的回答

       比如百度 1T,腾讯、360 多 T,就硬件成本来计算,是不是太可怕了,公司会投入这么多么?假设百度盘一千万用户,每人 1T,有人能算算成本么?真相究竟是什么?

我想要为每个用户提供 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 原始空间的数据,你会发现所付出的成本近乎是微乎其微的。

       辛勤的工程师还在为如何更有效率地利用服务器提供的磁盘空间在不屑努力和挖掘着......

转载于:https://www.cnblogs.com/peghoty/p/3798541.html

为什么国内的网盘公司都在 TB 的级别上竞争,成本会不会太高?相关推荐

  1. PHP网站设计 ---- 网盘(实现用户注册、登录,文件上传、下载、删除、查看等功能)

    PHP网站设计 ---- 网盘(实现用户注册.登录,文件上传.下载.删除.查看等功能) 运行效果 视频演示 项目下载(在xampp/htdocs/下可以直接运行) 完整项目包.zip 功能要求 当用户 ...

  2. 百度网盘搜索源码,新加分词功能,内容相关度聚合更高

    百度网盘搜索源码说明: 最佳适用环境:linux(如果不是linux系统,win系统也可以,但是php天生就是跑在linux上的,linux上跑php性能不是win系统可以比拟的) 源码说明:php+ ...

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

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

  4. 别人给你网盘分享东西怎么搞到电脑上看呢?

    百度网盘电脑版好像不能直接看 别人分享的东西 比较合适的方法是 先保存在自己的网盘 很快啊 之后在自己的网盘上面下载下来 就比较方便快捷!

  5. 解决百度网盘下载慢限速问题(2019亲测可用)下载速度不要太爽了

    分享一款下载器 先看效果图: 安装说明 本软件需要安装浏览器插件和客户端 下载地址 微云:链接:https://share.weiyun.com/5nKat9Z 密码:7fkdc7 客户端安装 在上面 ...

  6. 百度云是如何做到甄别用户上传到网盘的违规内容并删除用户上传的资源的?

    文件hash值(或者其他特征值)黑名单,特殊字符,由机器审核,这样同样内容的文件第一次检验之后就可以自动化.定黑名单的过程应该是举报加人工审核. 违规文件的hash值对比. 违规关键字分析,匹配. 特 ...

  7. 不小心修改盘符导致百度网盘卸载不了也安装不上解决办法

    这种情况只能修改注册表项了 原因: 本地文件已经消失,注册表内却存在对应数值 解决办法: 找到: 删除即可解决.

  8. 2021年还有哪些支持WebDAV的网盘?

    2021年还有哪些支持WebDAV的网盘? 对网盘(特别是在用坚果云)比较熟悉的朋友们应该都听说过WebDAV,目前国内只有极少数的云盘服务支持,坚果云是比较被大家熟知的一家. 可是,多数人也仅限于听 ...

  9. 百度文件下载慢怎么办?~教你百度网盘无需VIP离线下载大文件

    百度文件下载慢怎么办?-教你百度网盘无需VIP离线下载大文件 众所周知,百度网盘的文件已经对非会员进行了各种限速.不过由于国内其他网盘基本都残废了,百度网盘作为仅存的少数几个,需求还是很大的,经常会碰 ...

最新文章

  1. 算法与数据结构之二分查找
  2. WSUS 3.0 STEP BY STEP 配置手册
  3. 【OpenCV 例程200篇】09. 图像的裁剪(cv2.selectROI)
  4. Nginx的配置中与流量分发相关的配置规范:
  5. OGG ORA-1403 NO DATA FOUND
  6. c#中dateTimePicker怎么获取当前的日期
  7. Eps总结(1)——Eps入门级基本操作:新建工程、加载数据、新建对象、输入输出对象、基本操作
  8. plsql development 注册码
  9. 右键文件夹提示“No localized file found - emedloc.dll”
  10. 刀客传说html5游戏在线玩,影子刀客传说
  11. TopCoder 详细规则入门(灰常实用)
  12. 13个SpringBoot优秀学习项目
  13. 前端对接身份证阅读器/标签打印机/扫码枪记录
  14. 新概念2 课文和单词(4)
  15. iPhone以旧换新折抵价 苹果XS用户一眨眼亏了550元
  16. PHP超大文件上传与下载
  17. 如何从电脑彻底清除mysql_如何彻底删除MYSQL
  18. JAVA设计模式什么鬼(初探)——作者:凸凹里歐
  19. 工欲善其事必先利其器IDEA篇
  20. 从零搭建webpack的react开发/生产环境

热门文章

  1. Spring-Data-Redis存储对象(redisTemplate)
  2. MVC5 Action的view()直接输出字符串方式
  3. Linux怎样创建FTP服务器--修改用户默认目录-完美解决 - 费元星
  4. iOS开发 发布之后的Crash错误反馈(二)
  5. 拦截Response.Redirect的跳转并转换为Js的跳转
  6. [置顶] 根据 子网掩码 算出 最大主机数目
  7. 排除IIS特殊管理困惑
  8. java jquery jsonp 跨域_Jquery跨域调用(JSONP)遇到error问题的解决
  9. imgcms php,imgcms IMGCMS PHP image management system - 下载 - 搜珍网
  10. html 滚动条,菜鸟,ionic 滚动条