专业书籍精读 · System Design Interview 卷二 · 第 9 章

设计对象存储

System Design Interview Vol 2 · Ch 9 · Alex Xu & Sahn Lam · 2022

EN →

这一章讲什么?

你手机里的照片自动备份、网站上的图片和视频、公司里那些永远删不掉的日志——它们大多住在一种叫对象存储的地方。这一章就是从零造一个这样的仓库:怎么装得下、怎么不丢、怎么还便宜。

先说个怪事

这种仓库有一条听起来很蠢的规矩:东西一旦存进去,就不许原地改。哪怕只想改一个字,也得把整份重新存一遍。

可恰恰是这条「退让」,换来了后面所有的好处。因为不许改,就不用担心几份拷贝之间对不对得上;不用担心,就能随便多放几份、放到很远的地方、放在很便宜的盘上。它不是被迫这样,是主动砍掉一个能力去换另一堆能力。

旧世界为什么难

我们熟悉的存法是像电脑里的文件夹一样层层套下去。东西少的时候很好用,可一旦是几十亿份,目录本身先撑不住:光是「这份东西叫什么、在哪儿」的登记簿就大到一台机器放不下。

更麻烦的是小东西特别费地方:仓库给每件货都要贴一张登记卡,一张照片可能只有几十 KB,那张卡却是固定成本。几十亿张卡加起来,比货还占地方。

核心机制直觉

① 账本和货架分家。「这份东西叫什么、谁的、什么时候存的」记在一本账本里;东西本身的字节堆在货架上。两者用一张取件单连起来。账本要频繁翻改、所以用擅长改的系统;货架只增不改、所以用最便宜的盘。

② 小件集包。不给每张小照片单独配一个箱子,而是把成百上千张顺手码进同一个大箱子,只在账本上记一句「在 7 号箱、从第几厘米开始、多长」。要取的时候直接伸手到那一段,不用把箱子拆开。

③ 抄三份,还是拆碎片配「补牌」。防丢最笨的办法是同一份抄三遍,占三倍地方。聪明的办法是:把一份东西拆成 8 块,再照着这 8 块算出 4 块补牌;12 块分放在不同机器上,随便坏掉哪 4 块,都能用剩下的推回原件——像记住了一道菜的配方,少一味也能反推出它是什么。只多占一半地方,扛得却比抄三份还多。

④ 定期体检。硬盘上的字节会自己悄悄变坏,没人报错。所以存的时候顺手记一个「指纹」,后台隔一阵就翻出来核对,对不上就用别处的好拷贝补回来。

代价在哪

拆碎片虽然省地方,但取东西时得同时找齐好几块拼回来,所以比直接拿一份现成的慢——热门的东西通常还是老老实实多抄几份。

一句话记住

对象存储是一场主动的减法:放弃「原地修改」,换来近乎无限的扩展、便宜的盘和极高的安全性。做法是把账本和货架拆成两套完全不同的东西,小件集包省登记卡,靠「拆碎片 + 补牌」用一半多的地方换掉三倍的拷贝,再用定期体检防住字节自己变坏。代价是取东西要拼装,所以慢一点。

想进到具体机制、记号和示意图? → 切到精读版