Databend 設計概述 | 白皮書


Databend 是一個開源的、完全面向雲架構的新式數倉,它提供快速的彈性擴展能力,並結合雲的彈性、簡單性和低成本,使 Data Cloud 構建變得更加容易。
Databend 把數據存儲在像 AWS S3 ,Azure Blob 這些雲上的存儲系統,可以使不同的計算節點掛載同一份數據,從而做到較高的彈性,實現對資源的精細化控制。
Databend 在設計上專注以下能力:

  • 彈性 在 Databend 中,存儲和計算資源可以按需、按量彈性擴展。
  • 安全 Databend 中數據文件和網絡傳輸都是端到端加密,並在 SQL 級別提供基於角色的權限控制。
  • 易用 Databend 兼容 ANSI SQL,並可以使用 MySQL 和 ClickHouse 客戶端接入,幾乎無學習成本。
  • 成本 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)的編排與生成。
比如語句

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 條數據

優化器 (Optimizer)

對執行計划做一些基於規則的優化(A Rule Based Optimizer), 比如做一些謂詞下推或是去掉一些不必要的列等,以使整個執行計划更優。

處理器 (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 並行處理
  • ilterTransform:對數據進行 (number > 8) 表達式過濾,16 個物理 CPU 並行處理
  • pressionTransform:對數據進行 (number + 1) 表達式執行,16 個物理 CPU 並行處理
  • ojectionTransform:對數據處理生成最終列
  • LimitTransform:對數據進行 Limit 2 處理,Pipeline 進行折疊,由一個物理 CPU 來執行
  • Databend 通過 Pipeline 並行模型,並結合向量計算最大限度的去壓榨 CPU 資源,以加速計算。

緩存 ( 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 文件中的某個數據頁。

項目地址

代碼地址:
https://github.com/datafuselabs/databend

項目官網:
https://datafuse.rs

想了解我們更多可以關注公眾號: Databend .


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM