MIT6.824/lecture-01-introduction/1.4-xing-neng-performance.md
2022-09-22 15:45:49 +08:00

30 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 1.4 可扩展性Scalability
另一个在很多论文中都出现过重要的话题,就是性能。
通常来说构建分布式系统的目的是为了获取人们常常提到的可扩展的加速。所以我们这里追求的是可扩展性Scalability。而我这里说的可扩展或者可扩展性指的是如果我用一台计算机解决了一些问题当我买了第二台计算机我只需要一半的时间就可以解决这些问题或者说每分钟可以解决两倍数量的问题。两台计算机构成的系统如果有两倍性能或者吞吐就是我说的可扩展性。
![](<../.gitbook/assets/image (188).png>)
这是一个很强大的特性。如果你构建了一个系统,并且只要增加计算机的数量,系统就能相应提高性能或者吞吐量,这将会是一个巨大的成果,因为计算机只需要花钱就可以买到。如果不增加计算机,就需要花钱雇程序员来重构这些系统,进而使这些系统有更高的性能,更高的运行效率,或者应用一个更好的算法之类的。花钱请程序员来修补这些代码,使它们运行的更快,通常会是一个昂贵的方法。我们还是希望能够通过从十台计算机提升到一千台计算机,就能扛住一百倍的流量。
所以,当人们使用一整个机房的计算机来构建大型网站的时候,为了获取对应的性能,必须要时刻考虑可扩展性。你需要仔细设计系统,才能获得与计算机数量匹配的性能。
我在课程中可能经常会画图来说明,比如我们来看这样一个图。假设我们建立了一个常规网站,一般来说一个网站有一个 HTTP服务器还有一些用户和浏览器用户与一个基于Python或者PHP的web服务器通信web服务器进而跟一些数据库进行交互。
![](<../.gitbook/assets/image (190).png>)
当你只有1-2个用户时一台计算机就可以运行web服务器和数据或者一台计算机运行web服务器一台计算机运行数据库。但是有可能你的网站一夜之间就火了起来你发现可能有一亿人要登录你的网站。你该怎么修改你的网站使它能够在一台计算机上支持一亿个用户你可以花费大量时间极致优化你的网站但是很显然你没有那个时间。所以为了提升性能你要做的第一件事情就是购买更多的web服务器然后把不同用户分到不同服务器上。这样一部分用户可以去访问第一台web服务器另一部分去访问第二台web服务器。因为你正在构建的是类似于Reddit的网站所有的用户最终都需要看到相同的数据。所以所有的web服务器都与后端数据库通信。这样很长一段时间你都可以通过添加web服务器来并行的提高web服务器的代码效率。
![](<../.gitbook/assets/image (192).png>)
只要单台web服务器没有给数据库带来太多的压力你可以在出现问题前添加很多web服务器但是这种可扩展性并不是无限的。很可能在某个时间点你有了10台20台甚至100台web服务器它们都在和同一个数据库通信。现在数据库突然成为了瓶颈并且增加更多的web服务器都无济于事了。所以很少有可以通过无限增加计算机来获取完整的可扩展性的场景。因为在某个临界点你在系统中添加计算机的位置将不再是瓶颈了。在我们的例子中如果你有了很多的web服务器那么瓶颈就会转移到了别的地方这里是从web服务器移到了数据库。
这时,你几乎是必然要做一些重构工作。但是只有一个数据库时,很难重构它。而虽然可以将一个数据库拆分成多个数据库(进而提升性能),但是这需要大量的工作。
![](<../.gitbook/assets/image (193).png>)
我们在本课程中,会看到很多有关分布式存储系统的例子,因为相关论文或者系统的作者都在运行大型网站,而单个数据库或者存储服务器不能支撑这样规模的网站(所以才需要分布式存储)。
所以,有关扩展性是这样:我们希望可以通过增加机器的方式来实现扩展,但是现实中这很难实现,需要一些架构设计来将这个可扩展性无限推进下去。