目录
Doris和StarRocks都是高性能的分析型数据库,它们都适用于大规模数据集的快速查询和分析。
Doris
Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于此,Apache Doris 能够较好的满足报表分析、即席查询、统一数仓构建、湖仓一体等使用场景,用户可以在此之上构建用户行为分析、AB 实验平台、日志检索分析、用户画像分析、订单分析等应用。
Apache Doris 最早是诞生于百度广告报表业务的 Palo 项目,2017 年正式对外开源,2018 年 7 月由百度捐赠给 Apache 基金会进行孵化,之后在 Apache 导师的指导下由孵化器项目管理委员会成员进行孵化和运营。目前 Apache Doris 社区已经聚集了来自不同行业数百家企业的 400 余位贡献者,并且每月活跃贡献者人数也超过 100 位。2022 年 6 月,Apache Doris 成功从 Apache 孵化器毕业,正式成为 Apache 顶级项目(Top-Level Project,TLP)
Apache Doris 如今在中国乃至全球范围内都拥有着广泛的用户群体,截止目前,Apache Doris 已经在全球超过 2000 家企业的生产环境中得到应用,在中国市值或估值排行前 50 的互联网公司中,有超过 80% 长期使用 Apache Doris,包括百度、美团、小米、京东、字节跳动、腾讯、网易、快手、微博、贝壳等。同时在一些传统行业如金融、能源、制造、电信等领域也有着丰富的应用。
Doris 架构
Doris架构
如图所示,Doris 架构非常简单,只有两类进程
- Frontend(FE),主要负责用户请求的接入、查询解析规划、元数据的管理、节点管理相关工作。
- Backend(BE),主要负责数据存储、查询计划的执行。
这两类进程都是可以横向扩展的,单集群可以支持到数百台机器,数十 PB 的存储容量。并且这两类进程通过一致性协议来保证服务的高可用和数据的高可靠。这种高度集成的架构设计极大的降低了一款分布式系统的运维成本。
存储引擎
Doris 采用列式存储,按列进行数据的编码压缩和读取,能够实现极高的压缩比,同时减少大量非相关数据的扫描,从而更加有效利用 IO 和 CPU 资源。
查询引擎
采用 MPP 的模型,节点间和节点内都并行执行,也支持多个大表的分布式 Shuffle Join,从而能够更好应对复杂查询:
Doris查询引擎
Doris 查询引擎是向量化的查询引擎,所有的内存结构能够按照列式布局,能够达到大幅减少虚函数调用、提升 Cache 命中率,高效利用 SIMD 指令的效果。在宽表聚合场景下性能是非向量化引擎的 5-10 倍。
Doris 采用了 Adaptive Query Execution 技术, 可以根据 Runtime Statistics 来动态调整执行计划,比如通过 Runtime Filter 技术能够在运行时生成 Filter 推到 Probe 侧,并且能够将 Filter 自动穿透到 Probe 侧最底层的 Scan 节点,从而大幅减少 Probe 的数据量,加速 Join 性能。Doris 的 Runtime Filter 支持 In/Min/Max/Bloom Filter。
索引结构
Doris 也支持比较丰富的索引结构,来减少数据的扫描:
- Sorted Compound Key Index:可以最多指定三个列组成复合排序键,通过该索引,能够有效进行数据裁剪,从而能够更好支持高并发的报表场景
- Z-order Index :使用 Z-order 索引,可以高效对数据模型中的任意字段组合进行范围查询
- Min/Max Index :有效过滤数值类型的等值和范围查询
- Bloom Filter :对高基数列的等值过滤裁剪非常有效
- Invert Index :能够对任意字段实现快速检索
存储模型
Doris 支持多种存储模型,针对不同的场景做了针对性的优化:
-
Aggregate Key 模型:相同 Key 的 Value 列合并,通过提前聚合大幅提升性能
-
Unique Key 模型:Key 唯一,相同 Key 的数据覆盖,实现行级别数据更新
-
Duplicate Key 模型:明细数据模型,满足事实表的明细存储
物化视图
Doris的物化视图是一种特殊的数据集合,它是根据定义的SELECT语句预先计算并存储在Doris中的。
物化视图可以大幅提高查询性能,特别是对于经常使用相同子查询结果的查询。
Doris自动维护物化视图的数据,确保与基表的数据一致性,无需额外的人工维护成本。此外,查询时Doris会自动选择最优的物化视图,直接从物化视图中读取数据并进行计算。
物化视图的创建是一个异步操作,用户提交创建任务后,Doris将在后台计算现有数据直到创建成功。创建物化视图的语法与PostgreSQL和Oracle一致,支持的聚合函数包括SUM、MIN、MAX、COUNT、BITMAP_UNION、HLL_UNION以及AGG_STATE。
为了保证物化视图与基表之间的数据一致性,Doris将基表上的导入、删除等操作同步到物化视图,并采用增量更新提高更新效率。
使用物化视图时,用户不需要更改查询,Doris会根据当前查询语句自动选择最优的物化视图。用户可以使用EXPLAIN命令检查当前查询是否使用了物化视图。
此外,Doris还支持创建异步物化视图,这允许