Skip to content

逻辑架构

  1. 表结构分层
  • 逻辑表(Logical Table)

用户直接操作的抽象表,支持多种数据模型:

  • 明细模型(Duplicate Key Model):原始数据存储,无预聚合,适合日志类场景。

  • 聚合模型(Aggregate Key Model):写入时按维度预聚合(如 SUM、COUNT),适合报表分析。

  • 更新模型(Unique Key Model):支持主键更新,适用于频繁更新的场景(如订单状态)。

  • 物化视图(Materialized View) 基于逻辑表预计算的派生表,自动命中查询,加速聚合操作(如按天汇总的销售额)。

  1. 数据分布策略
  • 分区(Partition) 按时间或枚举值划分数据(如 PARTITION BY RANGE(date)),实现分区剪枝,减少查询扫描范围。

  • 分桶(Bucket) 每个分区内数据通过哈希或随机分桶(如 DISTRIBUTED BY HASH(user_id) BUCKETS 10),保证数据均匀分布,并行计算。

  1. 索引机制
  • 前缀索引(Prefix Index) 每行数据前 36 字节作为索引键,匹配查询条件时快速定位数据块。

  • Bloom Filter

对高基数字段(如 user_id)构建布隆过滤器,加速等值查询的过滤效率。

物理架构

  1. 存储结构
  • 行列混合存储
    • 数据文件(Segment):按列组织数据文件,每列独立编码(如字典编码、位图压缩)。
    • 稀疏索引(Sparse Index):每个 Segment 记录行号与物理位置的映射,减少磁盘 I/O。
  1. 数据组织单元
  • Tablet

数据分片的最小物理单元,每个分桶对应一个 Tablet(如 10 个 Buckets 生成 10 个 Tablets)。 每个 Tablet 包含多个数据版本(MVCC 机制),支持并发读写。

  • 副本(Replica)

每个 Tablet 默认 3 副本,通过 Raft 协议保证一致性,副本分布在不同节点实现高可用。

  1. 存储引擎
  • 写入流程 数据先写入内存的 MemTable,达到阈值后刷盘为不可变的 Segment 文件,后台 Compaction 合并小文件。

  • 查询优化

    • 向量化执行:按列批量处理数据,利用 CPU SIMD 指令加速计算。
    • 谓词下推:在存储层过滤无关数据,减少上层计算压力。

架构协同示例

  • 写入场景

数据按分区规则进入对应 Tablet,哈希分桶确保负载均衡,副本同步保证数据安全。

  • 查询场景

优化器根据查询条件选择分区、分桶和物化视图,利用索引快速定位 Tablet,多副本并行读取数据。 Apache Doris 的逻辑存储架构围绕高效管理和查询大规模数据设计,其核心组件包括表(Table)、分区(Partition)、分片(Tablet)和副本(Replica)。以下是详细的分层逻辑架构说明:

  1. 表(Table)
  • 定义:Doris 中的表是数据存储的基本逻辑单元,支持结构化数据模型。
  • 特点:
    • 列式存储:数据按列存储,提升分析查询效率,支持高效压缩和向量化计算。
    • Schema 定义:需预先定义列名、类型(如 INT、VARCHAR、DATE)和索引(如 Bloom Filter)。
    • 数据分布:通过分区(Partition)和分桶(Bucket)实现数据水平切分。
  1. 分区(Partition)
  • 作用:将表数据按特定规则(如时间范围)划分为逻辑块,优化查询剪枝(Partition Pruning)。
  • 分区策略:
    • 范围分区(Range Partitioning):按连续范围(如日期 PARTITION BY RANGE(dt))划分。
sql
PARTITION BY RANGE(dt) (
    PARTITION p202301 VALUES [('2023-01-01'), ('2023-02-01')),
    PARTITION p202302 VALUES [('2023-02-01'), ('2023-03-01'))
)
  • 列表分区(List Partitioning):按离散值(如地域 city)划分。

  • 管理:

    • 支持动态分区(自动创建/删除分区),例如按天滚动分区。
    • 查询时仅扫描相关分区,减少 I/O。
  1. 分桶(Bucket)与分片(Tablet)
  • 分桶(Bucket):
    • 定义:在分区内,数据按哈希或随机规则分配到多个分桶。
    • 分桶键:选择高基数列(如 user_id)作为分桶键,确保数据均匀分布。
