6.9 影子库压测
6.9.1 背景
在基于微服务的分布式应用架构下,业务需要多个服务是通过一系列的服务、中间件的调用来完成,所
以单个服务的压力测试已无法代表真实场景。在测试环境中,如果重新搭建一整套与生产环境类似的压
测环境,成本过高,并且往往无法模拟线上环境的复杂度以及流量。因此,业内通常选择全链路压测的
方式,即在生产环境进行压测,这样所获得的测试结果能够准确地反应系统真实容量和性能水平。
6.9.2 挑战
全链路压测是一项复杂而庞大的工作。需要各个微服务、中间件之间配合与调整,以应对不同流量以及压
测标识的透传。通常会搭建一整套压测平台以适用不同测试计划。在数据库层面需要做好数据隔离,为
了保证生产数据的可靠性与完整性,需要将压测产生的数据路由到压测环境数据库,防止压测数据对生
产数据库中真实数据造成污染。这就要求业务应用在执行 SQL 前,能够根据透传的压测标识,做好数据
分类,将相应的 SQL 路由到与之对应的数据源。
6.9.3 目标
Apache ShardingSphere 关注于全链路压测场景下,数据库层面的解决方案。将压测数据自动路由至用
户指定的数据库,是 Apache ShardingSphere 影子库模块的主要设计目标。
6.9.4 核心概念
压测开关
压力测试是一个特定时段的需求,在需要时开启即可。
生产库
生产数据使用的数据库。
影子库
压测数据隔离的影子数据库,与生产数据库应当使用相同的配置。
6.9. 影子库压测 5
影子算法
影子算法和业务实现紧密相关,目前提供 2 种类型影子算法。
• 基于列的影子算法
通过识别 SQL 中的数据,匹配路由至影子库的场景。适用于由压测数据名单驱动的压测场景。
• 基于 Hint 的影子算法
通过识别 SQL 中的注释,匹配路由至影子库的场景。适用于由上游系统透传标识驱动的压测场景。
6.9.5 使用规范
支持项
• 基于标记的影子算法支持全部 SQL;
• 基于列的影子算法仅支持部分 SQL。
不支持项
基于标记的影子算法
• 无
基于列的影子算法
• 不支持 DDL;
• 不支持范围、分组和子查询,如:BETWEEN、GROUP BY ⋯HAVING 等。
SQL 支持列表:
• INSERT
• SELECT/UPDATE/DELETE