可伸缩 Web 架构与分布式系统

开源软件近年来已变为构建一些大型网站的基础组件。并且伴随着网站的成长,围绕着它们架构的最佳实践和指导准则已经显露。这篇文章旨在涉及一些在设计大型网站时需要考虑的关键问题和一些为达到这些目标所使用的组件。本文主要关注于Web系统,然而其中的一些内容同样适用于其他分布式系统。

、Web分布式系统设计准则

构建和运行一个可伸缩的网站或应用来说究竟意味着什么?从一个基本的层面来看,就是将用户和远程资源通过互联网连接起来——将其变得可伸缩的部分,是指这些资源或者访问这些资源是分布式的、贯穿于多个服务器。像很多生活中的事情一样,在构建一个web服务时花费时间提前做好计划将会帮助服务能够长久运行;理解一些大型网站背后的考量和权衡会在创建小型网站时帮助做出更明智的决定。下面是一些会影响到设计大型可伸缩性Web系统的关键准则:

可用性

一个网站的正常运行时间,对于很多公司的信誉和功能来说都是至关重要的。对于一些大型在线零售网站,甚至是几分钟的不可用都会导致数以千万计美元的收入损失,所以将他们的系统设计成不间断可用和能够弹性恢复既是一项基础业务也是一个技术需求。分布式系统的高可用性需要仔细考虑关键组件冗余,快速恢复部分有问题的系统,并且当出现问题时能够做到优雅降级。

性能

性能已成为大多数网站一个很重要的考量指标。一个网站的速度会影响到使用和用户满意度,同样也会影响到搜索引擎排名,将直接关系到网站收入和用户保持力(黏性)。因此,关键之处就在于创建一个为快速响应、低延迟的系统。

可靠性

一个系统需要做到可靠,这样才能使得对于(固定)数据的请求始终会返回同样的数据。如果数据发生变化或者更新,那相同的请求应该返回新的数据。用户需要知道,一旦一些数据被写入、存储到系统中,那么系统就会持久化(这些数据)并且能够让人信赖随时能够检索。

可伸缩性

对于任何大型分布式系统,系统规模只是可伸缩性需要考虑的一个方面。同样重要的是,增加容量能够处理更大量的负载所需的工作,通常在系统可伸缩性方面被提及到。可伸缩性会涉及到系统的很多不同的因素:系统额外还能够处理多少流量,是否能够轻易增加存储容量,还能多处理多少事务。

可管理性

设计一个易于运维的系统是另一个重要考量点。系统的可管理型等同于操作的可伸缩性:维护和变更。可管理性需要考虑的有:当问题发生时能够便于诊断和理解,便于进行变更和修改,并且系统易于操作。(比如系统是否能够进行例行操作而不带来失败或者异常?)

成本

成本是一个重要因素。这明显会包括硬件和软件成本,但同样还要考虑到一些其他方面来部署、运维系统,比如构建系统所需的开发时间,运行系统所需的运维工作量,甚至所需的培训都要被考虑在内。成本是指拥有系统的总成本(原句是Cost is the total cost of ownership.)。

这些准则中的每一条都提供了在设计一个分布式web系统架构时作决定的基本原则。但是,他们也可能互相矛盾,比如达到某一目标是以牺牲另一个为代价的。一个典型的例子:专注于系统容量时,选择通过简单增加更多机器(可伸缩性)的代价是(增加了)可管理性(你需要运维更多的服务器)和成本(更多服务器价格)。当设计任何web应用时,这些关键准则都是需要考量的,即使不得不承认,一个设计可能会牺牲它们中的一个或更多。