doris是一款具有大规模并行处理(mpp)架构,支持存算一体,存算分离,具有特有的查询引擎和存储引擎的实时分析型数据库。doris的衍生产品有starrocks,同种类似产品有clickhouse。
FE,BE的具体作用:
在存算一体的模型中:
FE:响应用户请求,查询解析,表元数据的管理,节点管理等;划分了leader,follower,observer三种角色
BE:数据存储,任务的执行,数据会被切分成数据分片(Shard),在 BE 中以多副本方式存储。
3.0版本开始支持存算分离,之前为存算一体。
采用 Segment v2 的形式来存储数据,其结构主要分为数据区、索引区和页脚三个部分。数据区存储各列的数据,按需分页加载;索引区存储列的索引数据,按列粒度加载;页脚包含文件的元数据信息,如SegmentFooterPB、校验和以及FileFooterPB 的长度
apache doris文件分布:
plaintext自动换行:关放大阅读展开代码表(Table) ├── 分区(Partition) -- 第一级:按业务维度划分(如时间) │ ├── 分桶(Bucket) -- 第二级:按哈希均匀分布(如用户ID) │ │ ├── RowSet -- 第三级:写入时的逻辑单元(内存/临时) │ │ │ └── Segment -- 第四级:持久化的物理文件(磁盘) │ │ └── ... │ └── ... └── ...
每张表可以创建不同的分区,但是doris只能创建一级分区,每个分区下按照不同列取hash或者random打散创建不同的桶,也称为tablet;每个tablet划分不同的rowset;依托列式存储的概念,rowset划分不同segment,segment是最小的数据单元;
参考:doris数据模型介绍
数据模型中明细模型,主键模型,聚合模型的排序键作用: 明细模型中排序键只具有排序的功能;在主键模型和聚合模型同时具有排序,聚合的功能
分区策略 分区类型:
分区模式:
ALTER 语句增加分桶策略
crc32 哈希值,并对分桶数取模,将数据行均匀分布到分片中分桶数量的设置: 主要坚持大小原则:建议一个 tablet 的大小在 1-10G 范围内,即分桶的大小,通常选择4-5G。合理预估存量数据和未来数据的增长趋势得出一定时间范围总量,结合分桶在分区的存储下,再根据 每个分桶4-5G的选择预估分桶数
目前,Doris 仅支持修改新增分区的分桶数量,对于以下操作暂不支持:
不支持修改分桶类型
不支持修改分桶键
不支持修改已创建的分桶的分桶数量
支持的数据类型
doris支持常用的绝大部分类型,其中BITMAP,HLL为比较新颖的数据类型
数据压缩 doris默认采用LZ4的压缩编码,可以根据各自的场景选择不同的压缩算法,实现存储优化和加速查询。 影响压缩比的主要因素有:
| 策略模型 | 核心机制 | 写入路径 | 读取路径 | 写放大 | 读放大 | 适用场景 | 代表 |
|---|---|---|---|---|---|---|---|
| 写时归并 (Merge-on-Write) | 写入数据时立即合并/更新,保证存储数据始终是最新、最规整的单一版本。 | 复杂且慢,涉及随机读写和数据重组。 | 简单且快,直接读取最终版本。 | 高 | 低 | 读密集型 (Read-Intensive) | B-Tree |
| 读时归并 (Merge-on-Read) | 写入时只进行追加(Append-only),将数据合并的复杂性推迟到读取时或后台处理。 | 简单且快,主要是顺序写入。 | 复杂且慢,需要读取多个版本并动态归并。 | 低 | 高 | 写密集型 (Write-Intensive) | LSM-tree |
Doris 通过类似 LSM-Tree 的结构写入数据,在后台通过 Compaction 机制不断将小文件合并成有序的大文件,同时也会处理数据的删除、更新等操作,解决写放大问题,Doris 主键 (unique) 模型,从 Doris 2.0 开始,除了原来的 Merge-on-Read(MoR),也引入了 Merge-on-Write(MoW)的存储方式,MoR 是为了写入做优化,而 MoW 是为了更快的分析性能做优化
采用大规模并行处理(MPP)架构,支持节点间和节点内并行执行,以及多个大型表的分布式 Shuffle Join;Doris 查询引擎是向量化引擎,所有内存结构均按列式布局等
doris为查询加速引入了索引的设计。常用索引如下
倒排索引
前缀索引
BloomFilter 索引
不同的索引对不同的运算符和触发条件有不同的要求:
doris的使用列式存储数据,对于条件过滤,排序,分区性能很好,但是对于点查(select * from table)需要需要读取全部的列,每个列的读取都需要一次IO,对于宽表(比如上百列的DWS表)影响较大;
故使用行列混存(行存的原理是在存储时增加了一个额外的列,这个列将对应行的所有列拼接起来采用特殊的二进制格式存储),应对点查的场景
store_row_column 设置是否开启行列混存,以及一些额外混存的参数设置
物化视图是既包含计算逻辑也包含数据的实体。它不同于视图,因为视图仅包含计算逻辑,本身不存储数据。
其中一个使用场景
物化视图的优点:
数据同步:拥有自动或手动的刷新机制,可以与基表(如图中的维表1-4)保持数据同步。刷新可以是全量的,也可以是增量的
查询优化:具备智能的查询改写能力。当用户查询基表时,数据库可以自动判断并“智能地”重定向查询到物化视图,从而利用预计算的结果加速查询,这个过程对用户透明
本文作者:hedeoer
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!