全链路在线生产数据库压测利器:Apache ShardingSphere 影子库特性升级
作者介绍
侯阳
SphereEx 中间件研发工程师,Apache ShardingSphere Contributor。
目前专注于 ShadowDB 及全链路压测相关的设计和研发。
什么是全链路压测
随着互联网行业的快速发展,业务也进入了快速扩张阶段,多变的用户需求对整个系统的稳定性冲击可想而知。比如外卖平台大量用户产生的订单集中分布在中午和傍晚两个时间段,再比如电商平台的购物节、秒杀活动等。
每种业务都由一系列不同的业务系统来提供服务,每个业务系统都分布式地部署在不同的机器上。“流量规划” 既能保障系统稳定性、又能节约成本对于技术团队来说是一重大难题,为了精准地获取到单台机器的服务能力,压力测试要在生产环境进行。既能保证环境的真实性,也能保证流量的真实性,大大提高“流量规划”的准确性。
影子库与全链路压测
但在线上业务系统做压测,风险不言而喻,比如数据污染问题或是性能问题。试想一下,如果压测结束后用户发现自己订单丢失了或是凭空多出一批待支付的订单,是否极大影响用户体验?
全链路在线压测是一项复杂而庞大的工作,需要各个微服务、中间件之间配合完成。Apache ShardingSphere 关注于全链路在线压测场景下数据库层面的解决方案,推出压测影子库功能。借助于 ShardingSphere 强大的 SQL 解析能力,对执行 SQL 进行影子判定,同时结合影子算法灵活的配置,满足复杂业务场景的在线压测需求;压测流量路由到影子库,线上正常流量路由到生产库,从而帮助用户对压测数据进行隔离,解决数据污染问题。
影子库功能升级
影子库功能最早实现于 v4.1.0 时期,通过添加一个逻辑的影子列,Apache ShardingSphere 通过解析执行 SQL,对其进行路由并改写,删除逻辑的影子列与列值。用户无需关注具体过程,使用时仅对 SQL 进行相应改造,添加影子字段与相应的配置即可。
添加影子列的方式有两个痛点:
-
用户在进行压力测试前需要根据实际的业务需求,对压测相关 SQL 进行相应改造。
-
SQL 改写操作会增加执行损毁,降低压测结果的准确性。
经过 ShardingSphere 社区的讨论,决定对影子库功能进行重构。
Apache ShardingSphere 4.1.1 GA 版影子库 API,总体上功能较为简单,根据逻辑列对应的值判断是否开启影子库。
rules: - !SHADOW column: # 影子字段名称名称 shadowMappings: ds: shadow_ds # 生产数据源名称列表:影子数据库名称列表
5.0.0 GA 重构以后的影子库 API 更加强大。 用户可以通过 enable
属性控制是否开启影子库功能,可配置影子表可以按照表的维度控制需要进行压测的范围,并支持多种不同的影子算法,例如:列值匹配算法、列正则表达式匹配算法以及 SQL 注释匹配算法。
rules: - !SHADOW enable: true # 影子库开关。 可选值:true/false,默认为false dataSources: shadowDataSource: sourceDataSourceName: ds # 生产数据源名称 shadowDataSourceName: shadow_ds # 影子数据源名称 tables: <shadow-table-name>: dataSourceNames: shadowDataSource # 影子表关联影子数据源名称列表(多个值用","隔开) shadowAlgorithmNames: - <shadow-algorithm-name> # 影子表关联影子算法名称列表 shadowAlgorithms: <shadow-algorithm-name>: type: # 影子算法类型 props: xxx: xxx # 影子算法属性配置
影子库实战
在线全链路压测架构图:
准备压测环境
假设一个电商网站要对下单业务进行在线压测。(演示使用单机部署方式)
假设压测相关表 t_order
订单表,测试用户的 ID 为 0。测试用户下单产生的数据执行到 ds_shadow
影子库,生产数据执行到 ds 生产数据库。
测试环境准备:
-
下载 ShardingSphere-Proxy 5.0.0 GA Download Page,安装配置详情参考ShardingSphere-Proxy-Quick-Start
-
配置 ShardingSphere-Proxy 以上文假设压测场景为例:
server.yaml
rules: - !AUTHORITY users: - root@%:root - sharding@:sharding provider: type: NATIVE - !TRANSACTION defaultType: XA providerType: Atomikos props: max-connections-size-per-query: 1 executor-size: 16 # Infinite by default. proxy-frontend-flush-threshold: 128 # The default value is 128. proxy-opentracing-enabled: false proxy-hint-enabled: false sql-show: true check-table-metadata-enabled: false lock-wait-timeout-milliseconds: 50000 # The maximum time to wait for a lock show-process-list-enabled: false # Proxy backend query fetch size. A larger value may increase the memory usage of ShardingSphere Proxy. # The default value is -1, which means set the minimum value for different JDBC drivers. proxy-backend-query-fetch-size: -1 check-duplicate-table-enabled: false sql-comment-parse-enabled: true proxy-frontend-executor-size: 0 # Proxy frontend executor size. The default value is 0, which means let Netty decide. # Available options of proxy backend executor suitable: OLAP(default), OLTP. The OLTP option may reduce time cost of writing packets to client, but it may increase the latency of SQL execution # if client connections are more than proxy-frontend-netty-executor-size, especially executing slow SQL. proxy-backend-executor-suitable: OLAP
config-shadow.yaml
schemaName: shadow_poc_database dataSources: ds: url: jdbc:mysql://127.0.0.1:3306/ds?serverTimezone=UTC&useSSL=false username: root password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 minPoolSize: 1 ds_shadow: url: jdbc:mysql://127.0.0.1:3306/ds_shadow?serverTimezone=UTC&useSSL=false username: root password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 minPoolSize: 1 rules: - !SHADOW enable: true dataSources: shadowDataSource: sourceDataSourceName: ds shadowDataSourceName: ds_shadow tables: t_order: dataSourceNames: - shadowDataSource shadowAlgorithmNames: - user-id-insert-match-algorithm - simple-note-algorithm shadowAlgorithms: user-id-insert-match-algorithm: type: COLUMN_REGEX_MATCH props: operation: insert column: user_id regex: "[0]" simple-note-algorithm: type: SIMPLE_NOTE props: foo: bar
- 订单服务
这里不讨论订单相关业务,以最简单的收请求直接插入订单表为例。订单表结构如下:
- 订单表结构
CREATE TABLE `t_order` ( `id` INT(11) AUTO_INCREMENT COMMENT '订单ID', `user_id` VARCHAR(32) NOT NULL COMMENT '下单用户ID', `sku` VARCHAR(32) NOT NULL COMMENT '订单商品sku', PRIMARY KEY (`id`) )ENGINE = InnoDB COMMENT = '订单表';
模拟压测过程
- 使用
postman
模拟测试用户创建订单请求如下图:
- ShardingSphere-Proxy 中执行日志可以看到 执行 SQL 被路由到影子库执行
验证压测结果
- 影子库
ds_shadow
执行查询语句
SELECT * FROM t_order;
查询结果:
- 生产库 ds 执行查询语句
SELECT * FROM t_order;
查询结果:
测试用户创建订单产生的数据会路由到影子库中。更多复杂配置请参考 ShardingSphere 官方文档影子库压测。
全链路在线压测完整解决方案-CyborgFlow
前文中也提到全链路在线压测是一项复杂而庞大的工作,需要各个微服务、中间件之间配合与调整,以应对不同流量以及压测标识的透传,而且要做到测试服务无状态并且开箱即用。
由 Apache ShardingSphere 联合 Apache APISIX、Apache SkyWalking 共同维护的项目 CyborgFlow 提供开箱即用 (OOTB) 解决方案来在您的在线系统上执行负载测试。
Apache APISIX 负责在网关层对测试数据进行标记,并由 Apache SkyWalking 负责在整个调用链路上进行传递,最后交由 Apache ShardingSphere-Proxy 做数据隔离,压测数据路由到影子库中。
项目已发布 0.1.0 版本,欢迎下载使用: https://github.com/SphereEx/CyborgFlow/releases
欢迎添加社区经理微信(ss_assistant_1)加入微信交流群,与更多 ShardingSphere 爱好者一同交流讨论。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
前端er必须掌握的数据可视化技术
又是一月结束,打工人准时准点的汇报工作如期和大家见面啦。提到汇报,必不可少的一部分就是数据的汇总、分析。 作为一名合格的社会人,我们每天都在工作、生活、学习中和数字打交道。小到量化的工作内容,大到具体的工作指标,车间生产、批发零售各行各业都充斥着大量数据。在互联网诞生之后,网络把我们紧紧相连,也让数据更为密集地汇聚。 扯远了……当前,正在写月报的葡萄面对的是,后端发来铺天盖地的两万条数据。 这个数据能用吗? 能用,但不是完全能用。 毕竟做报告的时候,我们不能把两万条数据直接甩到领导的脸上,让他自己想办法看看。 这时万一领导说,看看哪个省销量最多,我们岂不是就当场就抓瞎了。 但是如果变成这样一张图: 就可以清晰明了地看出各个省份之间的销量差距了。 拿着这张图,我们就可以秒回领导:浙江省、天津市、江西省位居销量前三。 而领导也可以满意地拿着这张图向他的领导汇报。 这样一个数据处理的过程,就叫做“数据可视化”,使我们能够对数据进行加工和处理。 而对于一个优秀的前端而言,我们更加关注如何实现数据可视化。这里面涉及的知识领域其实很多,包括数据源整合、数据抽取、数据清洗、数据建模、数据可视化展示等...
- 下一篇
开发淘宝双11喵糖的 Eva.js v1.2 版本正式发布
Eva.js v1.2 版本正式发布,本版本是双11喵糖的使用版本。 欢迎使用 Eva.js v1.2 GitHub! 本次版本主要支持了压缩纹理的渲染,首要解决GPU内存压力。支持实时修改游戏播放速度,增加更多表现力。新增 Spine4.0 的支持,并且抽离了spine的公共文件,降低多个 Spine 版本功能同步的成本。提供扩展type的能力,插件开发可增加对引擎核心能力的扩展。为交互事件提供相对于当前对象的点击位置。优化帧动画能力,可停止在最后一帧。 主要修复了一些常见问题,Spine 在特定参数下无法播放问题,资源加载进度问题以及A11y的DOM层级问题。 在生态方面,支持淘宝/支付宝小程序中运行,IIFE支持微信小游戏中使用Eva.js。 Eva.js v1.2 已在以下项目中使用:淘宝双11 / 芭芭农场 / 淘宝斗地主 / 薅羊毛赚话费,目前版本已经升级到1.2.2,我们一般在自己的业务中验证大版本稳定性,在进行正式发布。 感谢各个兄弟团队和业界伙伴的信赖,正是大家的信赖,Eva.js 才能做到更加丰富的表现力、更加优质的性能、更加流畅的开发体验。 重点特性介绍 压缩纹理...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程