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