Fork me on GitHub

去冗降本—Doris 高并发实时查询核心技术

以下文章来源于 https://zhuanlan.zhihu.com/p/670982890

导读 Apache Doris 是基于 MPP 架构的高性能实时分析数据库,以其极快的速度和易于使用而闻名。在海量数据下返回查询结果只需亚秒级的响应时间,不仅支持高并发点查询场景,还支持高吞吐量复杂分析场景。通过实时查询场景下的多种优化机制,Doris 在高并发场景下性能出明显的提升。本文将重点从在线高并发的报表场景及相关核心技术进行重点介绍。

今天的介绍会围绕下面四点展开:

  1. Apache Doris 介绍

  2. 在线高并发报场景

  3. 实时查询核心技术

  4. 加入 Apache Doris 社区

分享嘉宾|李航宇 飞轮数据科技 SELECTDB 数据库内核研发工程师

编辑整理|橘子

内容校对|李瑶

出品社区|DataFun

01Apache Doris 介绍

Doris 作为全球领先的实时数仓开源技术,已经成为 Apache 的第200个顶级项目。拥有8000+的 Star 树,500+的社区开发者,全球有1500家企业用户使用相关技术。

在 Apache Doris 成为最活跃的开源大数据项目时,他的 Active Contributors 已经远超其他大数据项目。月度活跃贡献者超过120位并持续增长。

Doris 可以支持丰富的场景:

1、湖仓一体的现代化数据平台:提供统一查询网关,面向企业内部的商业报表和 ad-hoc 分析,提供批量和增量的ETL处理,替代 Spark、Hive、Presto 等系统;

2、在线高并发报表:用于业务数据库或业务日志变更数据实时导入 Doris 中,为用户提供大规模高并发近实时的报表与分析,可替代 mysql、Hbase 等 HTAP 系统;

3、用户画像与行为分析:收集与用户相关属性与行为数据,构建用户数据平台,进行用户参与、留存、转化等行为分析,以及对人群圈选等分析,可替代 Elasticsearch、Spark 等系统;

4、日志存储与分析:将在 Doris2.0 中发布,可将业务系统及物联网等相关的数据作为结构化或半结构化的原始文本,统一构建日志的存储与分析平台,在极低成本基础上,提供高性能、低延迟的日志检索分析能力,可替代 Elasticsearch、Loki 等系统。

02在线高并发报场景

1. 在线高并发报表的典型场景

  • 广告主营销报表:为广告主提供广告曝光、点击、消费等报表和分析;
  • 在线物流看板:为物流站点提供压力、效率、客诉等实时分析;
  • 保险代理人客户分析:为保险人提供客户计划、转换等分析;
  • 交易明细查询:为用户提供订单、账单、物流单等明细的查询服务。

2. 在线高并发报表的挑战

  • 数据低延迟:实践中需要新增和更新的数据以低延迟的速度写入到更新中,以秒级的延时性提供服务,而传统数据库难以反应实时变化;
  • 查询响应快:面向业务系统使用的系统需要满足亚秒级延迟,以确保用户的查询体验,原有系统一般较难应对超大规模下的查询延迟;
  • 查询高并发:在特定场景下支持超高并发,不仅需要面向公司管理层也需要广泛面对公司内部或 To C 海量用户场景,传统方案在业务高峰期较难支持大量高并发请求;
  • 服务高可用:一般系统在使用高峰时可能会受到影响和波动,在线报表等场景下需要避免服务故障影响业务运转。

