在 Doris 的存儲(chǔ)引擎規(guī)則:
- 表的數(shù)據(jù)是以分區(qū)為單位存儲(chǔ)的,不指定分區(qū)創(chuàng)建時(shí),默認(rèn)就一個(gè)分區(qū).
- 用戶數(shù)據(jù)首先被劃分成若干個(gè)分區(qū)(Partition),劃分的規(guī)則通常是按照用戶指定的分區(qū)列進(jìn)行范圍劃分,比如按時(shí)間劃分。
- 在每個(gè)分區(qū)內(nèi),數(shù)據(jù)被進(jìn)一步的按照Hash的方式分桶,分桶的規(guī)則是要找用戶指定的分桶列的值進(jìn)行Hash后分桶。每個(gè)分桶就是一個(gè)數(shù)據(jù)分片(Tablet),也是數(shù)據(jù)劃分的最小邏輯單元。
- Partition 可以視為是邏輯上最小的管理單元。數(shù)據(jù)的導(dǎo)入與刪除,都可以或僅能針對(duì)一個(gè) Partition 進(jìn)行。
- Tablet直接的數(shù)據(jù)是沒(méi)有交集的,獨(dú)立存儲(chǔ)的。Tablet也是數(shù)據(jù)移動(dòng)、復(fù)制等操作的最小物理存儲(chǔ)單元。
Table (邏輯描述) -- > Partition(分區(qū):管理單元) --> Bucket/Tablet(分桶:存儲(chǔ),每個(gè)分桶就是一個(gè)數(shù)據(jù)分片:Tablet,數(shù)據(jù)劃分的最小邏輯單元。稱(chēng)為子表) --> segment(Tablet會(huì)按照一定大?。?56M)拆分為多個(gè)segment文件) ,如下圖:
Doris的存儲(chǔ)結(jié)構(gòu)類(lèi)似LSM,從存儲(chǔ)結(jié)構(gòu)展開(kāi)來(lái)看兩者的比對(duì):
Doris MemTable --> LSM MemTable; Doris Rowset --> LSM SST;
Doris中的Segment是對(duì)Rowset文件的拆分。多個(gè)Segment組成Rowset。
Doris中的數(shù)據(jù)被組織成一個(gè)個(gè) segment,這是數(shù)據(jù)寫(xiě)入和查詢的基本單元。每個(gè) segment 包含了數(shù)據(jù)頁(yè)(page),而數(shù)據(jù)頁(yè)是數(shù)據(jù)讀取的最小單元。
語(yǔ)法與示例
語(yǔ)法:
-- 該表記錄了某個(gè)時(shí)間點(diǎn),在某個(gè)站點(diǎn)上各個(gè)用戶的pv數(shù)據(jù)
CREATE TABLE demo.test_tbl(
sdate DATE, -- 日期
site INT, -- 站點(diǎn)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] 表示創(chuàng)建分區(qū)的詳細(xì)語(yǔ)句,[BUCKET_DESC] 表示創(chuàng)建分桶的語(yǔ)句.
動(dòng)態(tài)分區(qū):
PARTITION BY RANGE(sdate)()
-- 剩余參數(shù)需要在PARTITION進(jìn)行配置:
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
此時(shí)指定以 site 列的哈希值作為分桶,并且分桶個(gè)數(shù)設(shè)置為 20 個(gè).
官方示例:
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"
);
批量分區(qū)與自動(dòng)分桶
批量分區(qū)使得用戶能夠批量操作表的分區(qū)結(jié)構(gòu),一次性創(chuàng)建多個(gè)分區(qū),而不是逐個(gè)單獨(dú)創(chuàng)建。
-- 當(dāng)然,分區(qū)創(chuàng)建個(gè)數(shù)受到max_multi_partition_num參數(shù)控制,該值默認(rèn)為4096,有需求可以修改
PARTITION BY RANGE(sdate)
(
FROM ("2013-01-01") TO ("2023-01-01") INTERVAL 1 DAY
)
-- 從這個(gè) case 來(lái)看,批量分區(qū)功能的語(yǔ)法更為簡(jiǎn)潔,但該功能的易用性和靈活性遠(yuǎn)不止于此。
自動(dòng)分桶是基于表中某個(gè)列(或在創(chuàng)建表時(shí)指定咧)的值范圍進(jìn)行的。系統(tǒng)會(huì)根據(jù)該列的數(shù)據(jù)分布情況,將數(shù)據(jù)劃分到不同的數(shù)據(jù)桶中。
-- 舊版本指定分桶個(gè)數(shù)的創(chuàng)建語(yǔ)法
DISTRIBUTED BY HASH(site) BUCKETS 20
-- 新版本使用自動(dòng)分桶推算的創(chuàng)建語(yǔ)法
DISTRIBUTED BY HASH(site) BUCKETS AUTO
properties("estimate_partition_size" = "100G")
關(guān)鍵邏輯
查詢路由
一個(gè)分區(qū)的數(shù)據(jù)不會(huì)跨多個(gè)不同的BE節(jié)點(diǎn)存儲(chǔ).
在 Apache Doris 中,當(dāng)請(qǐng)求到來(lái)時(shí),查詢某個(gè)分區(qū)的數(shù)據(jù)時(shí),Doris 使用以下的過(guò)程來(lái)定位到相應(yīng)的 Backend(BE)節(jié)點(diǎn):
-
分區(qū)鍵(Partition Key): 在 Doris 中,表的分區(qū)是按照某一列的值范圍進(jìn)行劃分的,這個(gè)列通常被稱(chēng)為分區(qū)鍵。用戶在創(chuàng)建表時(shí)可以選擇分區(qū)鍵。
-
查詢請(qǐng)求中的分區(qū)鍵值: 當(dāng)查詢請(qǐng)求到達(dá) Doris 時(shí),請(qǐng)求中通常包含了要查詢的分區(qū)鍵值。
-
分區(qū)鍵值與分區(qū)映射關(guān)系: Doris 通過(guò)分區(qū)鍵值與分區(qū)的映射關(guān)系,確定具體的分區(qū)。這個(gè)映射關(guān)系通常存儲(chǔ)在系統(tǒng)的元數(shù)據(jù)中,其中包括每個(gè)分區(qū)所在的 BE 節(jié)點(diǎn)信息。
-
BE 節(jié)點(diǎn)負(fù)責(zé)的分區(qū): 根據(jù)分區(qū)鍵值的映射關(guān)系,Doris 確定了負(fù)責(zé)該分區(qū)的 BE 節(jié)點(diǎn)。
-
查詢計(jì)劃的生成和執(zhí)行: Doris 生成查詢計(jì)劃,其中包含了具體的查詢操作。該計(jì)劃會(huì)被發(fā)送到負(fù)責(zé)該分區(qū)的 BE 節(jié)點(diǎn)上執(zhí)行。
在 Apache Doris 中,一個(gè)表的多個(gè)分區(qū)數(shù)據(jù)通常會(huì)存儲(chǔ)在不同的 Backend(BE)節(jié)點(diǎn)上,以實(shí)現(xiàn)分布式存儲(chǔ)和查詢的優(yōu)勢(shì)。每個(gè)分區(qū)的數(shù)據(jù)都會(huì)被劃分并存儲(chǔ)在負(fù)責(zé)該分區(qū)的一個(gè) BE 節(jié)點(diǎn)上。具體來(lái)說(shuō):
-
表的分區(qū): Doris 中的表通常根據(jù)某一列的值范圍進(jìn)行分區(qū)。每個(gè)分區(qū)是表的邏輯組織單元,用于提高查詢性能、管理數(shù)據(jù)、支持按范圍刪除等操作。
-
分布式存儲(chǔ): Doris 的設(shè)計(jì)目標(biāo)之一是分布式存儲(chǔ)和查詢。因此,一個(gè)表的多個(gè)分區(qū)數(shù)據(jù)會(huì)被分布存儲(chǔ)在不同的 BE 節(jié)點(diǎn)上。這樣的設(shè)計(jì)有助于提高系統(tǒng)的橫向擴(kuò)展性,允許系統(tǒng)有效地處理大規(guī)模數(shù)據(jù)和高并發(fā)的查詢請(qǐng)求。
-
負(fù)責(zé)分區(qū)的 BE 節(jié)點(diǎn): Doris 通過(guò)元數(shù)據(jù)信息記錄每個(gè)分區(qū)所在的 BE 節(jié)點(diǎn)。當(dāng)執(zhí)行查詢請(qǐng)求時(shí),Doris 會(huì)根據(jù)查詢涉及的分區(qū),確定負(fù)責(zé)這些分區(qū)的 BE 節(jié)點(diǎn)。每個(gè) BE 節(jié)點(diǎn)負(fù)責(zé)存儲(chǔ)和管理分配給它的分區(qū)數(shù)據(jù)。
-
分布式計(jì)算: 查詢請(qǐng)求在涉及多個(gè)分區(qū)時(shí),Doris 可以通過(guò)分布式計(jì)算的方式,在多個(gè) BE 節(jié)點(diǎn)上并行執(zhí)行查詢計(jì)劃,以提高查詢性能。
分桶算法
暫時(shí)只支持HASH.
分區(qū)算法
暫時(shí)只支持List, RANGE. 常用的有四種: (a) Round-Robin、(b) Range、(c) List、(d) Hash .
參考:
Doris-BE-存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)解析
Doris數(shù)據(jù)分布
Apache Doris 分區(qū)分桶新功能
數(shù)據(jù)劃分文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-746660.html
Doris全面解析: 存儲(chǔ)層設(shè)計(jì)介紹文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-746660.html
到了這里,關(guān)于聊聊分布式 SQL 數(shù)據(jù)庫(kù)Doris(三)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!