换个角度,聊聊全链路压测
前言
之前自己也写过好几篇关于全链路压测的文章或者博客,最近看了infoQ上的专栏,复盘了下自己以往在全链路压测实施方面的工作,发觉还有很多可以做的更好的地方。就以这篇文章来做个总结,顺带说说我自己实施全链路压测工作方面的一些收获和经验。
观点
很多同学问过我关于全链路压测如何实施落地,如何在生产环境实现的技术问题。这里我想借用上面infoQ专栏大佬的一句话:
下面我会从几个方面来谈谈我个人现在对于全链路压测的一些思考和经验总结。
技术
很多同学说起全链路压测,都喜欢深究它的技术细节,这没错。但全链路压测想要成功的在生产环境实施,更多的是考验组织协调能力的一个项目。至于技术层面,能说的有很多,这次我们先聊聊比较核心的一些技术点。
隔离方案
流量隔离
既然我们的前提是在生产环境进行压测,那么无论是趁着业务流量低峰期,还是生产全链路压测常态化,对于压测流量的隔离区分,是一定要首先解决的。如下图所示:

目前业内比较常见的方案,有如下两种:
资源隔离
数据隔离
压测会产生大量的数据,这些数据如何处理是DBA团队面临的最大挑战。目前来说,业内比较通用的方式都是采用影子库表或者压测数据带特殊标识进入生产业务库表,以tag或者特殊字段做区分。他们的区别如下:
1)影子库+影子表:一般生产库和影子库都是在同一个DB实例上,基础数据会脱敏后同步过去;
2)生产业务表标识:在生产业务表中新增压测标识字段,压测数据需要定时清理(饿了么采用这套方案);
我司采用的方案如下:
DB路由:①.同instance不同schema(风险大);②.不同instance同schema(安全性高,成本高);
Redis路由:①.key值加统一前缀;②.Redis-client做路由;
MQ路由:采用影子topic模式,带压测标识的数据进入影子topic;
ES路由:①.index统一加前缀,提供统一ES client做数据访问,由client做路由;
日志隔离
压测会产生大量日志,为了便于正常的业务问题跟进排查和压测区分,个人建议还是对带压测标的日志进行前缀处理,这样运维同学也可以快速的清理,以免磁盘写满导致生产故障。
改造工作
监控平台
监控系统需要透明化,且压测监控大盘和业务监控大盘需要单独配置。其中有如下的点需要注意:
1)设定告警阈值、告警降噪、专项业务告警;
2)专项告警,需要覆盖核心接口、监控大盘、业务大盘;
3)优点:问题快速定位,避免不透明影响问题的发现和修复速率;
4)容量规划:借助监控平台的赋能,快速梳理清楚系统架构、拓扑关系,才便于做容量规划;
流控平台
流量发起和服务保护功能是全链路压测成功开展的必要前提。服务保护方面,业内常用的组件有Sentinel、
预案平台
常说大促时候,
当然,无论是主动降级方案还是紧急降级方案,都是需要进行业务梳理和细化拆分的,还要和产品运营等团队的同学提前沟通好,避免跨团队沟通的Gap产生。
还有些前置事项,比如业务拆分(订单拆分为正逆向),比如不同业务服务集群隔离,比如DB垂直拆分、读写分离、分库分表等方案,这些都是需要考虑的。
至于异地多活、故障演练、灾备演练,这些更需要成熟的技术体系建设和多方达成一致,才能更好的保障生产服务的稳定性。总的来说,全链路压测除了技术,更多的还需要沟通与协调。
压测实施
到了压测实施阶段,基本就只能硬着头皮硬上了,特别是第一次搞生产全链路压测,至今记忆深刻。生产全链路压测,需要注意以下几点:
服务扩容
需要注意的是,在生产开始压测前,系统需要进行前置扩容,避免资源不足导致整体容量瓶颈。还需要注意的是,在大促峰值流量来临时,尽可能不要去执行扩容操作。
压测方式
至于压测执行方式,业内能玩的基本就是这几种方式。当然,压测前的预热,是必不可少的。压测执行方式方面,主要有如下几项:
1)阶梯递增:这种方式的目的在于不断递增流量,找到系统的性能拐点;
预案评审
在预案评审和演练阶段,
建议:按照我个人的实施经验,建议输出对应的
管理
前面关于全链路压测的观点,已经提到了:
目标
大家应该都了解SMART体系,在考虑实施全链路压测时候,下面几点SMART目标,也是需要重点考虑的。
目标与标准:
流程
总结一下,生产全链路压测这个技术项目,可以用三个维度和五个阶段来概括。
组织
日常工作中,我们一般有版本迭代的常规需求以及一些特殊的独立项目。非业务或者弱业务的事情,可以通过虚拟的组织架构来明确定义不同岗位的职责,避免混乱。
一般来说,生产全链路压测中,虚拟的组织架构一般有如下几种角色:
Sponsor:发起&组织人;
PMO:项目管理、项目经理;
Principal:(主)负责人;
Owner:业务&技术某一领域负责人(领头人);

价值
最开始我司推动实施全链路压测时,我画了下面这张图,用来体现全链路压测的价值:

从我个人角度来说,全链路压测的最大价值在于: