背景
在美团的价值观中,“以客户为中心”被放在一个非常重要的位置,所以我们对服务出现故障越来越不能容忍。特别是目前公司业务正在高速增长阶段,每一次故障对公司来说都是一笔非常不小的损失。而整个IT基础设施非常复杂,包括网络、服务器、操作系统以及应用层面都可能出现问题。在这种背景下,我们必须对服务进行一次全方位的“体检”,从而来保障美团多个业务服务的稳定性,提供优质的用户服务体验。真正通过以下技术手段,来帮助大家吃的更好,生活更好:
验证峰值流量下服务的稳定性和伸缩性。
验证新上线功能的稳定性。
进行降级、报警等故障演练。
对线上服务进行更准确的容量评估。
……
全链路压测是基于线上真实环境和实际业务场景,通过模拟海量的用户请求,来对整个系统进行压力测试。早期,我们在没有全链路压测的情况下,主要的压测方式有:
对线上的单机或集群发起服务调用。
将线上流量进行录制,然后在单台机器上进行回放。
通过修改权重的方式进行引流压测。
但以上方式很难全面的对整个服务集群进行压测,如果以局部结果推算整个集群的健康状况,往往会“以偏概全”,无法评估整个系统的真实性能水平,主要的原因包括:
只关注涉及的核心服务,无法覆盖到所有的环节。
系统之间都是通过一些基础服务进行串联,如 Nginx、Redis 缓存、数据库、磁盘、网络等等,而基础服务问题在单服务压测中往往不能被暴露出来。
综合多种因素考虑,全链路压测是我们准确评估整个系统性能水平的必经之路。目前,公司内所有核心业务线都已接入全链路压测,月平均压测次数达上万次,帮助业务平稳地度过了大大小小若干场高峰流量的冲击。
解决方案
Quake (雷神之锤)作为公司级的全链路压测平台,它的目标是提供对整条链路进行全方位、安全、真实的压测,来帮助业务做出更精准的容量评估。因此我们对 Quake 提出了如下的要求:
提供模拟线上真实流量的能力* 压测和 DDoS 攻击不同的是,压测有应用场景,而 DDoS 可能只需要一个请求。为了更真实的还原用户行为,我们需要获取线上的真实流量进行压测。
具备快速创建压测环境的能力* 这里的环境指的是线上环境,因为如果压测的是线下环境,即使不考虑“机器配置是否相同”这个因素,像集群规模、数据库体量、网络条件等这些因素,在线下环境下都无法进行模拟,这样得出压测结果,其参考价值并不大。
支持多种压测类型* 压测类型除了支持标准的 HTTP 协议,还需要对美团内部的 RPC 和移动端协议进行支持。
提供压测过程的实时监控与过载保护* 全链路压测是一个需要实时关注服务状态的过程,尤其在探测极限的时候,需要具备精准调控 QPS 的能力,秒级监控的能力,预设熔断降级的能力,以及快速定位问题的能力。
Quake 整体架构设计
Quake 集数据构造、压测隔离、场景管理、动态调控、过程监控、压测报告为一体,压测流量尽量模拟真实,具备分布式压测能力的全链路压测系统,通过模拟海量用户真实的业务操作场景,提前对业务进行高压力测试,全方位探测业务应用的性能瓶颈,确保平稳地应对业务峰值。
架构图
Quake 整体架构上分为:
Quake-Web:压测管理端,负责压测数据构造、压测环境准备、场景管理、压测过程的动态调整以及压测报表展示等。
Quake-Brain:调度中心,负责施压资源的调度、任务分发与机器资源管理。
Quake-Agent:压测引擎,负责模拟各种压测流量。
Quake-Monitor:监控模块,统计压测结果,监控服务各项指标。
管理端核心功能
数据构造
传统的数据构造,一般由测试人员自己维护一批压测数据。但这种方式存在很大的弊端,一方面维护成本相对较高,另一方面,其构造出的数据多样性也不足够。在真实业务场景中,我们需要的是能直接回放业务高峰期产生的流量,只有面对这样的流量冲击,才能真实的反映系统可能会产生的问题。
Quake 主要提供了 HTTP 和 RPC 的两种数据构造方式:
HTTP 服务的访问日志收集
对于 HTTP 服务,在 Nginx 层都会产生请求的访问日志,我们对这些日志进行了统一接入,变成符合压测需要的流量数据。架构图如下:
S3为最终日志存储平台
底层使用了 Hive 作为数仓的工具,使业务在平台上可以通过简单的类 SQL 语言进行数据构造。Quake 会从数仓中筛选出相应的数据,作为压测所需的词表文件,将其存储在 S3 中。
词表:压测所需的元数据,每一行代表一个请求,包含请求的 method、path、params、header、body等等。
RPC 线上流量实时录制
对于 RPC 服务,服务调用量远超 HTTP 的量级,所以在线上环境不太可能去记录相应的日志。这里我们使用对线上服务进行实时流量录制,结合 RPC 框架提供的录制功能,对集群中的某几台机器开启录制,根据要录制的接口和方法名,将请求数据上报到录制流量的缓冲服务(Broker)中,再由 Broker 生成最终的压测词表&#x