跳到主要内容

Fuse 引擎工作原理

Fuse 引擎

Fuse 引擎 (Fuse Engine) 是 Databend 的核心存储引擎,专为在云对象存储上高效管理PB 级数据而优化。默认情况下,在 Databend 中创建的表会自动使用此引擎(ENGINE=FUSE)。受 Git 启发,其基于快照的设计支持强大的数据版本控制(如时间回溯 (Time Travel)),并通过先进的剪枝和索引技术提供高查询性能

本文档解释其核心概念和工作原理。

核心概念

Fuse 引擎使用三个核心结构组织数据,类似 Git 的工作方式:

  • 快照 (Snapshot,类似 Git 提交): 不可变的引用,通过指向特定段 (Segment) 定义表在某个时间点的状态。支持时间回溯 (Time Travel)。
  • 段 (Segment,类似 Git 树): 块 (Block) 的集合,包含用于快速数据跳过(剪枝)的汇总统计信息。可在快照间共享。
  • 块 (Block,类似 Git 对象): 不可变的数据文件(Parquet 格式),存储实际行数据及详细的列级统计信息,用于细粒度剪枝。
                         Table HEAD


┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ SEGMENT A │◄────│ SNAPSHOT 2 │────►│ SEGMENT B │
│ │ │ Previous: │ │ │
└───────┬───────┘ │ SNAPSHOT 1 │ └───────┬───────┘
│ └───────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ SNAPSHOT 1 │ │
│ │ │ │
│ └───────────────┘ │
│ │
▼ ▼
┌───────────────┐ ┌───────────────┐
│ BLOCK 1 │ │ BLOCK 2 │
│ (cloud.txt) │ │(warehouse.txt)│
└───────────────┘ └───────────────┘

写入工作原理

向表添加数据时,Fuse 引擎会创建对象链。以下逐步说明该过程:

步骤 1:创建表

CREATE TABLE git(file VARCHAR, content VARCHAR);

此时表已存在但不含数据:

(空表,无数据)

步骤 2:插入第一条数据

INSERT INTO git VALUES('cloud.txt', '2022/05/06, Databend, Cloud');

首次插入后,Fuse 引擎创建初始快照、段和块:

         Table HEAD


┌───────────────┐
│ SNAPSHOT 1 │
│ │
└───────┬───────┘


┌───────────────┐
│ SEGMENT A │
│ │
└───────┬───────┘


┌───────────────┐
│ BLOCK 1 │
│ (cloud.txt) │
└───────────────┘

步骤 3:插入更多数据

INSERT INTO git VALUES('warehouse.txt', '2022/05/07, Databend, Warehouse');

插入新数据时,Fuse 引擎创建引用原始段和新段的新快照:

                         Table HEAD


┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ SEGMENT A │◄────│ SNAPSHOT 2 │────►│ SEGMENT B │
│ │ │ Previous: │ │ │
└───────┬───────┘ │ SNAPSHOT 1 │ └───────┬───────┘
│ └───────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ SNAPSHOT 1 │ │
│ │ │ │
│ └───────────────┘ │
│ │
▼ ▼
┌───────────────┐ ┌───────────────┐
│ BLOCK 1 │ │ BLOCK 2 │
│ (cloud.txt) │ │(warehouse.txt)│
└───────────────┘ └───────────────┘

读取工作原理

查询数据时,Fuse 引擎通过智能剪枝高效定位数据:

Query: SELECT * FROM git WHERE file = 'cloud.txt';

Table HEAD


┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ SEGMENT A │◄────│ SNAPSHOT 2 │────►│ SEGMENT B │
│ CHECK │ │ │ │ CHECK │
└───────┬───────┘ └───────────────┘ └───────────────┘
│ ✗
│ (跳过 - 不包含
│ 'cloud.txt')

┌───────────────┐
│ BLOCK 1 │
│ CHECK │
└───────┬───────┘

│ ✓ (包含 'cloud.txt')

Read this block

智能剪枝过程

┌─────────────────────────────────────────┐
│ Query: WHERE file = 'cloud.txt' │
└─────────────────┬───────────────────────┘


┌─────────────────────────────────────────┐
│ Check SEGMENT A │
│ Min file value: 'cloud.txt' │
│ Max file value: 'cloud.txt' │
│ │
│ Result: ✓ Might contain 'cloud.txt' │
└─────────────────┬───────────────────────┘


┌─────────────────────────────────────────┐
│ Check SEGMENT B │
│ Min file value: 'warehouse.txt' │
│ Max file value: 'warehouse.txt' │
│ │
│ Result: ✗ Cannot contain 'cloud.txt' │
└─────────────────┬───────────────────────┘


┌─────────────────────────────────────────┐
│ Check BLOCK 1 in SEGMENT A │
│ Min file value: 'cloud.txt' │
│ Max file value: 'cloud.txt' │
│ │
│ Result: ✓ Contains 'cloud.txt' │
└─────────────────┬───────────────────────┘


┌─────────────────────────────────────────┐
│ Read only BLOCK 1 │
└─────────────────────────────────────────┘

基于快照的功能

Fuse 引擎的快照架构支持以下强大数据管理能力:

时间回溯 (Time Travel)

查询任意时间点的历史数据状态。支持数据分支、标记和治理,提供完整审计追踪与错误恢复。

零拷贝模式演进

修改表结构(添加/删除列、重命名、更改类型)无需重写底层数据文件

  • 变更仅为元数据操作,记录于新快照中
  • 操作瞬时完成,无需停机,避免高成本数据迁移
  • 旧数据仍可通过原始模式访问

查询加速的高级索引 (Fuse Engine)

除基础块/段剪枝外,Fuse 引擎提供专用二级索引加速特定查询模式:

索引类型简要描述加速查询类型...示例查询片段
聚合索引 (Aggregate Index)为指定分组预计算聚合结果加速 COUNT/SUM/AVG + GROUP BYSELECT COUNT(*)... GROUP BY city
全文索引 (Full-Text Index)支持文本关键词快速检索的倒排索引MATCH 文本搜索(如日志分析)WHERE MATCH(log_entry, 'error')
JSON 索引 (JSON Index)索引 JSON 文档内特定路径/键值基于 JSON 路径/值的过滤WHERE event_data:user.id = 123
布隆过滤器索引 (Bloom Filter Index)概率性检查快速跳过不匹配块点查询 (=) 和 IN 列表过滤WHERE user_id = 'xyz'

对比:Databend Fuse 引擎 vs. Apache Iceberg

注意: 此对比聚焦表格式功能。作为 Databend 原生表格式,Fuse 持续演进以提升可用性与性能。所示功能为当前版本,未来可能变更。

功能Apache IcebergDatabend Fuse 引擎
元数据结构清单列表 → 清单文件 → 数据文件快照 (Snapshot) → 段 (Segment) → 块 (Block)
统计级别文件级(含分区)多级(快照/段/块)→ 更精细剪枝
剪枝能力良好(文件/分区统计)优秀(多级统计 + 二级索引)
模式演进支持(元数据变更)零拷贝(仅元数据,瞬时生效)
数据聚簇写入时排序自动优化(后台执行)
流式支持基础流式摄取高级增量处理(插入/更新追踪)