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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2023/11/23 数据库 41 coder
生活随笔 收集整理的這篇文章主要介紹了 聊聊分布式 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)節點:

  1. 分區鍵(Partition Key): 在 Doris 中,表的分區是按照某一列的值范圍進行劃分的,這個列通常被稱為分區鍵。用戶在創建表時可以選擇分區鍵。

  2. 查詢請求中的分區鍵值: 當查詢請求到達 Doris 時,請求中通常包含了要查詢的分區鍵值。

  3. 分區鍵值與分區映射關系: Doris 通過分區鍵值與分區的映射關系,確定具體的分區。這個映射關系通常存儲在系統的元數據中,其中包括每個分區所在的 BE 節點信息。

  4. BE 節點負責的分區: 根據分區鍵值的映射關系,Doris 確定了負責該分區的 BE 節點。

  5. 查詢計劃的生成和執行: Doris 生成查詢計劃,其中包含了具體的查詢操作。該計劃會被發送到負責該分區的 BE 節點上執行。

在 Apache Doris 中,一個表的多個分區數據通常會存儲在不同的 Backend(BE)節點上,以實現分布式存儲和查詢的優勢。每個分區的數據都會被劃分并存儲在負責該分區的一個 BE 節點上。具體來說:

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

  2. 分布式存儲: Doris 的設計目標之一是分布式存儲和查詢。因此,一個表的多個分區數據會被分布存儲在不同的 BE 節點上。這樣的設計有助于提高系統的橫向擴展性,允許系統有效地處理大規模數據和高并發的查詢請求。

  3. 負責分區的 BE 節點: Doris 通過元數據信息記錄每個分區所在的 BE 節點。當執行查詢請求時,Doris 會根據查詢涉及的分區,確定負責這些分區的 BE 節點。每個 BE 節點負責存儲和管理分配給它的分區數據。

  4. 分布式計算: 查詢請求在涉及多個分區時,Doris 可以通過分布式計算的方式,在多個 BE 節點上并行執行查詢計劃,以提高查詢性能。

分桶算法

暫時只支持HASH.

分區算法

暫時只支持List, RANGE. 常用的有四種: (a) Round-Robin、(b) Range、(c) List、(d) Hash .

詳細內容閱讀: Apache Doris 分區分桶新功能 與 數據劃分. 在此基礎上做總結與延伸.

參考:
Doris數據分布

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。