聊聊Doris中的高效设计

并发点查

对于列存格式引擎,如果需要获取整行/多行数据,且并发量比较高的情况,列存引擎的效率与性能就会比较低。

行存

支持按行存储数据

短路径查询

对于主键的点查,支持走短路径查询,减少RPC

PreparedStatement

预编译缓存数据

索引

在 Doris 中,数据被组织成一个个 segment,这是数据写入和查询的基本单元。每个 segment 包含了数据页(Data Page),而数据页是数据读取的最小单元。当数据写入时,Doris 会为每个 page 生成 索引(前缀索引、Ordinal索引、ZoneMap索引等),在Page中会维护大量的索引相关信息。正是得益于这种存储文件格式的设计,Doris将生成索引的关键信息存储到Page文件中。

前缀索引

前缀索引会对每一个索引间隔的第一个数据行的前缀进行索引。基于稀疏索引与数据有序性的设计,只记录了索引间隔的第一个数据行的前缀,而不是所有数据行的前缀。粗粒度的定位到key可能的范围,然后用二分查找算法精确地定位到key的位置。

Ordinal 索引

Ordinal 索引是一种行号的稀疏索引,记录了各 page 中第一条记录的行号以及对应的 page 偏移和大小。也是一种稀疏索引。对于那些只需要按行号进行查询的场景来说,可以大大提高查询效率。

ZoneMap索引

主要用于加速范围查询(Range Query)和等值查询(Equal Query);其设计原理是建立数据分区与查询条件之间的映射关系(类似map),以便快速定位到满足查询条件的数据所在的位置。

Bitmap索引

Bitmap 索引是一种基于位图(Bitmap)的数据结构,用于表示一个列中所有可能的值。 Bitmap索引由两部分组成:

1.有序字典:有序保存一列中所有的不同取值。2.字典值的Roaring位图:保存有序字典中每一个取值的Roaring位图,表示字典值在列中的行号。

Bloom Filter 索引

一种基于布隆过滤器(Bloom Filter)的数据结构,用于测试一个元素是否在一个集合中;主要用于加速全文检索和模糊查询等类型的查询。

NGram Bloom Filter索引

基于 N-gram 和布隆过滤器(Bloom Filter)的数据结构,用于加速文本搜索和模糊查询等类型的查询,优化了like查询的性能。

倒排索引

支持倒排索引,可以用来进行文本类型的全文检索、普通数值日期类型的等值范围查询,快速从海量数据中过滤出满足条件的行。

分布式数据JOIN聚合

由于数据是分布式存储,因此多表join查询时,就需要考虑数据从多个远程节点查询并聚合在一起,因此需要合理的join模式。

Shuffle

分布式环境中,数据传输的模式。主要的目标是最小化、最快捷的传输节点的数据。目前支持四种Shuffle方式。

Runtime Filter

Runtime Filter技术与谓词下推等技术,一般是结合的。两者的目的都是为了提前将Probe端的不必要的数据过滤掉,减少数据传输与数据读取。

JoinReorder

在执行SQL查询时,reorder多个表join的顺序。其主要的目的是减少数据传输与数据读取的量级;其实现方式可以理解为寻找最短/优路径的过程,一般有两种实现方式:动态规划/贪心算法;基于规则策略。

数据倾斜

Doris中,数据分布、集群负载不均匀,导致系统的性能与稳定性不好。得益于Doris良好的架构设计,支持多种方式解决数据倾斜。

分区/分桶

支持动态分区、分桶,调整数据的分布。

副本

支持多副本以及设置分区策略,尽量均衡的分摊存储数据

负载均衡

FE层支持负载均衡,分摊请求。

存储结构

BE层的存储设计类似LSM-Tree,决定了其插入,检索的高效性。

LSM-Tree

基于LSM-Tree数据结构的思想设计存储层。其原理是把各种数据先用log等形式组织在内存中(该数据结构称为MemTable,且有序);到达一定数据量后再批量merge写入磁盘(该数据结构称为SSTable);为压缩存储,会通过归并排序合并压缩SSTable。LSM主要是利用顺序写要比随机写更快速高效的原理,加上归并排序,合并压缩文件,提供更高效的数据存储与查询支持。

查询引擎与执行计划

查询优化器基于Apache Impala改造实现的。其包含词法语法解析、语义解析、query改写、生成执行计划等多个流程。

分布式数据查询

FE层与BE层的分离架构,在分布式场景中,决定了其路由寻址的高效性。FE作为前端,会将BE的数据信息(比如数据所属的节点等)写入元数据。依托这些信息,以及探活机制,数据在请求时,首先会在FE层读取到元数据信息,再可用的BE节点中选择一个,最后查询BE数据。

数据模型

简述:数据模型是一个核心概念,它定义了数据在 Doris 中的存储方式、数据结构和数据操作的行为。数据模型决定了数据如何被组织、查询和聚合,以及如何支持不同的分析场景。 Doris整合了Google Mesa(数据模型)和Apache ORCFile (存储格式,编码和压缩) 的技术设计了三种数据模型。

数据更新

在高并发大数据量的情况下的数据更新方案,一般有如下三种: COW: copy-on-write, 写时复制; MOR: merge-on-read, 读时合并; MOW: merge-on-write, 写时合并;

事务一致性

数据的导入/写入要控制一致性,一般都是要通过分布式事务来实现。 Doris中通过 两阶段事务+状态 控制数据的写入与数据的可见性。


原文始发于微信公众号(阿郎小哥的随笔驿站):聊聊Doris中的高效设计

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/244199.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!