Doris
Apache Doris 是一款高性能、实时的分析型数据库(OLAP),以其出色的查询速度、简洁的架构和高度兼容 MySQL 协议而著称
Doris 是一款关系型数据库,但它专攻在线分析处理(OLAP) 领域,与传统面向事务处理(OLTP)的关系型数据库(如 MySQL)在架构、存储模型和适用场景上存在显著差异
|
组件类型 |
角色名称 |
主要职责 |
|---|---|---|
|
前端 (Frontend, FE) |
Leader / Follower |
负责元数据管理、查询语句的解析与规划、集群节点管理。Leader 和 Follower 通过一致性协议(如 Paxos)保证元数据的高可用 |
|
Observer |
仅负责扩展集群的查询能力,不参与元数据写入和选举,从而实现读写分离 |
|
|
后端 (Backend, BE) |
- |
负责数据存储(通常多副本存储)和查询计划的具体执行,是分布式计算和存储的节点 |
🚀 工作原理与核心特性
-
MPP 架构与查询执行
Doris 采用大规模并行处理架构。当用户通过 MySQL 客户端发送一个 SQL 查询请求后,FE 的 Leader 节点会负责接收、解析并优化该 SQL,生成一个分布式的查询执行计划。这个计划会被拆分成多个片段,并分发给相关的多个 BE 节点。每个 BE 节点会并行处理自己负责的数据分片,最后将中间结果汇总给某个 BE 节点进行最终聚合,并将结果返回给客户端。这种“分而治之”的模式极大地提高了复杂分析的查询效率
-
列式存储与高效压缩
Doris 采用列式存储,即将同一列的数据连续存放在一起。这样做的好处非常明显:当查询只涉及部分列时,可以避免读取整行数据,大幅减少 I/O 开销。同时,由于同一列的数据类型相同,通常也能获得更高的数据压缩比
-
向量化执行引擎
为了充分发挥现代 CPU 的处理能力,Doris 实现了向量化执行引擎。它改变了传统数据库一行一行处理数据的方式,改为一次处理一批数据(一个向量)。这减少了函数调用开销,提高了 CPU 缓存命中率,并能利用 SIMD 指令进行并行计算,在宽表聚合等场景下,性能提升可达数倍
-
丰富的数据模型与索引
-
数据模型:Doris 提供了三种核心数据模型以适应不同场景
-
聚合模型 (Aggregate Key):预定义聚合规则(如 SUM、MAX),在数据导入时自动聚合,非常适合报表统计。
-
唯一键模型 (Unique Key):支持按主键进行更新删除,实现行级数据更新,适用于需要保证唯一性的维表。
-
明细模型 (Duplicate Key):存储最原始的明细数据,不进行任何聚合,适用于日志分析等需要完整数据的场景。
-
- 索引技术:Doris 支持丰富的索引,如前缀索引(基于排序键快速定位)、Bloom Filter 索引(高效判断数据块中是否包含某值)和倒排索引(支持任意字段的快速检索),这些索引能有效加速数据过滤
-
Doris 的列式存储是其高性能查询的核心基石
Doris 的列式存储是其高性能查询的核心基石
|
对比维度 |
行式存储 (如MySQL) |
Doris列式存储 |
列式存储的优势 |
|---|---|---|---|
|
数据布局 |
将一整行数据(如用户ID、姓名、年龄)连续存储在一起。 |
将每一列的数据分别连续存储(所有用户ID在一起,所有姓名在一起)。 |
查询时只读取需要的列,极大减少I/O开销 |
|
压缩效率 |
一行内数据类型不同,压缩效率相对较低。 |
同一列数据类型相同、内容相似,可实现极高压缩比(如5:1至20:1) |
节省存储空间,减少磁盘读取和数据网络传输的数据量 |
|
适用场景 |
OLTP:频繁的增删改查、需要读取整行数据的操作。 |
OLAP:对海量数据进行聚合、分析和报表查询,通常只涉及部分列。 |
为分析型查询量身定制,性能可提升数倍至数十倍 |
🔩 列式存储的内部架构
Doris 的列式存储并非简单地将列数据堆砌在一起,而是通过精密的层次化结构进行组织和管理,以实现高效的数据存取
-
数据组织层次:Doris 的数据从大到小分为 Table → Partition(分区) → Tablet(数据分片) → Rowset(数据版本集) → Segment(数据段)。Segment 是列式存储的最小物理单元,每个 Segment 文件内部,数据是按列存储的
-
智能编码与压缩:针对不同的数据类型,Doris 会自动选择最有效的编码和压缩方案。例如,对于重复度高的字符串,会使用字典编码,将其转换为数值,大幅减少存储空间;对于小范围的整数值,会使用位填充编码等技术。Doris 支持多种压缩算法(如LZ4、ZSTD),并能根据数据类型自动选择最优策略
⚡ 加速查询的“组合拳”:索引与向量化
仅仅减少I/O还不够,Doris 通过多种索引和向量化执行技术进一步加速查询。
-
多级索引机制
-
前缀索引(Short Key Index):在数据写入时,Doris 会根据建表时指定的排序列(如
(user_id, event_time))对数据进行排序,并为每间隔一定行数的数据生成一个前缀索引。在点查询或范围查询时,可以快速定位到数据所在的大致范围,避免全表扫描 -
Zone Map(Min/Max)索引:Doris 会为每个数据块(Block)内的每一列自动记录其最小值和最大值。当执行查询时,如果查询条件超出了这个范围,整个数据块就会被直接跳过,从而减少扫描量。这对于时间范围过滤等场景非常有效。
-
Bloom Filter 索引:特别适用于高基数列(如用户ID、订单号)的等值查询。它可以快速判断一个值肯定不存在于某个数据块中,从而高效过滤掉大量不相关的数据
-
-
向量化执行引擎
Doris 的查询引擎是向量化的。这意味着,它处理数据时不再是传统的“一次一行”,而是 “一次一批” 。CPU 可以批量处理列数据,充分利用现代CPU的SIMD(单指令多数据流)指令集,实现并行计算,极大提升了CPU的计算效率,尤其在宽表聚合场景下,性能可达非向量化引擎的5-10倍
💡 列式存储的适用场景与权衡
选择列式存储需要权衡其优劣势,它并非万能钥匙。
-
优势场景:Doris 的列式存储非常适合在线分析处理(OLAP) 场景,例如:
-
聚合报表:快速计算销售总额、用户日活等。
-
即席查询:分析师灵活地探索数据,进行多维度分析。
-
大规模数据扫描:对亿级甚至更大量级的数据进行复杂条件过滤和聚合
-
-
需要考虑的方面:列式存储也有其不擅长的地方。由于写入时需要将一行数据拆解到不同的列位置存储,频繁的单行写入或更新(OLTP场景)成本较高
不过,Doris 通过批量数据导入来规避这一问题,将写入开销分摊,从而在实时和离线数据接入上都表现出色
OLTP和OLAP是两种截然不同的数据处理系统,它们像是一个企业运营的“左右脑”:一个负责实时处理具体业务,另一个负责深度分析辅助决策。了让你快速把握核心区别,我用一个表格来汇总它们的主要特点:
特性维度
OLTP (联机事务处理)
OLAP (联机分析处理)
核心目标
高效、准确地处理日常事务 (如订单、支付)
支持复杂分析与决策支持 (如销售趋势分析)
数据焦点
当前数据,细节的,反映最新状态
历史数据,聚合的,集成的,用于分析趋势
数据库设计
高度规范化的关系模型,面向应用
星型或雪花模型,多维数据模型,面向主题
读写模式
读写频繁,平衡负载,频繁修改数据
以读为主,几乎不修改数据,复杂查询
响应要求
毫秒级响应,超高吞吐量
响应时间通常较长(秒级甚至分钟级)
典型用户
业务操作人员,前台员工,终端客户
数据分析师,决策人员,高级管理人员
数据量级
相对较小 (MB到GB)
海量数据 (GB到TB甚至更大)
🔄 二者如何协同工作
尽管OLTP和OLAP如此不同,但在现代企业数据架构中,它们紧密协作,形成一个完整的数据流水线:
数据产生与记录:所有日常业务操作(如用户下单、库存增减)都在OLTP系统中实时发生,确保每一笔事务准确无误
数据整合与沉淀:OLTP系统中的数据会定期(例如每天夜间)通过ETL(抽取、转换、加载)过程,被提取、清洗、整合后加载到数据仓库中。这个过程将分散的、面向事务的数据转换成统一的、面向分析的数据模型。
分析与洞察:数据分析师和业务决策者使用OLAP工具对数据仓库中的历史数据进行多维、交互式的深度分析,生成报表和洞察,为战略决策提供支持
这种分工协作的优势在于,它将高并发的实时事务处理(OLTP)与消耗大量资源的复杂分析查询(OLAP)分离开来,避免了二者在同一个数据库中相互争抢资源,从而保证了业务系统的稳定性和分析系统的高效性
💎 简单总结
总的来说,OLTP是业务的“执行者”,关心的是“如何做”,追求速度和准确性;而OLAP是管理的“洞察者”,关心的是“为什么”,追求深度和趋势
posted on 2025-10-15 17:05 Karlkiller 阅读(36) 评论(0) 收藏 举报
浙公网安备 33010602011771号