规则3——避免系统串联
内容:减少以串联方式连接的组件数量。
场景:每次考虑添加组件的时候。
用法:删除不必要的组件、收起组件或添加多个并行组件以减少影响。
原因:串联组件受多重失败乘法效应的影响。
要点:避免向串联系统添加组件。如果有必要这样做,添加多个版本的组件,如果一个出故障,其他组件可以取代它的位置。
电路中的元件有多种连接方式。两种最简单的连接方式是串联和并联。串联电路的元件(可能是电容、电阻或其他元件)沿电路连接。在这种类型的电路中,电流流过每个元件,电阻和电压是在这个基础上产生的。图9-2显示了两个电路,一个有三个电阻,一个有三节电池,由此产生电阻和电压。请注意,在此图中,如果有任何元件出故障,如电阻烧掉,就会造成整个电路出故障。
图9-3显示了两个并联电路,上面的有三个电阻(和一个电源或电容),下面的有三节电池。在这个电路中,总电阻的倒数等于每个电阻的倒数之和。定义的总电阻必须小于最小电阻。请注意,电压不改变,但电池只贡献了一小部分的电流,这有延长其使用寿命的效果。请注意,在这些电路中,元件的故障不会导致故障整个电路出故障。
系统架构和电路在许多方面有相似之处。像电路一样,系统也由不同组件组成,如Web和应用服务器、负载均衡器、数据库和网络设备,而且也可以并联或串联。让我们以一个有大流量的静态网站为例。你可能把相同的静态内容配置在10个Web服务器上以提供网站服务。要么使用负载均衡器引导流量,要么利用DNS通过为相关域名指定10个独立的IP地址。这些Web服务器像图9-3中的电池一样是并联的。Web服务器所处理的流量是总量的一小部分,如果一个Web服务器失败,该网站仍然可用,因为还有其他9个Web服务器。
作为一个更典型的串联架构例子,让我们添加一些层。如果以一个包括一个网络服务器、一个应用服务器和一个数据库服务器的标准的三层网站为例,我们会有一个串联的架构。要满足请求,Web服务器必须先接受请求,然后将其传递给应用服务器(它查询数据库)。应用服务器接收并处理数据后,将其发送回Web服务器,最终满足客户的请求。如果电路或架构中的任何组件发生故障,整个系统将出故障。
回到现实世界的架构。几乎总是有些组件需要串联。当考虑到负载均衡、Web和应用层、数据库、存储系统等时,为了保持系统运行需要许多组件。当然,添加并联组件,即使层之间串联,有助于降低由组件故障引起系统故障的总风险。如果只有一个Web服务器出故障,多台Web服务器可以分散流量负载并避免系统故障。对于网络与应用层,大多数人很容易接受这个概念。数据库和网络层的这个问题却被大多数人忽视。如果并联的Web和应用服务器都串联到单个数据库,就可能会有一个可以导致灾难性故障的组件。
关于网络组件,我们经常看到架构对并联服务器非常关注,但完全忽略网络设备,尤其是防火墙。流量通过防火墙、负载均衡器、防火墙、交换机,然后到Web服务器、应用服务器、数据库服务器,然后再一路返回。这个过程至少有7个串联的组件。如果已经有6个组件了,那么再增加一个有什么大不了的?
串联组件出故障的风险具有乘法效应。举个简单例子,如果我们有两个串联的服务器,各有99.9%的可用性或正常运行时间,那么该系统的总可用性不能大于99.9%×99.9%=99.8%。如果在串联中增加可用性为99.9%的第三个组件,我们就得到一个更低的总可用性99.9%×99.9%×99.9%=99.7%。放置的串联组件越多,系统的总可用性就越低。表9-4列出了一些简单的计算,来说明可用性降低,那么每月由此产生的停机时间增加。对串联的系统,每增加一个组件(可用性99.9%),每月停机时间就增加大约43分钟。然而,对并联系统,每增加一对组件(可用性99.9%),每月停机时间就减少大约26分钟。假如并联的每个组件有更低的可用性,这种改善效果甚至更加显著。
就像今天的大多数电路一样,系统也远比简单的串联和并联更加复杂,对可用性的精确计算要比简单的例子复杂得多。然而,可以明确的是,串联组件显著增加了系统停机的风险。当然,可以通过减少串联组件或增加并联组件来降低风险。