由于许多人给我们发送了电子邮件,说他们想阅读有关系统设计面试的更多信息,因此我们将在此主题上做更多介绍。我很高兴听到很多反馈,如果您有任何建议或问题,请通过发表评论告诉我们。
本周,我将讨论键值存储。键值存储是一种非常强大的技术,几乎在世界上的每个系统中都使用。它可以像哈希表一样简单,同时也可以是分布式存储系统。例如,Cassandra的下划线系统是键值存储系统,而Cassandra被广泛用于许多公司,如Apple,Facebook等。
在本文中,我将介绍诸如基本键值存储系统,分布式键值存储以及包括分片在内的扩展问题等主题,所有这些都可能在系统设计访谈中涉及。
基本键值存储
您将如何在单台机器上设计一个简单的键值存储系统?
最简单的方法是使用哈希表存储键值对,这是当今大多数此类系统的工作方式。哈希表使您可以在恒定时间内读取/写入键值对,并且非常易于使用。大多数语言对此都有内置支持。
但是,缺点也很明显。使用哈希表通常意味着您需要将所有内容存储在内存中,这在数据集很大时可能无法实现。有两种常见的解决方案:
- 压缩数据。这应该是首先要考虑的事情,通常会有很多东西可以压缩。例如,您可以存储参考而不是实际数据。您也可以使用float32而不是float64。此外,使用不同的数据表示形式(例如位数组(整数)或向量)也可能有效。
- 存储在磁盘中。如果不可能将所有内容都放入内存中,则可以将部分数据存储到磁盘中。为了进一步优化,您可以将系统视为缓存系统。经常访问的数据保存在内存中,其余数据保存在磁盘上。
分布式键值存储
最有趣的主题肯定是将键值存储扩展到多台计算机。如果要支持大数据,则一定要实现分布式系统。让我们看看如何设计分布式键值存储系统。
如果您已阅读Design a Cache System,那么您会发现这里的许多概念是完全相同的。
由于单台计算机没有足够的存储空间来存储所有数据,因此这里的总体思路是按照某些规则将数据拆分为多台计算机,并且协调器计算机可以将客户端定向到具有请求资源的计算机。问题是如何将数据分成多台计算机,更重要的是,什么是分割数据的好策略?
分片
假设所有键都是URL,例如http://gainlo.co,我们有26台计算机。一种方法是根据URL的第一个字符(“ www”之后)将所有密钥(URL)划分给这26台计算机。例如,http://gainlo.co将存储在机器G上,而http://blog.gainlo.co将存储在机器B上。那么,这种设计的缺点是什么?
让我们忽略URL包含ASCII字符的情况。好的分片算法应该能够均衡所有计算机的流量。换句话说,理想情况下,每台计算机应收到相等的请求。显然,以上设计无法正常工作。首先,存储空间分布不均。以“ a”开头的URL可能比“ z”更多。其次,某些URL更受欢迎,例如Facebook和Google。
为了平衡流量,最好确保密钥是随机分配的。另一种解决方案是使用URL的哈希,通常具有更好的性能。要设计好的分片算法,您应该充分了解应用程序,并可以估计系统的瓶颈。
摘要
关于键值存储的话题太多了,我几乎无法将它们全部写成一篇文章。如您所见,在扩展系统时,要考虑的问题更多,这就是为什么许多人发现分布式系统很困难的原因。
在下一篇文章中,我们将继续讨论,并将涵盖有关扩展系统的更多信息。将讨论诸如系统可用性,一致性之类的问题。