本章节介绍可扩展性,强调垂直和横向扩展之间的主要差异。

可扩展性是指如何给一个应用分配资源,并且有效地管理这些资源从而减少资源竞争。当系统资源不能满足应用所需,将会严重影响到用户体验(UX)。实现扩展的两个主要方法是:横向和纵向扩展。纵向扩展比较简单,同时也有更多的限制。横向扩展相对复杂,但是比起纵向它能提供更好的实现,更加符合云实现。

本章节我们假设需要扩展一个分布式的web应用,这种情况也是现实中最常发生的。

可扩展性定义

一个应用的 可扩展性衡量此应用同时可以支撑的用户数,当应用不能有效的处理新请求时候就是扩展性的极限。当一个关键的硬件资源耗尽时候,扩展性到达极限,虽然可以通过添加新的硬件来扩展。新加的硬件需要包括CPU,内存,硬盘还有网络等。一个应用运行在多个节点上,都需要硬件资源,比如逻辑运行在内存节点,数据存储在硬盘中,当然还有其它的节点,内存和硬盘是主要的。一个节点可能是物理服务器(通常是虚拟机)的一部分,一整台服务器,更或则是服务器群中的一台。当我们不去关系底层资源时候我们通常他们为节点,通常我们也不去关系底层资源。

应用可以通过新增硬件资源来实现扩展,只要应用能很好的利用这些资源。因此,通过新增资源的方法我们引出了两种扩展方法的定义。

  • 纵向扩展是通过向现有节点中增加资源,以提高整个应用程序的能力。
  • 横向扩展是通过增加节点来提高整个应用程序的能力

这两种扩展的方法既不是互相排斥的,也不全有或全无的。任何应用程序都能够垂直向上扩展,水平向外扩展,要么两种方式都采用,要么都不采用。举个例子,应用的部分采用水平向外扩展,而可能另一部分采用垂直向上扩展。

横向纵向扩展方法适用于任何资源,包括逻辑计算和数据存储。一当任何一种方法实现了扩展,扩展不需要修改任何应用逻辑。然而,从纵向到横向扩展通常需要做比较多的修改。

 垂直向上扩展

垂直向上扩展也被简单的称为纵向扩展或向上扩展。其主要思想是通过硬件上的改进以提高单个节点的容量,比如添加内存,添加CPU的核数,或则其它方法。

早之前,这种扩展方法因其广泛的使用行而称为最通用的扩展方法,风险小,简单,并且相对改动程序算法逻辑,单纯的添加硬件成本会小很多。向上扩展适用于独立应用程序(如桌面视频编辑,高端视频游戏和移动应用程序)和基于服务器的应用程序(如Web应用程序,分布式多人游戏,并连接到后端服务的移动应用程序,例如作为地图和导航)。

不能保证我们需要的高性能硬件的存在,或则硬件是否能支撑我们的要求。并且即使我们拥有了这样的硬件,也不能保证我们的应用程序能够很好的去利用发挥这些高性能的硬件。因为硬件的改变是复杂的,同时也面临当机的风险。

水平向外扩展

水平向外扩展也被简单的称为横向扩展或向外扩展,通过增加整个节点提高整体应用能力。每增加一个节点通常会增加同等容量,如相同的内存量和相同的CPU。水平扩展把垂直扩展中面临的问题从最大限度地发挥各个节点的能力重心转移到合并许多节点能力。比起垂直扩展,水平扩展更加复杂,并且对应用程序的架构也有影响。纵向扩展往往是硬件和基础设施为重点,“把问题扔给硬件”,而横向扩展是开发和架构为重点。对于复杂的业务,可以下发到不同部门来实现。

设计成横向扩展的应用,通常给不同节点分配特定的功能,例如,你可能有web服务器和分发服务器。当我们通过添加节点来提高整体性能时候,我们通过添加特定功能的节点,比如web服务器或分发服务器。我们不只是“添加节点”,因为节点配置是特定于所支持的功能。

当所有支持特定功能的节点配置相同,相同的硬件资源,相同的操作系统,相同功能的专用软件,我们说这些节点是均衡。

不是应用的所有节点都是均衡的,这里只是指特定功能的节点。当我们web服务器均衡了,分发服务器均衡了,我们不要求说web服务器和分发服务器的配置要一样。

均衡的横向扩展是一个很重要的简化。如果所有节点都均衡,那么基本的负载均衡会工作得很好,容量规划也比较容易,也比较容易写的自动扩展的规则。如果节点配置不同,有效地分配请求将变得更加复杂,因为需要更多的上下文。

在一个特定功能的节点上(例如web服务),节点自主操作,彼此独立。一个节点不需要和其它同样功能的接口通信,就可以完成它的工作。节点的资源会被有效的控制。

自主性是重要的,这样每个节点可以很好的保持自己的效率而不用关心其它节点在做什么。

水平扩展受新加节点性能限制,最好的方式是新增节点的容量根据需要递增。

描述可扩展性