互联网巨头为什么会“宕机” ——超大规模分布式系统总体失效原因探析
说明:本文是作者以往跟踪部分大型互联网服务提供商(Google、Amazon、Facebook、MS等)出现的俗称大规模宕机(本文所称总体失效)案例进行的原因分析,结合分布式系统设计方面的一些经验所做的粗浅总结。因google最新一次宕机而参与微博话题的相关讨论,将以前的一些思路和最新的学习整理出来,算是这个领域的一个普及贴吧,供批判之用。
一、大型分布式系统为什么会失效
首先,明确一下我所谓“总体失效”的含义,也就是俗称的“XXX宕机事件”。如同此次(2013年8月16日)google出现的情况——据新闻报道:“美国西部时间下午3点50分到3点55分,约5分钟时间内,Google大部分服务无法访问,从出现宕机到完全恢复总时间为11分钟”。无论从故障现象(无法访问)、时间跨度(5-11分钟)以及影响范围(某些媒体称大约50%-70%的访问返回异常,其他媒体描述为无法访问,没有提及范围)几个角度看,都不属于系统设计目标应该出现的失效水平,因此可称总体失效,也就是常说的服务不可用。
问题随之而来:所谓云计算也好、大规模分布式系统也罢,最起码的一个特性就是不能因为局部故障(应用崩溃、硬件故障、网络中断)而导致整个系统中断服务——高可靠/可用性是此类系统的天然标签。更何况在当今这个集群技术如此平民化,防止单点故障(SPOF)的概念深入人心的时代,就算是规模远不及google这个数量级的系统,一般情况也不会轻易出现系统整体中断运行。因此,要分析这种现象的根本原因,必须先排除一些其他情况:
少量节点出现故障,故障节点简单失效——这个刚刚说完,最基本的高可用性设计也能控制住这种情况,不足为虑。但要注意“简单”二字,这是引出后续话题的关键。
大量节点在瞬间同时出现故障——既然少量节点故障不足以产生严重后果,那么大量节点同时故障呢?且不说这种概率比各种超级彩票中头奖大还是小,就算是一个数据中心突然停电这种故障,对于google这类全球分布的系统,也是充分可以应对的:后果只是区域性服务中断,虽说影响范围已经够大了,但和本文开头描述的情况还有很大区别。如果你再追问:如果真的是很巧合,全球范围内所有数据中心同时故障呢?那咱们还是谈谈买彩票的事情吧,更何况迄今为止的案例不支持这种猜测。
流量过大等外部因素。这一点对于小型网站而言可能成为突发问题,即使如此,一般的可靠性设计也能保证过多请求被拒绝,而大部分服务仍可访问,只是时断时续或者速度变慢。更何况对于google这类互联网巨头,流量基本上不成为问题,至少迄今为止的事故没有因此引起的,即使是小规模故障+流量突增,估计也不是问题。(当然要注意一点,不是说外部因素都不会引发问题,后面会有一个实际案例说明外部因素如何导致无法访问的问题。)