sql
DISTRIBUTED BY HASH(user_id) BUCKETS 10  -- 将数据分到10个桶
  • 分片(Tablet):

    • 物理单元:每个分桶对应一个分片,是数据存储和复制的最小单元。
    • 分布:分片分布在多个后端节点(BE)上,支持水平扩展。
    • 多副本:每个分片默认有 3 个副本(通过 replication_num 配置),保障高可用。
  1. 副本(Replica)
  • 副本机制:
    • 多副本分布:同一分片的多个副本分布在不同的 BE 节点,避免单点故障。
    • 一致性协议:基于 Raft 协议保证副本间强一致性,写入需多数副本确认。
  • 副本类型:
    • Leader 副本:处理写入请求,协调数据同步。
    • Follower 副本:接收 Leader 同步的数据,参与查询负载均衡。
  1. 存储引擎与数据组织
  • 列式存储:

    • 数据文件:每列单独存储为数据文件(.dat),按分片组织。
  • 索引结构:

    • 前缀索引(Prefix Index):基于分桶键的前 36 字节构建,加速点查询。
    • Bloom Filter:对高基数列(如 user_id)加速 WHERE 条件过滤。
    • 稀疏索引:仅存储部分行的元数据,平衡内存占用与查询效率。
  • 数据版本管理:

版本链(Version Chain):每次数据导入生成新版本,支持 MVCC(多版本并发控制)。 Compaction:后台合并小版本文件,优化查询性能。

  1. 数据写入与分发
  • 写入流程:

    • 客户端提交:数据通过 Stream Load、Broker Load 等方式写入 FE。
    • 路由分发:FE 根据分桶键计算哈希值,将数据路由到对应分片的 Leader 副本。
    • 副本同步:Leader 通过 Raft 协议将数据同步到 Follower 副本。
    • 版本生效:写入成功后生成新数据版本,供查询可见。
  • 写入优化:

    • 批量提交:攒批写入减少 Raft 协议开销。
    • 内存合并:BE 内存中合并小批次数据再落盘。
  1. 物化视图(Materialized View)
  • 逻辑结构:
    • 基于基表预计算的派生表,存储聚合结果(如 SUM、COUNT)。
    • 自动或手动刷新,支持查询时自动路由到最优视图。

示例:

sql
CREATE MATERIALIZED VIEW mv_sales AS
SELECT region, SUM(sales) 
FROM sales_table 
GROUP BY region;
  • 存储方式:物化视图的数据以独立分片存储,与基表物理隔离。
  1. 元数据管理
  • FE 管理:
    • Catalog:存储库(Database)、表(Table)、分片(Tablet)的元信息。
    • Journal 日志:记录元数据变更(如建表、分区变更),通过 BDB 或 RocksDB 持久化。
  • 同步机制:FE Leader 节点将元数据变更同步到 Follower 节点,保障元数据高可用。

架构示意图

log
┌───────────────┐
│     Table     │  -- 逻辑表
├───────────────┤
│  Partition    │  -- 按时间或值分区(p202301, p202302)
├───────────────┤
│    Bucket     │  -- 哈希分桶(Bucket 1~10
├───────────────┤
│    Tablet     │  -- 分片(Tablet 1-1, 1-2, 1-3)含多个副本
└───────────────┘

总结

Apache Doris 的逻辑存储架构通过 表 → 分区 → 分桶 → 分片 → 副本 的多级分层设计,实现了数据的水平切分、高效查询和容错机制。其核心优势包括:

  • 查询优化:分区剪枝、分桶过滤、列式存储加速分析查询。
  • 弹性扩展:分片与副本机制支持动态扩容和数据均衡。
  • 高可用性:Raft 协议保障数据一致性和故障恢复。