聊聊分布式 SQL 数据库Doris(三)
在 Doris 的存儲引擎規則:
- 表的數據是以分區為單位存儲的,不指定分區創建時,默認就一個分區.
- 用戶數據首先被劃分成若干個分區(Partition),劃分的規則通常是按照用戶指定的分區列進行范圍劃分,比如按時間劃分。
- 在每個分區內,數據被進一步的按照Hash的方式分桶,分桶的規則是要找用戶指定的分桶列的值進行Hash后分桶。每個分桶就是一個數據分片(Tablet),也是數據劃分的最小邏輯單元。
- Partition 可以視為是邏輯上最小的管理單元。數據的導入與刪除,都可以或僅能針對一個 Partition 進行。
- Tablet直接的數據是沒有交集的,獨立存儲的。Tablet也是數據移動、復制等操作的最小物理存儲單元。
Table (邏輯描述) -- > Partition(分區:管理單元) --> Bucket(分桶:存儲,每個分桶就是一個數據分片:Tablet,數據劃分的最小邏輯單元。稱為子表) ,如下圖:
語法與示例
語法:
-- 該表記錄了某個時間點,在某個站點上各個用戶的pv數據
CREATE TABLE demo.test_tbl(
sdate DATE, -- 日期
site INT, -- 站點id
city VARCHAR(64), -- 城市
user VARCHAR(32) DEFAULT '', -- 用戶名
pv BIGINT -- pv量
) ENGINE=olap DUPLICATE KEY(sdate, site, city)
[PARTITION_DESC]
[BUCKET_DESC]
PROPERTIES ("replication_num" = "1");
[PARTITION_DESC] 表示創建分區的詳細語句,[BUCKET_DESC] 表示創建分桶的語句.
動態分區:
PARTITION BY RANGE(sdate)()
-- 剩余參數需要在PARTITION進行配置:
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.create_history_partition"="true",
"replication_num" = "1"
);
分桶:
DISTRIBUTED BY HASH(site) BUCKETS 20
此時指定以 site 列的哈希值作為分桶,并且分桶個數設置為 20 個.
官方示例:
CREATE TABLE tbl1
(
k1 DATE,
-- ...
)
PARTITION BY RANGE(k1) ()
DISTRIBUTED BY HASH(k1)
PROPERTIES
(
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-7",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "32"
);
批量分區與自動分桶
批量分區使得用戶能夠批量操作表的分區結構,一次性創建多個分區,而不是逐個單獨創建。
-- 當然,分區創建個數受到max_multi_partition_num參數控制,該值默認為4096,有需求可以修改
PARTITION BY RANGE(sdate)
(
FROM ("2013-01-01") TO ("2023-01-01") INTERVAL 1 DAY
)
-- 從這個 case 來看,批量分區功能的語法更為簡潔,但該功能的易用性和靈活性遠不止于此。
自動分桶是基于表中某個列(或在創建表時指定咧)的值范圍進行的。系統會根據該列的數據分布情況,將數據劃分到不同的數據桶中。
-- 舊版本指定分桶個數的創建語法
DISTRIBUTED BY HASH(site) BUCKETS 20
-- 新版本使用自動分桶推算的創建語法
DISTRIBUTED BY HASH(site) BUCKETS AUTO
properties("estimate_partition_size" = "100G")
底層邏輯
查詢路由
一個分區的數據不會跨多個不同的BE節點存儲.
在 Apache Doris 中,當請求到來時,查詢某個分區的數據時,Doris 使用以下的過程來定位到相應的 Backend(BE)節點:
-
分區鍵(Partition Key): 在 Doris 中,表的分區是按照某一列的值范圍進行劃分的,這個列通常被稱為分區鍵。用戶在創建表時可以選擇分區鍵。
-
查詢請求中的分區鍵值: 當查詢請求到達 Doris 時,請求中通常包含了要查詢的分區鍵值。
-
分區鍵值與分區映射關系: Doris 通過分區鍵值與分區的映射關系,確定具體的分區。這個映射關系通常存儲在系統的元數據中,其中包括每個分區所在的 BE 節點信息。
-
BE 節點負責的分區: 根據分區鍵值的映射關系,Doris 確定了負責該分區的 BE 節點。
-
查詢計劃的生成和執行: Doris 生成查詢計劃,其中包含了具體的查詢操作。該計劃會被發送到負責該分區的 BE 節點上執行。
在 Apache Doris 中,一個表的多個分區數據通常會存儲在不同的 Backend(BE)節點上,以實現分布式存儲和查詢的優勢。每個分區的數據都會被劃分并存儲在負責該分區的一個 BE 節點上。具體來說:
-
表的分區: Doris 中的表通常根據某一列的值范圍進行分區。每個分區是表的邏輯組織單元,用于提高查詢性能、管理數據、支持按范圍刪除等操作。
-
分布式存儲: Doris 的設計目標之一是分布式存儲和查詢。因此,一個表的多個分區數據會被分布存儲在不同的 BE 節點上。這樣的設計有助于提高系統的橫向擴展性,允許系統有效地處理大規模數據和高并發的查詢請求。
-
負責分區的 BE 節點: Doris 通過元數據信息記錄每個分區所在的 BE 節點。當執行查詢請求時,Doris 會根據查詢涉及的分區,確定負責這些分區的 BE 節點。每個 BE 節點負責存儲和管理分配給它的分區數據。
-
分布式計算: 查詢請求在涉及多個分區時,Doris 可以通過分布式計算的方式,在多個 BE 節點上并行執行查詢計劃,以提高查詢性能。
分桶算法
暫時只支持HASH.
分區算法
暫時只支持List, RANGE. 常用的有四種: (a) Round-Robin、(b) Range、(c) List、(d) Hash .
詳細內容閱讀: Apache Doris 分區分桶新功能 與 數據劃分. 在此基礎上做總結與延伸.
參考:
Doris數據分布
總結
以上是生活随笔為你收集整理的聊聊分布式 SQL 数据库Doris(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星Galaxy Z Fold 2折叠屏
- 下一篇: 三五瓶下一句是什么啊?