日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

聊聊分布式 SQL 数据库Doris(三)

發(fā)布時(shí)間:2023/11/23 数据库 38 coder
生活随笔 收集整理的這篇文章主要介紹了 聊聊分布式 SQL 数据库Doris(三) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在 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(分桶:存儲(chǔ),每個(gè)分桶就是一個(gè)數(shù)據(jù)分片:Tablet,數(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")

底層邏輯

查詢路由

一個(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):

  1. 分區(qū)鍵(Partition Key): 在 Doris 中,表的分區(qū)是按照某一列的值范圍進(jìn)行劃分的,這個(gè)列通常被稱為分區(qū)鍵。用戶在創(chuàng)建表時(shí)可以選擇分區(qū)鍵。

  2. 查詢請(qǐng)求中的分區(qū)鍵值: 當(dāng)查詢請(qǐng)求到達(dá) Doris 時(shí),請(qǐng)求中通常包含了要查詢的分區(qū)鍵值。

  3. 分區(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)信息。

  4. BE 節(jié)點(diǎn)負(fù)責(zé)的分區(qū): 根據(jù)分區(qū)鍵值的映射關(guān)系,Doris 確定了負(fù)責(zé)該分區(qū)的 BE 節(jié)點(diǎn)。

  5. 查詢計(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ō):

  1. 表的分區(qū): Doris 中的表通常根據(jù)某一列的值范圍進(jìn)行分區(qū)。每個(gè)分區(qū)是表的邏輯組織單元,用于提高查詢性能、管理數(shù)據(jù)、支持按范圍刪除等操作。

  2. 分布式存儲(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)求。

  3. 負(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ù)。

  4. 分布式計(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 .

詳細(xì)內(nèi)容閱讀: Apache Doris 分區(qū)分桶新功能 與 數(shù)據(jù)劃分. 在此基礎(chǔ)上做總結(jié)與延伸.

參考:
Doris數(shù)據(jù)分布

總結(jié)

以上是生活随笔為你收集整理的聊聊分布式 SQL 数据库Doris(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。