2018年十一当天,高德DAU突破一个亿,不断增长的日活带来喜悦的同时,也给支撑高德业务的技术人带来了挑战。如何保障系统的稳定性,如何保证系统能持续的为用户提供可靠的服务?是所有高德技术人面临的问题,也是需要大家一起解决的问题。
高德业务规模支撑一亿DAU的高德服务是什么体量?可能每个人的答案都不相同,这里从基础设施的角度给大家做个简单的介绍,我们有数千个线上应用,分别部署在全国各地多个机房中的数万台机器上。
这张图是高德业务核心链路的架构,从图中可以看出高德业务具有相当高的复杂性。当然,真实系统远远要比图表示的复杂,如果用这张图来代表高德整体业务形态,无异于管中窥豹,太过于片面。
对于如此大规模,高复杂度的系统,如何保障系统的稳定性,是高德技术人长期面临和解决的问题。
保障稳定性的手段
如何保障系统稳定性是几乎所有互联网企业都需要面对的问题。通常来讲,有五种手段来从理论上保障系统的稳定性,分别是:
容量规划:根据以往业务的流量,估算出未来(通常是即将来临的大促,节假日)的流量。以整体流量为基础,估算出每个子系统需要满足的容量大小。然后根据子系统的容量来计算出需要的资源数量,对系统进行适当的扩容。计算方式可以简单的表示为如下公式:
机器数量 = 预估容量 / 单机能力 + Buffer (一定数量的冗余)
流量控制:系统需要防止流量超过设计的容量,对超出设计的流量进行限流。各业务也需要对超出子系统服务能力的流量进行限流,对超负荷的服务进行降级。
灾备:一旦系统发生灾难性故障,需要将流量切换到容灾机房,避免对大量用户造成损失。
监控:对服务进行全方面的监控,实时掌控系统的状态,对系统中出现的问题及时预警,做到早发现,早治理。
预案演练:对系统可能面临的问题要进行全面的预演,结合断网,断电等等灾难模拟的手段来检验系统在灾难面前的表现。
有了稳定性保障的五大法宝,我们是否就可以高枕无忧了呢?答案是令人遗憾的,这里有两个残酷的现实例子,告诫我们不要太乐观。
多年前的某年春节前夕,我们对高德核心链路进行了压测,压测设计的流量要高于预估的春节流量,系统在当时表现良好,各项指标都满足要求。可是春节期间,服务因某种原因发出告警,而此刻线上流量的水位并没有超过我们的预期。
还有一次在某年五一期间,该服务再次发出预警,而且和春节的那次预警的原因不一样。
我们的稳定性保障手段是基于对于系统的认知来实现的,而认知往往是真实世界在头脑中的映射,是一种模型,或是真实系统的快照。系统的真实状态往往和我们观测到的不太一致,基于观测到的模型对系统进行的测量也往往会不够准确,对于系统,我们要保持敬畏。对系统进行不厌其烦的模拟,无限的接近真实系统的状态,是永恒不变的追求。
上述稳定性保障的工作,只能在理论上保证系统的抗压能力,但是不能确定在真实流量到来的时候,系统的表现如何!
因此,我们需要演习,需要让真实的流量提前到来!
全链路压测如何让真实的流量提前到来?我们需要借助全链路压测,那么什么是全链路压测呢?
我的理解是:把全链路压测拆分为两个部分来看。一是全链路,一是压测,分别来理解:
全链路:分为两层意思;一是自顶向下,一个请求在系统中经过的完整路径。二是一系列动作的集合,比如从用户登录,到浏览商品,到选择商品,到加入购物车,到支付等等这整个环节。对于高德业务而言,我们关注的是第一种全链路。
压测:通过对海量用户行为模拟的方式,对系统逐步施压,用于检验系统的稳定性。
集团的战友们把全链路压测比作 "终极武器",非常的形象。既然是 "终极武器",那就需要有足够的威慑力,对于高德来说,目标是:提供真实的流量,在真实的环境中来检验系统的稳定性。
这里面包含三个关键点:
真实的流量:流量的量级和特征贴近真实的世界。
真实的环境:直接在线上环境进行。
提前进行:在流量洪峰到来之前。
做到这三点,才能称得上是一次真正意义上的演习,才可以叫做全链路压测。
高德全链路压测面临的挑战高德全链路压测面临众多方面的挑战,除了分布式系统固有的挑战外,高德全链路压测还面临着业务特殊性的挑战。
分布式系统的特性
不确定性