客户端
游戏
无障碍

1

评论

2

分享

手机看

微信扫一扫,随时随地看

微购相册 × TDSQL-C 分析引擎:更快更实时的数据分析体验

本文将通过微购相册数据库使用案例深入讲解如何通过腾讯云数据库 TDSQL-C 只读分析引擎加速业务分析查询效率,获得更加实时的数据分析体验。
图片

微购相册是一家线上分享类的移动电商平台,用户通过上传产品到相册,一键分享到各大平台,通过关系流进行快速传播,促进产品销售。迄今为止,已服务超过5000万客户,在 Appstore 中曾排名 Top 30。

面对如此大体量的用户规模,其核心业务系统"相册网盘系统”的稳定性与性能体验就显得尤为重要。同时也对后端数据库的能力要求更加严苛。所以在进行数据库选型的时候,客户提出了如下主要需求:

● 百亿级数据存储与高频写入

○ 主业务表容量突破 100 亿行
○ 峰值承载百万级/秒的混合写操作(更新/插入)

● 强实时查询计算要求

○ 复杂聚合响应 ≤2s(百亿级数据集)
○ 在有限资源下,要满足 200 的 OLAP 查询并发。

● 混合负载

○ 同时需要满足高吞吐更新与低延迟的数据分析(<3s)

在如此大的数据量情况下既要保证高 TPS 的数据并发写入更新,还需要满足业务的实时聚合查询的低时延需求。这对传统关系型数据库是一个极大的挑战。使用高规格的资源可以满足业务高 QPS 变更的需求,但在实时的数据聚合分析类查询时就会遇到性能瓶颈。

基于此,微购相册曾考虑是否将聚合分析的查询拆分到数仓中去实现。但经过测试后发现,传统数仓虽然可以满足业务的并发聚合查询性能。但在如此高频的数据变更场景下,传统列式存储的数仓延迟非常高,无法满足业务的最高 3s 数据延迟的需求。

针对以上挑战,我们采用了如下的业务架构设计:

图片

只读分析引擎是云原生数据库 TDSQL-C 的列存从节点,其拥有着优秀的复杂查询性能,可以有效的提升业务的查询效率。并可以实时的将数据从行存转换为列存,在超高并发数据变更场景下也能确保数据的行列一致性。

过只读分析引擎的方案,微购云盘的容量计算业务效率有了十倍提升,单任务由之前的 10min 缩短到 1min 内。

同时只读分析引擎优异的数据变更能力,在面对 100 亿数据基础上 35 W QPS 的部分列更新时,仍能保证数据实时加载为列存,整体数据无延时。

那么只读分析引擎如何满足业务需求?其能力有哪些独到之处?


高效的聚合分析查询性能

在微购业务场景中,绝大部分慢查询都是组合谓词过滤后的聚合分析。典型 SQL 样例如下(为了脱敏,这里使用 TPC-H 数据查询来做代表):

select
sum(l_extendedprice * l_discount)as revenue
from
lineitem
where
l_shipdate >='1994-01-01'
and l_shipdate < date_add('1994-01-01',interval'1'year)
and l_discount between0.06-0.01and0.06+0.01
and l_quantity <24;

这些 SQL 有几个典型的特征:

● 原始表的列数非常多(100+ 列),但是查询的 SQL 只涉及 5 到 20 列左右;
● 原始表的数据规模非常大,单表行数超过 100 亿;
● 谓词的组合方式非常多,并且所有谓词组合过滤后,数据行数仍有 100 万到 1000 万行。

对于这种 SQL ,想要执行效率高,首先需要快速的从存储上读取有效的数据行中的有效列避免对全量数据进行扫描,否则需处理大量冗余数据,I/O 和计算开销都非常大。

其次是过滤完毕之后的数据仍然具备一定的数据规模,要能够快速的对这些数据进行聚合分析。

这两个问题对传统的行存关系数据库主要有几个核心的挑战

● 谓词组合的方式非常多,并且过滤后的数据量仍具一定规模,很难为所有的谓词组合提前建立好覆盖索引;

