跳转到主要内容

结构概述

Databend 是一个开源、弹性、负载感知的现代云数仓库。

Databend 使用最新向量化查询技术,允许您在对象存储中使用快速数据分析方法(S3, Azure BlobMinIO)。

  • 即时弹性

    Databend 将存储与计算机完全分离,可以根据您的应用程序的需要轻松扩展。

  • 性能强劲

    Databend 利用数据平行(Vectorized Query Execution) 和指令平行技术(SIMD),提供令人惊喜的数据分析能力。

  • 支持半结构化数据

    Databend 支持导入各种格式的半结构化数据,例如 CSV、JSON 和 Parquet,这些数据可存放在云端或您的本地文件系统中; Databend 还支持半结构化数据类型:ARRAY、MAP、JSON,便于半结构化导入和操作。

  • 兼容 MySQL/ClickHouse

    Databend 兼容 ANSI SQL 和 MySQL/ClickHouse 协议,方便连接到现有的工具(MySQL 客户端, ClickHouse 客户端, Vector, DBeaver, Jupyter, JDBC等。

  • 简单易用

    不需要手动调整。 您不需要手动索引、分区或管理共享数据。 一旦您将数据加载到表中,其他琐碎的事情都由 Databend 自动处理。

设计概览

这是 Databend 整体架构设计。 它由三个部分组成:

  • Meta 业务层
  • 计算层
  • 存储层

Databend 架构

Meta 业务层

Databend Meta 是服务多个租户的业务。 实现一个持久的密钥值存储来存储每个租户的状态。 在目前的实现中,Databend Meta 业务集群有许多节点组成部分:

  • Databend Meta 用于管理数据库、表格、集群、交易等所有元数据等。
  • 储存用户信息、用户管理、访问控制信息、使用情况统计等,用于管理行为需要信息。
  • 安全性,执行授权和身份验证,以保护用户数据的隐私。

Meta 业务层 的代码主要位于资源库的 Metasrv 目录。

计算层

计算层是用于查询处理的计算层。 计算层可能由许多集群组成,每个集群可能由许多节点组成。 每个节点是一个计算单位,是一个组件库:

  • Planner

    Planner 根据用户的 SQL 语句使用不同类型的关系运算符构建执行计划,例如 ProjectionFilterLimit, 等。

    例如:

    databend :) EXPLAIN SELECT avg(number) FROM numbers(100000) GROUP BY number % 3
    ┌─explain─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
    │ Projection: avg(number):Float64 │
    │ AggregatorFinal: groupBy=[[(number % 3)]], aggr=[[avg(number)]] │
    │ AggregatorPartial: groupBy=[[(number % 3)]], aggr=[[avg(number)]] │
    │ Expression: (number % 3):UInt8, number:UInt64 (Before GroupBy) │
    │ ReadDataSource: scan schema: [number:UInt64], statistics: [read_rows: 100000, read_bytes: 800000, partitions_scanned: 11, partitions_total: 11], push_downs: [projections: [0]] │
    └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
  • 优化器

    一个基于规则的优化器,一些规则,例如基于请求裁剪没有访问到的列等。

  • 处理器

    基于 Pull&Push 的查询执行管道,由 planner 指令构建。 每个管道执行器是一个处理器(如SourceTransform、FilterTransform等),它有零个或多个输入和零个或多个输出,并连接成一个管道,它也可以根据你的查询工作量分布在多个节点上。

    例如:

    databend :) EXPLAIN PIPELINE SELECT avg(number) FROM numbers(100000) GROUP BY number % 3
    ┌─explain────────────────────────────────────────────────────────────────────────────────┐
    │ ProjectionTransform × 16 processors │
    │ Mixed (GroupByFinalTransform × 1 processor) to (ProjectionTransform × 16 processors) │
    │ GroupByFinalTransform × 1 processor │
    │ Merge (GroupByPartialTransform × 16 processors) to (GroupByFinalTransform × 1) │
    │ GroupByPartialTransform × 16 processors │
    │ ExpressionTransform × 16 processors │
    │ SourceTransform × 16 processors │
    └────────────────────────────────────────────────────────────────────────────────────────┘

节点是计算层中最小的单位。 一组节点可以通过命名空间注册为一个集群。 许多集群可以附加相同的数据库,这样它们就可以由不同的用户并行地为查询服务。 当您将新节点添加到集群时,当前正在运行的计算任务可以得到扩展(称为工作窃取)保证。

计算层代码主要在 query 目录。

存储层

Databend 将数据以高效率的列格式存储为 Parquet 文件。 每个parquet 文件由主键排序,然后写入基础共享存储。 为了高效访问,Databend 还为每个parquet文件创建索引:

  • min_max.idx 索引文件存储这个parquet 文件的最小值和最大值。
  • sparse.idx 索引文件存储每 [N] 条记录的粒度的 “key, parquet-page” 映射。

使用索引,我们可以通过降低 I/O 和 CPU 成本来加快查询速度。 假如Parquet 文件 f1 有 min_max. dx [3, 5],Parquet 文件 f2 有 min_max. dx[4, (6) 列中 x。如果查询条件是 WHERE x < 4,则仅需要访问 f1 文件即可。

入门指南

社区

Roadmap

授权

Databend 由 Apache 2.0 授权。

鸣谢