Databend 设计概述

2023-11-16

Databend 是一个开源的、完全面向云架构的新式数仓,它提供快速的弹性扩展能力,并结合云的弹性、简单性和低成本,使 Data Cloud 构建变得更加容易。

Databend 把数据存储在像 AWS S3 ,Azure Blob 这些云上的存储系统,可以使不同的计算节点挂载同一份数据,从而做到较高的弹性,实现对资源的精细化控制。

Databend 在设计上专注以下能力:

  • 弹性 在 Databend 中,存储和计算资源可以按需、按量弹性扩展。
  • 安全 Databend 中数据文件和网络传输都是端到端加密,并在 SQL 级别提供基于角色的权限控制。
  • 易用 Databend 兼容 ANSI SQL,并可以使用 MySQL 和 ClickHouse 客户端接入,几乎无学习成本。
  • 成本 Databend 处理查询非常高效,用户只需要为使用的资源付费。

Databend 受 ClickHouse 启发,计算模型基于 apache-arrow,开发语言 Rust, Databend 的整体架构图如下
Databend 的整体架构图

整个系统主要由三大部分组成:Meta service layer、Compute Layer 和 Storage Layer。

1、Meta Service Layer

  • Meta Service 是一个多租户、高可用的分布式 key-value 存储服务,具备事务能力,主要用于存储:
  • Metadata : 表的元信息、索引信息、集群信息、事务信息等。
  • Administration:用户系统、用户权限等信息。
  • Security :用户登录认证、数据加密等。

2、Compute Layer 计算层

计算层由多个集群(cluster)组成,不同集群可以承担不同的工作负载,每个集群又有多个计算节点(node)组成,你可以轻松的添加、删除节点或集群,做到资源的按需、按量管理。

计算节点是计算层的最小构成单元,其中每个计算节点包含以下几个组件: 执行计划 (Planner) 根据用户输入的 SQL 生成执行计划,它只是个逻辑表达,并不能真正的执行,而是用于指导整个计算流水线(Pipeline)的编排与生成。

1) 比如语句

SELECT number + 1 FROM numbers_mt(10) WHERE number > 8 LIMIT 2; 

执行计划

databend :) EXPLAIN SELECT number + 1 FROM numbers_mt(10) WHERE number > 8 LIMIT 2
┌─explain────────────────────────────────────────────────────────────────────────────────────────────┐
│ Limit: 2                                                                                                                │
│   Projection: (number + 1):UInt64                                                                                       │
│     Expression: (number + 1):UInt64 (Before Projection)                                                                 │
│       Filter: (number > 8)                                                                                              │
│         ReadDataSource: scan partitions: [1], scan schema: [number:UInt64], statistics: [read_rows: 10, read_bytes: 80] │
└────────────────────────────────────────────────────────────────────────────────────────────────┘

这个执行计划自下而上分别是 :

  • ReadDataSource:表示从哪些文件里读取数据
  • Filter: 表示要做 (number > 8) 表达式过滤
  • Expression: 表示要做 (number + 1) 表达式运算
  • Projection: 表示查询列是哪些
  • Limit: 表示取前 2 条数据

2) 比如语句

SELECT file FROM git_v1 WHERE file != '' LIMIT 2;

执行计划

mysql> EXPLAIN  SELECT file FROM git_v1 WHERE file != '' LIMIT 2;
+---------------------------------------------------------------------------------------------------------------------+
| explain                                                                                                                                                                                                   |
+---------------------------------------------------------------------------------------------------------------------+
| Limit: 2                                                                                                                                                                                                  |
|   Projection: file:String                                                                                                                                                                                 |
|     Filter: (file <> )                                                                                                                                                                                    |
|       ReadDataSource: scan schema: [file:String], statistics: [read_rows: 2, read_bytes: 77, partitions_scanned: 2, partitions_total: 2], push_downs: [projections: [0], filters: [(file <> )], limit: 2] |
+---------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.01 sec)
Read 0 rows, 0.00 B in 0.007 sec., 0 rows/sec., 0.00 B/sec.

这个执行计划自下而上分别是 :

  • ReadDataSource:表示从哪些文件里读取数据
  • Filter: 表示要做 (file <>) 表达式过滤
  • Projection: 表示查询列是哪些
  • Limit: 表示取前 2 条数据

2.1 优化器 (Optimizer)

对执行计划做一些基于规则的优化(A Rule Based Optimizer), 比如做一些谓词下推或是去掉一些不必要的列等,以使整个执行计划更优。

优化器比较复杂, 下期单独讲。

2.2 处理器 (Processors)

处理器(Processor)是执行计算逻辑的核心组件。根据执行计划,处理器们被编排成一个流水线(Pipeline),用于执行计算任务。 整个 Pipeline 是一个有向无环图,每个点是一个处理器,每条边由处理器的 InPort 和 OutPort 相连构成,数据到达不同的处理器进行计算后,通过边流向下一个处理器,多个处理器可以并行计算,在集群模式下还可以跨节点分布式执行,这是 Datafuse 高性能的一个重要设计。

