📜  系统设计——水平和垂直扩展

📅  最后修改于: 2021-10-19 04:40:50             🧑  作者: Mango

如果您是开发人员,那么构建网站并将其提供给用户对您来说可能是最令人愉快的事情。毕竟,您努力工作,并试图为用户创造一些有价值的东西。当您看到大量用户开始使用您的服务并且用户数日复一日地增长时,您真的感到很惊讶,并开始考虑将您的服务提升到一个新的水平。看到不断增长的数字让您感觉很好,但您很快就会意识到您的机器或服务器无法再处理大量请求,并且可能随时停止响应。现在,您需要找到一种解决方案来为大量请求扩展您的应用程序。您将如何解决这个问题?,您将采用什么方法来扩展您的应用程序?

系统设计水平和垂直扩展

无论您为哪家公司工作或您正在构建什么样的网站,大多数情况下您都会面临这种情况,作为开发人员,您有责任找到解决此问题的方法,因为好。您将不得不扩展您的应用程序的可访问性、功能和存在。您可以通过添加额外硬件或升级当前系统配置(称为可扩展性)来解决此问题。在这篇博客中,我们将讨论扩展应用程序,这也是系统设计轮面试的一个重要概念。如果你的目标是进入一家大型科技巨头公司,那么你应该对这一轮非常了解这个概念。

扩展数据库的选项可以分为两大类……

  • 垂直缩放
  • 水平缩放

缩放概念

1. 垂直缩放

简单来说,升级单台机器的容量或迁移到具有更大功率的新机器称为垂直扩展。您可以通过添加更好的处理器、增加 RAM 或其他提高功率的调整来为您的机器增加更多功率。通过从小机器切换到大机器可以轻松实现垂直扩展,但请记住,这涉及停机时间。您可以在不操作代码的情况下增强服务器的功能。

  • 这种方法也称为“放大”方法。
  • 它不需要任何数据分区,所有流量都驻留在具有更大容量的单个节点上。
  • 易于实施。
  • 由于您只需要管理一个系统,因此管理工作更少。
  • 保持应用程序兼容性。
  • 主要用于中小型企业。
  • MySQL 和 Amazon RDS 是垂直扩展的一个很好的例子。

缺点

  • 有限的缩放。
  • 改进网络 I/O 或磁盘 I/O 的潜力有限。
  • 在这种方法中,更换服务器需要停机。
  • 中断和硬件故障的风险更大。
  • 未来可升级的范围有限。
  • 实施成本昂贵。

2. 水平缩放

对于有高可用性或故障转移要求的项目,此方法是最佳解决方案。在水平扩展中,我们通过向网络添加更多机器、跨多个设备共享处理和内存工作负载来增强服务器的性能。我们只需将更多的服务器实例添加到现有的服务器池中,并在这些服务器之间分配负载。在这种方法中,不需要改变服务器的容量或更换服务器。此外,与垂直扩展一样,在向网络添加更多服务器时不会出现停机时间。大多数组织选择这种方法是因为它包括增加 I/O 并发性、减少现有节点上的负载以及增加磁盘容量。

  • 这种方法也称为“横向扩展”方法。
  • 借助分布式文件系统、集群和负载平衡,可以实现水平可扩展性。
  • 可以有效地管理交通。
  • 更容易运行容错。
  • 易于升级
  • 即时和持续的可用性。
  • 易于根据您的需要调整大小和调整大小。
  • 与扩大规模相比,实施成本更低
  • Google 及其 Gmail 和 YouTube、Yahoo、Facebook、eBay、Amazon 等都在大量使用水平扩展。
  • Cassandra 和 MongoDB 是水平扩展的一个很好的例子。

缺点

  • 复杂的建筑设计
  • 高昂的许可费
  • 高公用事业成本,例如(冷却和电力)
  • 需要额外的网络设备,如路由器和交换机。

简短比较

我们已经理解了扩展应用程序的两个主要类别的含义。我们还讨论了它们各自的一些优缺点。让我们根据这些优缺点对这两种方法进行快速比较……

Horizontal Scaling

Vertical Scaling

Load balancing required Load balancing not required
Resilient to system failure Single point of failure
Utilizes Network Calls Interprocess communication
Data inconsistency Data consistent
Scales well Hardware limit
  • 负载平衡:水平扩展需要负载平衡来在多台机器之间分配或传播流量。在立式机器中,只有一台机器来处理负载,因此不需要负载平衡器。
  • 故障恢复能力:水平扩展更能抵抗系统故障。如果其中一台机器出现故障,您可以将请求重定向到另一台机器,应用程序不会面临停机。这不是在垂直扩展的情况下,它只有一台机器,所以它会有一个单点故障。这只是意味着在水平扩展中您可以实现可用性,但在垂直扩展中,DB 仍然在单个机器上运行,因此它不会提高可用性。
  • 机器通信:水平扩展需要机器之间的网络通信或调用。网络调用很慢,而且更容易出现故障。这不是垂直缩放的情况,垂直缩放适用于非常快的进程间通信。
  • 数据一致性:数据在横向扩展时不一致,因为不同的机器处理不同的请求,这可能导致它们的数据变得不同步,必须解决。另一方面,垂直机器只有一台机器,所有的请求都会被重定向,所以垂直扩展不存在数据不一致的问题。
  • 限制:根据预算、空间或要求,您可以在水平扩展中添加任意数量的服务器,并根据需要扩展应用程序。这不是垂直缩放的情况。垂直扩展可实现的容量是有限的。扩展超出该容量会导致停机并有上限。因此,单台机器只能改进,直到达到当前的计算极限。

哪个适合应用程序?

在对这两个选项进行了公平的理解之后,我们可以看到它们都有一些优点和缺点。总会有一些权衡,因此开发人员决定哪个更适合应用程序可能会有点棘手。您需要在这里做出明智的决定。首先,您应该确定您的要求、业务目标以及我们希望增加价值的领域。然后通过质疑自己、开发原型和改进设计来做出重要的设计决策。为了更好地了解您的业务目标或要求,必须考虑某些因素。他们之中有一些是…

  • 应用程序的性能要求或性能特征。
  • 系统吞吐量
  • 系统响应时间
  • 系统可用性要求
  • 系统是否容错?如果有,它的程度如何?
  • 设计可靠吗?
  • 我们关心什么水平的一致性?
  • 应用程序的可扩展性目标是什么(您可能有一些短期或直接的目标,但从长远来看会发生什么?)

以上所有因素都将帮助您确定应用程序的业务目标和要求。无论您选择什么选项,理想情况下它都应该能够回答上述问题和许多其他类似问题。您应该清楚地了解这两种缩放方法之间的差异。确定什么适合您的要求,并查看应用程序是否真正适合您选择的模型。如果您的目标是实现卓越的性能,您可以在云环境中使用垂直扩展或水平扩展,或者两者都使用。

如果您想知道大型科技公司在扩展系统时使用什么,那么答案是两者兼而有之。大多数时候,在大型组织中,工程师采用垂直扩展的一些优良品质和水平扩展的一些优良品质。它们遵循将垂直扩展的速度和一致性与水平扩展的弹性和无限可扩展性相结合的混合方法。

简单地投入新硬件并添加更多节点或机器不是开始的方式。在做出决定之前,您应该仔细观察您的申请要求。如果可以通过增加单台机器的容量或调整特性来满足要求,则采用垂直扩展(特别是对于初创公司),但是一旦用户开始快速增长并且您需要经常更换系统,则采用水平扩展缩放或两者的组合。