3. Apache Doris 解决方案

  • 支持秒级实时数据写入:Apache Doris 支持100万行/秒的实时写入,及从 IOTP 或Kafka系统自动流式同步数据,也支持更新数据库中数据,如订单状态等;
  • 支持亚秒级查询响应:Apache Doris 实现了全面向量化,对存储和计算的全面向量化,实现了数量级的查询加速;同时,Doris 提供了物化视图这种以时间换空间的预聚合机制,使预聚合结果满足亚秒级的查询;
  • 支持万 QPS 高并发:面向消费者的超高 QPS 并发的分区分桶减少数据扇出,采用跳数索引、点查索引等减少数据的并发查询,从而提高查询的并发能力;同时,Doris 支持行存格式,支持点查更友好的 Cache 机制,减少读放大,减少磁盘 IO 压力,目前可实现单机上万能力的 QPS;
  • 支持在线高可用服务:因 Doris 采用的多副本机制,目前可以做到无单点问题,支持不停服的 Scheme Change,在线加减力、列变更、毫秒级的加减力;支持水平在线扩容,实现单集群内的高可用;在2.0中,Doris 即将发布 CCR 的跨集群实时同步,实现多集群的跨机房同步。

4. 实践案例



用户在618大促期间,Doris 为其提供了平稳、在线、高效的服务能力。

该用户原有报表系统存在:性能不够,报表场景需要满足毫秒级延迟;超高 QPS,业务每日有几千查询调用量,峰值可达到数千 QPS,在 Hadoop 系统里面较难满足这样的需求;数据变更困难,日常业务需要 Scheme Change 对数据表进行加减列以及新增 row up、扩容等操作,维护成本极高,系统鲁棒性下降;稳定性隐患等问题。

基于 Doris 的广告报表效果:

实时数据写入:日增3000亿行数据,峰值导入近100万行/秒,秒级延迟;

亚秒级查询:8000万查询/天,99分位延迟 150ms;

查询高并发:实际峰值4500+QPS,压测峰值1万+QPS;

在线高可用:不停服在线扩容、Scheme Change、618大促无故障运行。

03实时查询核心技术

1. 高效存储引擎



Doris 提供了三种存储模型:

1)聚合模型:以相同 key 的方式进行聚合,通过预聚合大幅提升性能;(销售额数据)

2)Unique key 模型(主键模型):通过唯一 key 实现行级别的数据更新;这一模型下支持 merge on wirte 和 merge on read 两种模式,一个是在写的时候进行更新,一个是在读的时候进行更新,这种方式对点查比较友好,具有更高效编码机制,以主键联合方式存储于存储引擎中;(订单数据)

3)明细模型;(追加)

2. 高性能查询引擎

Doris 实现了全链路的向量化。向量化计算框架可以:一是大幅减少虚函数调用;二是大幅提升 cache 命中率;三是高效利用 SIMD 指令。在宽表聚合场景下性能可提升5-10倍。

Doris 2.0中将推出 Pipeline 引擎,可以根据数据量自适应调整并发度;实现算子粒度并发;数据驱动,数据流和控制流分离,减少线程数和线程切换开销;便于混合负载下资源隔离和共享。

3. 强一致物化视图

物化视图是一种时间换空间的概念,物化视图可以加速查询,实现库内ETL、简化数据流维护,增量自动处理来自 base 表的数据;同时,也提供了单表视图的强一致,增量自动更新、支持 where 语句对物化视图进行过滤;查询优化器可根据用户查询方式自动选择最佳物化视图进行匹配,提高查询性能。

物化视图是 Doris 中成熟且广泛使用的功能。

对于聚合场景下,如需要对一张表中 sale_amt 这列进行 sum 聚合操作,并进行Groupby 操作,当查询时,优化器会发现有一张物化视图可以提供预聚合能力,所以相关查询可以直接命中该物化视图。

对于前缀查询下,可以"Order by k3"构建物化视图,这张图以 k3 为前缀,在后续查询中,以 k3 作为查询语句的查询可以利用 Doris 前缀索引机制,提高查询效率。



4. 分区分桶

Doris 采用了两级分区机制,第一级通常以时间进行分区,range 分区,如某一年、某个月;第二级采用 hash 分区,Bucket。合理的分区分桶可以加速数据的并发能力,使数据分布更均匀,从而提升查询并发。

如一张表中,以"create_time"作为分区键,以"ID"作为分桶键,当进行查询时可以设定 id 和 create_time,裁剪掉绝大多数不满足条件的数据,提升系统并发能力。



5. 丰富的索引