例如,我们可以通过 EXPLAIN PIPELINE 来查看:

databend :) EXPLAIN PIPELINE SELECT number + 1 FROM numbers_mt(10000) WHERE number > 8 LIMIT 2
┌─explain───────────────────────────────────────────────────────────────┐
│ LimitTransform × 1 processor                                                                              │
│   Merge (ProjectionTransform × 16 processors) to (LimitTransform × 1)     │
│     ProjectionTransform × 16 processors                                                             │
│       ExpressionTransform × 16 processors                                                         │
│         FilterTransform × 16 processors                                                                 │
│           SourceTransform × 16 processors                                                           │
└───────────────────────────────────────────────────────────────────────┘

理解这个 Pipeline 我们自下而上来看:

  • SourceTransform:读取数据文件,16 个物理 CPU 并行处理
  • FilterTransform:对数据进行 (number > 8) 表达式过滤,16 个物理 CPU 并行处理
  • ExpressionTransform:对数据进行 (number + 1) 表达式执行,16 个物理 CPU 并行处理
  • ProjectionTransform:对数据处理生成最终列
  • LimitTransform:对数据进行 Limit 2 处理,Pipeline 进行折叠,由一个物理 CPU 来执行

Databend 通过 Pipeline 并行模型,并结合向量计算最大限度的去压榨 CPU 资源,以加速计算。

mysql> EXPLAIN PIPELINE SELECT file FROM git_v1 WHERE file != '' LIMIT 2;
+------------------------------------------------------------------------+
| explain                                                                |
+------------------------------------------------------------------------+
| LimitTransform × 1 processor                              |
|   Merge (ProjectionTransform × 2 processors) to (LimitTransform × 1)   |
|     ProjectionTransform × 2 processors                                 |
|       FilterTransform × 2 processors                                   |
|         FuseEngineSource × 2 processors                                |
+------------------------------------------------------------------------+
5 rows in set (0.01 sec)
Read 0 rows, 0.00 B in 0.001 sec., 0 rows/sec., 0.00 B/sec.

这个 Pipeline 我们自下而上来看:

  • FuseEngineSource:读取数据文件,2 个物理 CPU 并行处理
  • FilterTransform:对数据进行 (file != ‘’) 表达式过滤,2 个物理 CPU 并行处理
  • ProjectionTransform:对数据处理生成最终列
  • LimitTransform:对数据进行 Limit 2 处理,Pipeline 进行折叠,由一个物理 CPU 来执行

2.3 缓存 ( Cache )

计算节点使用本地 SSD 缓存数据和索引,以提高数据亲和性来加速计算。

缓存的预热方式有:

  • LOAD_ON_DEMAND - 按需加载索引或数据块(默认)
  • LOAD_INDEX - 只加载索引
  • LOAD_ALL - 加载全部的数据和索引,对于较小的表可以采取这种模式。

3. Storage Layer 存储层

Databend 使用 Parquet 列式存储格式来储存数据.

为了加快查找(Partition Pruning),Databend 为每个 Parquet 提供了自己的索引(根据 Primary Key 生成)
min_max.idx Parquet 文件 minimum 和 maximum 值;
sparse.idx 以 N 条记录为颗粒度的稀疏索引.

通过这些索引, 我们可以减少数据的交互,并使计算量大大减少。

假设有两个Parquet 文件:f1, f2,f1 的 min_max.idx: [3, 5] ;f2 的 min_max.idx: [4, 6] 。
如果查询条件为:where x < 4 , 我们只需要 f1 文件就可以,再根据 sparse.idx 索引定位到 f1 文件中的某个数据页。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Databend 设计概述 的相关文章

