网盘容量的秘密

杂谈 秋水逸冰 14569浏览 6评论

微云

  本以为网盘大战已经告一段落了,没想到后劲不小。《网盘作战大升级》一文中的活动链接已更新。百度目前到3T,微云直接10T,微盘的“吓死人”其实就是分享不限量,360则到了38T。
  国内的网盘公司都在 TB 的级别上竞争,而国外如Dropbox,Google Drive,SkyDrive则一直没有动静。知乎上有人问,就硬件成本来计算,成本会不会太高?比如说百度网盘一亿用户,每人3T,成本是怎样的?真相究竟是什么?

  以下为转载,有删改(主要是错别字),揭晓的秘密只是部分,有待发掘更多。

  举例来说,我想要为每个用户提供 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 的工作交给了上传用户的电脑来完成,一旦计算出用户要上传的数据和服务器上已经存储的某个数据是一样的,就干脆不用上传了,直接在用户那里标记上这个文件已经按照某某文件名上传成功了。这个过程几乎是瞬间搞定了,并给其起了个高富帅的名字“秒传”!
  通过以上这么多步骤,你发现本来你只能给 1000用户提供网络空间的,这么多改进办法后,在用户界面显示 1G 空间不变的情况下,近乎可以为 1000000个用户提供网络空间了。
  这样若是您哪天心情好,对外宣传说:我要将每个用户的存储空间上限提升到1TB。那么每个用户平均还是只上传50M数据,只有极个别的用户上传了突破1G原始空间的数据,你会发现所付出的成本近乎是微乎其微的。

最后提一个醒,说免费无限容量的真的信得过吗?参考雅虎中国早年关闭相册和现在关闭邮箱的行为便知端倪。

PS:目前百度的离线下载功能还很弱,主要体现在资源库没有迅雷的大,不是最热的那些资源都下载不到,毕竟迅雷是培养了好几年才牛逼的……相信百度此番免费政策出来后离线下载功能会越来越完善的。

参考链接:http://www.zhihu.com/question/21591490

转载请注明:秋水逸冰 » 网盘容量的秘密

发表我的评论
取消评论

请输入正确答案后提交评论 *超出时限。 请再次填写验证码。

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (6)

  1. 我之前就一直在想他们那里来那么多服务器,每个人几个T?看完这个文章才发现原来是这样
    wzc0x09年前(2015-04-18)回复
  2. 越大意义越不大,越不安全
    Andrew11年前(2013-09-12)回复
  3. 这样的解释很牵强嘛,n124又如何解释?
    smartsun11年前(2013-09-12)回复
    • 这个真的是随便起的名字而已。况且你看清楚了,此文为转载。
      秋水逸冰11年前(2013-09-12)回复
  4. 这些都是牛逼的算法啊,可是为什么是tokyo hot 又为什么是n124
    smartsun11年前(2013-09-11)回复
    • 这都是举例而已嘛。因为最近网盘很hot所以东京也hot了。
      秋水逸冰11年前(2013-09-11)回复