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

目录

前言

一、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 高并发实时查询核心技术

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值