随机推荐

  • 基于 java Swing 客户端 和 Spring Boot/Spring Cloud & Alibaba 后台管理系统

    基于 java Swing 客户端 和 Spring Boot Spring Cloud Alibaba 后台管理系统 基于 java Swing 客户端 和 Spring Boot Spring Cloud Alibaba 后台管理系统
  • 【Java JDK的使用方法】

    Java JDK的使用方法 第一步 同时按住窗口键和R键 在弹出的运行框中输入cmd打开编译框 第二步 输入cd 空格 地址 可以查看桌面文本文档的属性 找到桌面地址 第三步 notepad 空格 文件名 java 新建java文件 第四步
  • 何为UNP技术?

    为了解决移动视频监控系统中的这种穿NAT型 宇视科技特意提出了UNP UniversalNetwork Passport 万能网络护照 技术 目前 针对监控系统穿越NAT设备 防火墙和安全网闸时 基本上都是使用引流方案 内部服务器 双网口方
  • C++ 调用tensorflow

    安装protobuf 3 6 安装依赖软件 sudo apt get install autoconf automake libtool curl make g unzip 克隆版本为3 6 0的protobuf源码 git clone b
  • 8.翻转子串

    题目描述 假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串 请将这个算法编写成一个函数 给定两个字符串s1和s2 请编写代码检查s2是否为s1旋转而成 要求只能调用一次检查子串的函数 给定两个字符串s1 s2 请返回bool
  • 1-如何安装ROS

    如何安装ROS 大家好 我是如何 今天尝试在Ubantu下安装ROS Robot Operating System 测试环境 虚拟机VMware Ubantu20 04 准备步骤 添加ROS软件源 sudo sh c echo deb ht
  • C++之普通成员函数、虚函数以及纯虚函数的区别与用法要点

    C 之普通成员函数 虚函数以及纯虚函数的区别与用法要点 作者 luoweifu 字体 增加 减小 类型 转载 时间 2015 07 21 我要评论 本篇文章主要介绍了C 中的普通成员函数 虚函数以及纯虚函数 非常的详细 有需要的朋友可以参考
  • localstorage在uc无痕模式失效问题;

    做项目的时候发现localstorage在uc 无痕模式下失效 但是其他浏览器不会出现此类问题 补充 我的解决方案是使用cookie代替localstorage 但是有大神给出了解决方案我觉得非常nice 附 https www jians
  • Thrift快速入门和简单示例

    文章目录 Thrift介绍 Thrift的架构 Thrift的特性 开发速度快 接口维护简单 学习成本低 多语言 跨语言支持 稳定 广泛使用 快速入门例子 编译安装 创建Thrift IDL文件 通过编译器编译user thrift文件 生
  • 马踏棋盘问题(C-数据结构)

    题目 在8 8的国际象棋棋盘中 给出马的初始位置 求出马踏遍棋盘每个位置的路线图 棋盘中每个位置只能走一次 思路 国际象棋中 马走的规则和中国象棋相似 为斜两格行走 即向任意方向走两格 再向与前面行走方向垂直的方向走一格 每个位置最多可以向
  • C语言,BMP格式解析,生成不同位深的图片。

    0 前言 目录 0 前言 1 BMP格式详解 1 1图片的构成 1 2BMP格式 1 2 1文件头 1 2 2位图信息头 1 2 3调色板 1 2 4位图数据 2 生成 3 总结 最近工作任务繁重且对我来说小有难度 但是没有困难的事情做起来
  • 《XNA游戏开发》简介

    一 XNA简介 XNA是基于DirectX的游戏开发环境 以C 为开发语言 以 NET Framework 为基础 并加入游戏应用所需之函式库所构成的 XNA Framework 可开发XNA for Windows Phone游戏 Xbo
  • html的<form>表单的基本介绍及使用说明

  • 本地、服务器文件互传命令

    1 从服务器复制文件 文件夹到本地 scp r ZSL 192 168 53 54 data ZSL json D WorkSpace PyCharm myfiel 加上r可以复制整个文件夹 不加r只能复制单个文件 2 从本地复制文件夹到服
  • protocol buffer 简单使用

    protocol buffer占用空间小 传输速率高 并且是跨平台的 每个语言都有一套解释protocol buffer的特殊方式 我就介绍一下C 如何解析protocol buffer 首先我们要自己编译Protogen 地址 如下 ht
  • Synchronized 锁升级(无锁、偏向锁、轻量级锁、重量级锁)

    一概念 是Java中一个关键字 是JVM层面提供的同步锁机制 用于保证多线程访问同一资源的可见性 互斥性 即当一个线程已经获取资源锁时 其他试图获取的线程只能等待或者阻塞在那里 访问静态 synchronized 方法占用的锁是当前类的锁
  • C++标准库学习(三)--队列和string类

    今天学习了C 的queue和string类的基本操作 queue是自带的队列 应用很是方便 要注意 pop函数并不返回pop出的值 include
  • FlowUs 使用攻略:如何快速制作 Web 应用(PWA)

    最近在寻找 Notion 的替代品过程中 我发现了 FlowUs 虽然是后起之秀 但不是唯 Notion 亦步亦趋 FLowUs 有两个很重要的特性打动了我 支持文件夹页面 一直以来 虽然 Notion 等产品十分强大 试图取代 Offic
  • powershell(二)对数据库的增删改查

    数据库配置 Database 数据库名称 数据库实例名 Server localhost SQL2008 用户名 UserName sa 密码 Password 数据库密码 连接数据库 SqlConn New Object System D
  • Databend 设计概述

    Databend 是一个开源的 完全面向云架构的新式数仓 它提供快速的弹性扩展能力 并结合云的弹性 简单性和低成本 使 Data Cloud 构建变得更加容易 Databend 把数据存储在像 AWS S3 Azure Blob 这些云上的