Doris 写入类似 RocksDB 这样的存储系统,需要进行写实排序,例如经过 memTable、由类似 SkipList 这样的数据结构进行排序,在内存中编码成行存储格式,编码索引数据、以 Append-only 方式追加写入磁盘,使查询更加高效,可以实时对数据进行更新,用户可以快速看到最新的数据。

Doris 中的索引包括:

前缀索引:由于 Doris 采用 lsm-tree 模型,在写入时进行写时排序,每一个文件都是有序的 SST,常见的是以1024行作为一个 block 存储一份稀疏数索引,查询时根据二分查找定位到block范围,实现快速精准的范围定位,极大减少数据 scan;

倒排索引:Doris 2.0 中将提供更加丰富的类似全文检索或 BKD 空间向量类似的索引,维护索引到 dock_id 也就是行号的字典,对数据行号进行快速确认。常见的是用倒排索引来做点查索引;

稀疏索引:Doris 中也提供了"bloom_filter"这样的稀疏索引,在一些等值查询条件中,Doris 通过 text hash 去判断数据是不是在对应的 data page 中(data page 是 Doris 中的最小存储粒度),但"bloom_filter"会有一定假阳性,一般用在等值过滤中,也可用在 N-gram 或 group-filter 中,加速"like"的查询匹配。

6. 点查行存

这是 Doris 中新引入的机制,Doris 中一般是以列存的方式进行写入,这对于聚合类查询有极大的查询提升,减少虚函数调用,充分利用 cache line、simd 指令等;但列存是将数据按列的方式进行存放,在点查场景下存在 IO 浪费的情况,如,Doris 的最小存储是一个 page,常见的 page 是 64K 为一个单位,在极端情况下,每一列都需要读 64K,将产生读放大。因此,Doris 引入了行存编码方式,将一行紧凑编码到磁盘的存储空间上,在更高并发的点查场景下,利用操作系统的 cache 及 Doris 内部的 cache,减少读取整行数据的 IO 放大。



7. 预编译 SQL



这也是 Doris 2.0中引入的优化机制。在 Doris 查询层进行大量优化后发现,Doris 的Frontend 成为了明显的查询瓶颈。FE 中有大量的 CPU 热点,FE 由 java 编写,难以做到 C++ 所表现出的优化极致。在高并发点查请求下,一般存在相同请求模式,如 select* where id 主键=,或非主键=的方式,因此,Doris 中可以利用 sql 中的 server_side PreparedStatement 机制,预先编译查询的 sql,缓存在 FE session 的 map 中,在后续查询中可以直接执行缓存中的 sql 和执行计划。特别是基于主键点查情况下,可以知道查询数据在某一个具体的分桶中,利用 short-circuit 机制对其进行查询,通过 RPC 方式直接定位到底层的存储引擎。

8.高并发点查性能大幅提升

在单机环境下使用 YCSB(Yahoo! Cloud Serving Benchmark 雅虎开源的一款通用的性能测试工具)对 Doris 进行性能测试,通过上述多项优化机制后,我们看到 Doris 相关性能出现了数据量级上的飞跃。主键查询的平均延迟从6.9ms提升到0.3ms,p99从17ms提升到不到1ms;QPS 也得到了极大提升。



9.高并发点查性能优势明显

与同类型 OLAP 系统进行对比,可以发现,主键查询场景下,Doris 较其他 OLAP 系统有两倍性能的性价比,非主键查询下,实现了数量级的差别。

04加入 Apache Doris 社区

1. 申请 Apache Doris 2.0 优先使用

Apache Doris 目前已经发布了全新的2.0 Alpha 版本,即将发布 Beta 版本,并开放了下载使用,感兴趣用户可扫描二维码填写信息并获取开源工程师的支持。

2. 如何加入社区

初始 Doris 的用户可通过订阅开发者邮件组、通过会议链接参加开发者双周会或通过 DSIP 查阅社区核心设计方案查询相关信息。

以上就是本次分享的内容,谢谢大家



本文地址:https://www.6aiq.com/article/1701997532363
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出