● 数据按行存储,执行时必须读取全量行数据,无法快速跳过无关列数据;
● 谓词过滤后的数据缺乏并行聚合算子,聚合效率低;
TDSQL-C 的只读分析引擎的几个核心能力,在提升微购业务 SQL 查询性能上扮演了重要的角色。
首先是数据列式存储以及压缩数据扫描时可快速跳过无关列数据,另外按列压缩可以进一步提高压缩效率(微购业务中数据的压缩比例可达 6倍+),减少了从磁盘上需要扫描的数据。
其次是延时物化(Late Materialization ),与之相对应的是Early Materialization(数据库在开始处理查询之前会先将所有相关的列数据读入内存并且进行处理)。通过下面的图:
● Early Materialization
图片
● Late Materialization
图片
可以看到,通过延时物化,TDSQL-C 的只读分析引擎可以大大减少数据的扫描量,大大提升 SQL 查询性能。
最后是算子的并行以及向量执行,以并行的聚合为例,只读分析引擎的实现基本和论文Morsel-Driven Parallelism一致,通过数据分组以及 Pre-AGG 和 Final-AGG 的拆分可以充分的利用上 CPU 的并行处理能力,提升 SQL 的执行效率,基本原理如下所示:
图片

当然需要强调的是,TDSQL-C 的只读分析引擎在微购业务中能够保障“所有的聚合分析在 200 QPS 左右还能有 3 秒以下响应”,这得益于多种技术能力的综合运用。

这些能力包括异步化处理,它能够有效地提高系统的并发性能;灵活调度机制,确保资源的高效分配和使用;以及向量化执行中SIMD技术,通过并行处理来加速数据计算。


超高并发下的更新一致性

在微购的业务中,除了满足查询性能,数据的实时性也非常关键。
只读分析引擎作为 TDSQL-C 的从库,实际上也需要将行存变更数据同步到列存数据上,支持 30W/S 混合变更负载,并且保证数据的延时在 1 秒以下。
这对列存系统其实是一个不小的挑战,只读分析引擎自研的存储引擎在其中扮演了重要的角色。
需要提前说明的业界数据库的更新模式主要分为两种:
● 采用 B+ 树结构的原地更新模式,典型的代表是 MySQL、Oracle 等传统关系型数据,某个数据的变更删除都是在对应的 Page 原地进行
● 采用 LSM 结构的日志更新模式,典型的代表是 RocksDB、LevelDB 等 KV 数据库,某个数据的变更删除都是先写到内存中 MemTable 中再进行异步的 Flush、Compaction
对于原地更新的模式来说,数据局部性非常好,写放大小,但是会造成数据的空洞和碎片。
对于列存系统来说也并不友好,如果每次都原地更新,需要频繁的重写一个列文件,这对于高频的变更来说是不能接受的。
对于 LSM 结构来说,数据的更新都在 MemTable 中进行,并进行一步的 Flush、Compaction,对列存系统非常友好,但是由于数据的局部性差,异步的 Compaction 又回带来明显的写放大,反过来又回影响数据的变更效率。
只读分析引擎为了支持为了高频的变更,将原地更新模式和日志更新模式进行了结合,基本的存储结构如下图所示:
图片
相对于传统的 LSM 存储结构,只读分析引擎的存储系统,为每个磁盘上 SSTable 文件都维护了一个记录增量更新的 Delta MemTable,数据结构和 MemTable 类似。

这样所有的变更还是在内存中,并且依靠 WAL 进行持久化。

同时数据的删除和更新都会直接应用到每个 MemTable 对应的 MemTable 中,数据的局部性也会更好,增量数据和基线数据的合并基本都在一个 SSTable 中进行,写放大也会明显的下降。

通过这种原地更新和日志更新的结合,只读分析引擎在高频变更,尤其是高频更新的场景下的性能大幅提升,对于微购业务数据行列数据实时同步起到重要作用。


总结
云原生数据库 TDSQL-C 拓展的只读分析引擎能力,有效的提升了整体数据库的应用边界和能力上限。
通过 Zero-ETL 的方式,可以极其方便的将在线业务中的数据实时转换为列式存储,用户无需关心数据同步加载的过程,直接访问只读分析引擎可获得极大的复杂查询性能提升,广泛适用于实时报表、BI 看板、实时数据分析等业务场景。
https://m.zhipin.com/mpa/html/weijd/weijd-boss/e64b7051956464601n1_2Ni4E1A~?sid=qr_self&openWeapp=1&sbcid=872ae95022e0b9c91HR-3Nu4Ew
免责声明:本内容来自腾讯平台创作者,不代表腾讯新闻或腾讯网的观点和立场。
举报
00:34
8090后泪目!奇迹MU端游复刻,4月1日登录送卓越套装
广告奇迹MU怀旧版
了解详情
评论 0文明上网理性发言,请遵守《新闻评论服务协议》
请先登录后发表评论~
查看全部0条评论
首页
刷新
反馈
顶部