Doris—高并发实时查询核心技术

本文详细介绍了ApacheDoris在在线高并发报表场景中的应用,包括其秒级实时数据写入、亚秒级查询响应、高并发支持以及实时查询的核心技术,如高效存储引擎、高性能查询引擎、强一致物化视图、分区分桶索引和点查行存等。通过实例和性能测试展示了Doris在高并发点查性能的显著提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、Apache Doris 介绍

二、在线高并发报场景

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

2.2 在线高并发报表的挑战

2.3 Doris解决方案

2.4 实践案例

三、实时查询核心技术

3.1 高效存储引擎

3.2 高性能查询引擎

3.3 强一致物化视图

3.4 分区分桶

3.5 丰富的索引

3.6 点查行存

3.7  预编译SQL

3.8 高并发点查性能大幅提升

  原文大佬的这篇高并发实时查询原理有借鉴意义,这里摘抄下来用作学习和知识沉淀。如有侵权请告知~

前言

  Doris 是基于 MPP架构的高性能实时分析数据库,在海量数据下返回查询结果只需亚秒级的响应时间,不仅支持高并发点查询场景,还支持高吞吐量复杂分析场景。

一、Apache Doris 介绍

Doris 可以支持丰富的场景:

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

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

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

二、在线高并发报场景

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

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

2.2 在线高并发报表的挑战

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

  •  服务高可用:一般系统在使用高峰时可能会受到影响和波动,在线报表等场景下需要避免服务故障影响业务运转。

2.3 Doris解决方案

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

2.4 实践案例

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

   基于 Doris 的广告报表效果:

  • 实时数据写入:日增3000亿行数据,峰值导入近100万行/秒,秒级延迟;
  • 亚秒级查询:8000万查询/天,99分位延迟 150ms;
  • 查询高并发:实际峰值4500+QPS,压测峰值1万+QPS;
  • 在线高可用:不停服在线扩容,Scheme Change、618大促无故障运行。

三、实时查询核心技术

3.1 高效存储引擎

Doris 提供了三种存储模型:

1)明细模型;(追加)

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

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

3.2 高性能查询引擎

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

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

3.3 强一致物化视图

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

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

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

3.4 分区分桶

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

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

3.5 丰富的索引

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

  • 前缀索引:由于 Doris 采用 lsm-tree 模型,在写入时进行写时排序,每一个文件都是有序的 SST,常见的是以1024行作为一个 block存储一份稀疏数索引,查询时根据二分查找定位到block范围,实现快速精准的范围定位,极大减少数据 scan;
  • 倒排索引:常见的是用倒排索引来做点查索引;
  • 稀疏索引:Doris 中也提供了“bloom_filter”这样的稀疏索引,在一些等值查询条件中,Doris 通过 text hash 去判断数据是不是在对应的 data page 中(data page 是 Doris 中的最小存储粒度),但“bloom_filter”会有一定假阳性(布隆过滤器判断有,但是实质没有),一般用在等值过滤中,也可用在 N-gram 或 group-filter 中,加速“like”的查询匹配。

3.6 点查行存

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

3.7  预编译SQL

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

3.8 高并发点查性能大幅提升

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

参考文章:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值