结构概述
Databend 是一个开源、弹性、负载感知的现代云数仓库。
Databend 使用最新向量化查询技术,允许您在对象存储中使用快速数据分析方法(S3, Azure Blob 或 MinIO)。
即时弹性
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 业务层
计算层
存储层
Meta 业务层
Databend Meta 是服务多个租户的业务。 实现一个持久的密钥值存储来存储每个租户的状态。 在目前的实现中,Databend Meta 业务集群有许多节点组成部分:
- Databend Meta 用于管理数据库、表格、集群、交易等所有元数据等。
- 储存用户信息、用户管理、访问控制信息、使用情况统计等,用于管理行为需要信息。
- 安全性,执行授权和身份验证,以保护用户数据的隐私。
Meta 业务层
的代码主要位于资源库的 Metasrv
目录。
计算层
计算层是用于查询处理的计算层。 计算层可能由许多集群组成,每个集群可能由许多节点组成。 每个节点是一个计算单位,是一个组件库:
Planner
Planner 根据用户的 SQL 语句使用不同类型的关系运算符构建执行计划,例如
Projection
、Filter
、Limit
, 等。例如:
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 授权。
鸣谢
- Databend 受 ClickHouse 和 Snowflake 的启发,其计算模型基于 apache-arrow。
- 文档网站由 Vercel 提供支持。