在系统设计时,我们需要预估系统的容量,但是,随着系统流量的增大,我们会通过扩容来应对流量,常见的扩容方式是垂直扩展和水平扩展,因此,这本文章,我们将深入探讨这两种扩展策略的优缺点以及该如何选择?
一、垂直扩展
1.定义
垂直扩展(Vertical Scaling),也称为纵向扩展或向上扩展(Scale Up),是指通过增加单个服务器的资源来提高系统性能和处理能力。具体来说,垂直扩展涉及到增加服务器的 CPU、内存、存储等硬件资源,使其能够处理更多的负载和更高的工作量。
如下图,展示了 CPU、内存、存储的扩展:
- 升级 CPU:将服务器的处理器更换为功能更强大的处理器。
- 增加 RAM:添加更多内存以处理更大的数据集并减少对较慢存储的依赖。
- 增强存储:切换到更快的存储(如 SSD)或增加整体存储容量。
比如:CPU: 4核 内存: 16GB 存储: 500GB 升级成 CPU: 16核 内存: 64GB 存储: 2TB
2.优点
垂直扩展的优点主要包含以下几点:
- 简单:垂直扩展的实现相对简单,因为它不需要更改应用程序体系结构。
- 更低的延迟:由于所有资源都位于一台机器上,因此垂直扩展可以消除对服务器间通信的需求,从而降低延迟。
- 降低软件成本:在初始阶段,垂直扩展可能比水平扩展更具成本效益,尤其是在处理需求适度增长时。
- 无需重大代码更改:通常几乎不需要对应用程序的代码库进行调整。
3.缺点
垂直扩展的缺点主要包含以下几点:
- 硬件限制:单台服务器的硬件资源有上限,最终会达到物理扩展的极限。
- 单点故障:由于所有资源都在一台服务器上,任何硬件故障都可能使整个系统瘫痪。
- 停机时间:升级硬件通常需要使服务器脱机,这可能是一个明显的缺点。
- 成本增加:随着规模的扩展,具有强大 CPU和大量 RAM的高端服务器可能会变得非常昂贵。
二、水平扩展
1.定义
水平扩展(Horizontal Scaling),也称为横向扩展或向外扩展(Scale Out),是指通过增加更多的服务器或节点来提高系统性能和处理能力,而不是通过增加单个服务器的硬件资源来提升性能。水平扩展通常用于分布式系统和云计算环境中,通过增加服务器数量来分散负载,从而提高系统的整体处理能力和可靠性。
如下图,展示了水平扩展:
2.优点
水平扩展的优点主要包含以下几点:
- 近乎无限的可扩展性:只要您的架构支持,您就可以继续添加节点,从而能够处理更大的负载。
- 改进的容错能力:一个节点的故障不会导致整个系统瘫痪,从而最大限度地减少停机时间。
- 成本效益:水平扩展可能更具成本效益,因为它使用商用硬件而不是昂贵的高端服务器。
3.缺点
水平扩展的缺点主要包含以下几点:
- 复杂性:将应用程序分布在多个服务器上会带来数据一致性、负载平衡和服务器间通信方面的复杂性。
- 延迟增加:与单台计算机相比,服务器之间的通信可能会引入额外的延迟。
- 成本:由于基础设施的复杂性,初始设置和维护成本可能会更高。
- 应用程序兼容性:应用程序的代码可能需要调整才能在分布式环境中有效工作。
三、如何选择?
1.考虑因素
在垂直扩展和水平扩展之间做出选择时,我们通常需要考虑以下事项:
- 成本:分析初始硬件成本与长期运营费用。
- 工作负载:分析应用程序是受 CPU限制、内存受限,还是其他因素限制?
- 复杂性:在进行扩展时,需要考虑扩展的复杂度,是否牵涉到应用程序代码的改动等?
- 未来增长:扩展预计会达到多大的规模?
2.何时选择垂直扩展
一般来说,垂直扩展非常适合以下方案:
- 有限的可扩展性:增长预测有限的中小型应用程序,您的需求可以通过硬件升级轻松满足。
- 遗留应用程序:当组件之间存在紧密耦合时,很难在多个服务器之间分发。
- 低延迟:当低延迟是一项关键要求,并且服务器间通信开销是不可接受的。
- 成本敏感型项目:当预算不允许复杂的基础设施,并且横向扩展的成本超过收益时,例如在昂贵的软件许可证的情况下。
3.何时选择水平扩展
一般来说,水平扩展非常适合以下情况:
- 快速增长:当经历快速增长并需要处理不断增长的流量的能力时。
- 高可用性需求:当应用程序需要高可用性和节点故障复原能力时。
- 易于分发:当应用程序可以轻松地分布在多个服务器上而无需进行重大修改时。
- 微服务体系结构:当应用程序围绕微服务进行设计时,微服务自然适合水平扩展。
- 成本效益:当成本效益是优先事项时,首选使用商品硬件。
四、总结
本文分析了垂直扩展和水平扩展以及他们的优缺点和使用场景,垂直扩展更加关注的是机器硬件配置的提升,而水平扩展关注更多的是机器数量,在系统设计中,这是最常见的 2种扩展方式。
垂直扩展和水平扩展,如何选择?在很大程度上取决于应用程序的特定需求、预期的增长规模、预算以及正常运行时间对业务的重要性,不过,在实际情况下,通常都会使用两者的组合来优化系统性能和成本效益。
通过本文,我们需要掌握在系统流量增加时,如何通过扩展来应对流量,同时也需要掌握在系统流量不高时,如何动态缩减以减少成本。