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 .