Apache Doris是一个基于MPP(大规模并行处理)架构的高性能、实时的分析型数据库。其核心架构简洁而高效,主要包含Frontend(FE)和Backend(BE)两种进程,共同协作处理数据存储与查询。

- Frontend (FE):作为系统的协调者和入口,负责接收用户连接、解析SQL、生成并优化查询执行计划、管理元数据以及集群调度。FE节点通过类Raft协议实现高可用。
- Backend (BE):负责数据的存储与查询执行。它存储表数据,并执行FE下发的查询计划片段,如数据扫描、聚合和排序等。
这种前端与后端分离的架构,使得Doris能够轻松实现水平扩展,并具备高可用和负载均衡能力。
数据模型:聚合模型与唯一模型
Doris主要提供了两种数据模型:聚合模型(Aggregate Model)和唯一模型(Unique Model),以适应不同的业务场景。
聚合模型是Doris的经典模型,特别适合有预聚合需求的报表分析。在此模型下,用户可以定义维度列(Key)和指标列(Value),并为指标列指定聚合函数(如SUM、MAX、MIN等)。当导入的数据具有相同维度时,Doris会自动对指标列进行聚合,这极大地提升了查询性能。
| 用户ID (Key) | 日期 (Key) | 城市 (Key) | 销售额 (SUM Value) | 最后访问时间 (REPLACE Value) |
|---|---|---|---|---|
| 1001 | 2023-10-01 | 北京 | 150 | 10:00 |
| 1001 | 2023-10-01 | 北京 | 50 | 14:00 |
上表数据导入后,在Doris内部会聚合成一行:(1001, 2023-10-01, 北京, 200, 14:00)。
唯一模型则更适用于需要按主键唯一更新数据的场景,可以看作是聚合模型的一个特例,它通过使用REPLACE聚合类型来实现,保证同一主键下仅保留最新的数据行。
数据划分:分区与分桶
为了高效管理海量数据,Doris采用了两级数据划分策略:分区(Partitioning)和分桶(Bucketing)。
- 分区(Partition):通常按照日期范围进行划分,例如按天或按月分区。分区是实现分区裁剪的基础,在查询时只扫描相关分区的数据,避免全表扫描,从而显著提升查询效率。
- 分桶(Bucket):在分区内,数据通过哈希分桶策略被进一步划分到多个更小的数据单元(Tablet)中。分桶列通常是查询中高频使用的维度列。合理的分桶设计可以实现高效的并行计算和数据均衡。
这种“分区内分桶”的机制,使得每个Tablet成为数据移动、复制和计算的最小物理单元,是实现高并发查询和水平扩展的关键。
数据组织与索引
Doris在数据文件层面采用了列式存储格式,这非常有利于分析查询,因为它可以在查询时只读取所需的列,减少I/O。每个Tablet由多个数据段(Segment)组成,而每个Segment内部又按列(Column)存储。
为了加速数据查找,Doris提供了丰富的索引:
- 前缀索引:在数据文件中,每1024行数据构成一个数据块,并对应一条前缀索引项。该索引基于表中排序列的前36个字节构建,能够快速定位到数据块。
- ZoneMap索引:记录了每个数据块内各列的MIN和MAX值,对于范围查询非常有效。
- Bloom Filter索引:适用于对高基数列(如用户ID)进行等值查询,能够快速判断数据块中是否包含目标值。
数据导入与物化视图
Doris支持多种灵活的数据导入方式,包括流式的Routine Load(从Kafka导入)、批量的Broker Load(从HDFS等外部存储导入)以及INSERT INTO等,以满足不同实时性和数据源的需求。
Doris的物化视图(Materialized View)功能是其一大亮点。用户可以为基表预先定义一个或多个物化视图,这些视图存储了按照不同维度聚合计算的结果。查询时,优化器会自动判断是否可以将查询路由到匹配的物化视图上,从而实现对亿级数据的亚秒级响应。
内容均以整理官方公开资料,价格可能随活动调整,请以购买页面显示为准,如涉侵权,请联系客服处理。
本文由星速云发布。发布者:星速云。禁止采集与转载行为,违者必究。出处:https://www.67wa.com/134437.html