全链路压测概念
基于实际的生产业务场景、系统环境,模拟海量的用户请求和数据对整个业务链进行压力测试,并持续调优的过程。
应用场景
针对业务场景越发复杂化、海量数据冲击下整个业务系统链的可用性、服务能力的瓶颈,让技术更好的服务业务,创造更多的价值。
传统压测和全链路压测的区别
传统压测只会涉及到核心服务,无法覆盖到所有的环节,传统压测通常会忽略一些基础服务如Nginx、Redis 缓存、数据库、磁盘和网络等,所以这些基础服务问题在单服务压测中往往不能被暴露出来。
全链路压测流程
核心流程
全链路压测实施的核心流程如下:
步骤一:确定压测目标
压测目标主要包括压测范围、策略、目的,往往与业务、技术目标息息相关。例如:
步骤二:梳理系统架构
梳理清楚端到端的请求链路、技术架构、分层结构、模块划分,以及RPC、消息、缓存、数据库等中间件的使用情况,分析潜在的瓶颈点,并针对性的增加监控指标、制定应急预案。
本文示例的系统架构图如下:
步骤三:梳理业务模型
压测的业务模型对压测结果的准确性至关重要。全链路压测的链路代表要压测的业务范围,同一条链路需要构造海量的参数集合代表不同用户的不同行为,系统的基础数据、系统预热情况等代表系统的状态。链路范围、链路的访问量级、链路的参数集合、基础数据、预热情况一起构成了压测的业务模型。
通常从以下维度梳理业务模型:
用户行为维度
系统状态维度
总之,业务模型与业务强相关,压测的业务模型对压测结果的准确性至关重要。
步骤四:准备压测脚本
根据业务场景编写压测脚本,也可以直接复用已有脚本,建议将脚本录入PTS场景,便于做场景调试。
步骤五:改造升级环境
在生产环境进行全链路压测,最核心的是线上写操作不能污染正常的业务数据。因此,需要针对存储做影子库表,即正常业务库表的镜像,让压测流量的数据流转到影子库表,正常业务流量流转到正常业务库表,在逻辑上隔离两种流量,使之互不影响。
生产环境压测的三大前提:
压测标记不丢失
压测流量在任何环节能够被正确的识别出来。在流量入口层带上压测标,中间件识别并继续往下传递压测标,保证整条链路上压测标不丢失,通过这种方式使得下游的应用和存储也能接收到压测标。
压测流程不中断
压测流量能够正常的调用下去,整个流程不被阻断,返回符合预期的业务结果。业务的应用层,要支持全链路也需要进行对应的改造。应用层在识别到压测标时,需要绕过参数校验、安全校验等校验逻辑,例如手机号格式校验、用户状态校验、以及一些其它特殊业务校验逻辑。
压测数据不污染
压测数据不对线上正常的业务造成数据污染。全链路场景往往包含多个读写场景,为了隔离压测数据,存储中间件识别到压测标之后,将数据写入影子库表,与真实的数据区分开。为了更加真实的模拟真实场景,影子库表中的基础数据(例如买家、卖家、商品、店铺等)是由真实数据加上固定偏移量构造而成,迁移过程中会进行采样、过滤、脱敏等操作保证数据安全,一般在数据量级上和真实数据保持一致。
PTS探针已经具备以上三大能力,仅需在应用上部署好探针、配置好规则即可,无需改动业务代码。
本文示例的架构图升级方案如下:
步骤六:正常流量联调
通常通过执行功能回归用例完成联调,是需要将正常回归流量打上流量标(例如在请求中添加Header x-pts-test=2),这样在查找调用链路时可以精准定位。该环节主要关注点如下:
步骤七:准备压测数据
1.确认影子库表范围。
影子库表的范围就是压测链路涉及到的应用使用到的库表。在梳理过程中,需要包括库名、表名、数据量级、核心业务字段(例如商品ID、用户ID等),表与表之间字段的关联性(外键、JSON字段中的引用等均包括在内)。
2.确认偏移字段、脱敏字段。
偏移字段:字段偏移可以极大的保证业务数据的安全。偏移字段一般选择用户ID、商品ID等关联字段,如果有用到Sequence类的分布式ID组件,也需要进行偏移。根据业务的实际增长选择不同的偏移量,一般会选择10年以上都不会用到的值作为偏移量。
具体的偏移量需要根据业务增长和数据类型确定,常见的偏移方式如下:
3.新建影子库表
4.执行数据迁移
5.准备接口参数数据。
基于基础数据和压测模型构造业务接口的参数集合。根据各压测平台的不同,支持的格式、配置方式也各有不同,一般都支持CSV文件格式,根据各平台要求构造即可。
压测业务模型对压测结果的准确性至关重要,而压测数据准备是业务模型落地的核心环节。压测数据主要包括基础数据和链路数据两种。
基础数据的准备方式通常有直接构造和数据迁移两种:
数据准备环节,最核心的原则是需要保证镜像、影子库表的软硬件配置与正常库表一致,同时配置简单易行。这样可以保证在压测的时候充分暴露线上的数据库表的真实问题。
选择数据隔离策略有以下方式:
其他存储组件的隔离原理基本上与上述三种思路上一致,您可以根据自身业务和架构特性,自行选择最佳的隔离方式。
步骤八:联调压测流量
1.根据步骤七:准备压测数据中梳理的库表情况,在控制台填写影子规则,不同规则需要填写的字段不尽相同。
2.根据步骤六:正常流量联调中梳理的第三方服务依赖情况在控制台配置Mock规则。如果需要使用复杂的动态响应结果,需要申请部署MockServer。
与正常流量联调的方式基本一致,联调过程中需要将压测流量打上流量标(例如在请求中添加Header x-pts-test=1),在查找调用链时可以精准定位。该环节主要关注点如下:
步骤九:单链路小流量试压
开始全链路压测。不同的业务、压测目标往往对应不同的压测节奏和方法,不可一概而论。除了注意以下要点之外,还需根据业务、架构、人员等自身情况,制定不同的压测计划,在尽量避免线上故障的前提下,发现更多的线上问题。
步骤十:单链路压测
验证所有接口在无干扰、无竞争的情况下的性能基线数据,确定所有接口的性能SLA。
步骤十一:全链路小流量试压
对生产环境进行小流量试压,暴露最表层的问题,保证流程的正确性。
步骤十二:全链路压测并验收
按生产环境流量配比进行复合场景全链路压测。探测相互干扰、竞争情况下的资源消耗水位和瓶颈。大致上分为以下5个阶段:
参考文章:
聊聊全链路压测
测试学习——全链路压测
全链路压测平台(Quake)在美团中的实践
阿里云-性能测试 PTS-全链路压测-全链路压测简介