天天看點

StarRocks應用優化實踐

作者:閃念基因

一、背景

StarRocks(以下簡稱SR)是新一代極速全場景 MPP 資料庫,可以滿足多種分析需求,包括 OLAP 多元分析、定制報表、實時資料分析;伴随公司 WOS 更新戰略,BI 在 WOS 系統中的選型 SR 作為資料分析層資料庫;SR 應用實踐過程中随遷移 WOS 的商戶越來越來多,SR 内資料随之增大,逐漸暴露出來一些記憶體不足問題,主要為以下問題造成:

    1. 主鍵模型表常駐記憶體持續增大,最高占用可用記憶體的16%。
    2. tablet過多,270張表160W+個tablets,小于100M的約占90%。
StarRocks應用優化實踐

二、問題分析

2.1 第一個問題主鍵模型常駐記憶體較大,查詢官方對主鍵模型的介紹。

    • 主鍵模型适用于主鍵占用空間相對可控的場景。主鍵模型會将主鍵索引加載至記憶體中,是以相對于其他模型,主鍵模型對記憶體的要求比較高
    • 主鍵模型資料有冷熱特征:即最近幾天的熱資料才經常被修改,老的冷資料很少被修改。例如,MySQL 訂單表實時同步到 SR 中提供分析查詢。其中,資料按天分區,對訂單的修改集中在最近幾天新建立的訂單,老的訂單完成後就不再更新,是以導入時其主鍵索引就不會加載,也就不會占用記憶體,記憶體中僅會加載最近幾天的索引。

經查詢分析庫中主鍵模型主要應用在實時分析中,實時分析主要為當天資料,資料量不會太大,根據官方描述主鍵模型資料有冷熱特征,對實時分析 DB 的表進行Show data 查詢:發現三張表資料量總量為 17GB 左右,查詢三張表的 DDL 發現三張表均未分區,是以三張表的資料會全部加載到記憶體,最終造成了主鍵模型常駐記憶體較大。

StarRocks應用優化實踐

2.2、Tablet過多,且單個 Ttablet 資料量較小

官方對 Tablet 定義:在同⼀分區内,分桶鍵哈希值相同的資料形成 Tablet,Tablet 以多副本備援的形式存儲,是資料均衡和恢複的最⼩機關。Tablet 的副本由⼀個單獨的本地存儲引擎管理,資料導⼊和查詢最終都下沉到所涉及的 Tablet 副本上。

官方建議:單個分區原始資料量建議不要超過 100 GB,每個 Tablet 資料檔案大小在 100 MB 至 1 GB 左右。

執行如下語句:

SHOW DATA;           

SHOW DATA; 分析庫中表,存在以下問題:

    1. 大部分表是按日分區,3個副本,3個分桶;目前一些表資料量很小,但是ReplicaCount(分片數)很多,算下來每個分片資料量很少。
    2. 以某一表 ads_xxxx_d 為例,ReplicaCount=BUCKETS 3 * replication_num = 3 * dd(2019-12-20 到 2022-07-08)分區數量=5598 個tablet,算下來每個 Tablet 資料量 17Kb 左右,與官方建議相差巨大,Tablet 過多浪費大量中繼資料。
    3. 目前我們大部分使用更新模型,Tablet 過多,多次導入資料,資料版本較多,compaction 速度較慢,導緻表的存儲量大于實際存儲量很多。

三、優化方案

3.1、第一個問題主鍵模型常駐記憶體較大

優化方案:3張表修改為分區表,且增加分區生命周期,隻保持近10天資料。

優化執行步驟如下:

--第一步停止實時任務
--第二步建立bak表
CREATE TABLE realtime_sr_db.`ads_xxx_d_bak` (
  `id` bigint(20) NOT NULL COMMENT "id",
  `dd` date NOT NULL COMMENT "日期",
) ENGINE=OLAP
PRIMARY KEY(`id`,`dd`)
COMMENT "實時xxx明細"
PARTITION BY RANGE(`dd`)
( START ('2022-07-12') END ('2022-08-25') EVERY (INTERVAL 1 DAY) )
DISTRIBUTED BY HASH(`id`) BUCKETS 3
PROPERTIES (
"replication_num" = "3",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "day",
"dynamic_partition.time_zone" = "Asia/Shanghai",
"dynamic_partition.start" = "-10",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "3",
"in_memory" = "false",
"storage_format" = "DEFAULT"
);


--第三步遷移資料
INSERT INTO realtime_sr_db.ads_xxx_d_bak SELECT * FROM realtime_sr_db.ads_xxx_d where topicdate>'2022-08-08';
 
--第四步更換表名稱
ALTER TABLE ads_xxx_d RENAME ads_xxx_d_bak_1;
ALTER TABLE ads_xxx_d_bak RENAME ads_xxx_d;


--第五步删除表
DROP TABLE ads_xxx_d_bak_1;


--第六步 開啟實時任務           

3.2、第二個問題:tablet過多,且單個tablet資料量較小

優化方案:梳理出 132 張需要治理的表,分三批進行優化,第一批治理資料量小于1GB 的 53 張表,第二批治理資料量小于 20G 的表,第三批治理 20G 以上的表;對每一批表分别進行評估,根據資料量将分區修改為按周、按月、按年分區。

評估規則:

1、檢視分區資料占用詳情

執行如下語句,檢視 ads_xxx_dwm 表中分區情況:

SHOW PARTITIONS FROM ads_xxx_dwm;           

根據分區詳情資料,該表目前是按天分區,每分區當資料極小分桶後,每個桶資料量遠遠小于官方建議的100M。

StarRocks應用優化實踐

2、分區合并規則

根據分區資料量判斷,例如下圖 DDL 内,2021 年之前的曆史資料量,按年分區,才會滿足 Tablet 大于 100MB 的條件,是以可以把 2021 年之前的資料按年分區;2021-01-01 到 2022-06-01 期間的資料按照月分區滿足 tablet 大于 100MB 的條件,可以将這部分資料按照月分區;以此類推,WEEK,DAY 分區時間段都可按照資料量判斷。

StarRocks應用優化實踐

優化執行步驟如下:

--第一步建立新結構bak表
CREATE TABLE `ads_xxx_d_bak` (
   `id` bigint(20) NULL COMMENT "ID",
  `dd` date NULL COMMENT "資料日期",
  ) ENGINE=OLAP
UNIQUE KEY(`id`,  `dd`)
COMMENT "xxx"
PARTITION BY RANGE(`dd`)
( START ('2021-01-01') END ('2023-01-01') EVERY (INTERVAL 1 YEAR),
  START ('2023-01-01') END ('2023-02-01') EVERY (INTERVAL 1 MONTH)
)
DISTRIBUTED BY HASH(`id` ) BUCKETS 3
PROPERTIES (
"replication_num" = "3",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.time_zone" = "Asia/Shanghai",
"dynamic_partition.start" = "-2147483648",
"dynamic_partition.end" = "1",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "3",
"in_memory" = "false",
"storage_format" = "DEFAULT"
);


--第二步遷移資料到bak表
INSERT INTO tmp.ads_xxx_d_bak SELECT * FROM tmp.ads_xxx_d;


--第三步更換表名稱
ALTER TABLE ads_xxx_d RENAME ads_xxx_d_bak_1;
ALTER TABLE ads_xxx_d_bak RENAME ads_xxx_d;


--第四步删除表
DROP TABLE ads_xxx_d_bak_1;           

四、優化效果對比

4.1、主鍵模型優化後:

每台 BE 平均占用記憶體由 7G 下降為 1G 左右,相比之前平均每台下降了 6G,下降了85%。

4.2、Tablet過多優化:

經過三輪分區合并,Tablet 數量由治理前的 160W+下降為 30W+,大約下降了81%,BE meta Men記憶體由原來的平均每台 10.9GB 降為平均每台 8.9GB,下降18.34% 左右。

StarRocks應用優化實踐

優化後FE及BE記憶體變化:

FE jvm heap:

FE 的 JVM 堆使用情況,之前最高為 18G,優化後峰值在 4G。

StarRocks應用優化實踐

BE Mem :BE的使用記憶體使用情況,叢集層面,常駐記憶體下降55g。

StarRocks應用優化實踐

優化結論總結:

經過4輪優化,BE 的使用記憶體叢集層面,常駐記憶體下降 55GB,FE 節點 JVM 堆記憶體占用下降了77.77%,Tablet 數量大約下降了 81%,叢集健康度有所提高。

作者:蔣賽

來源:微信公衆号:微盟技術中心

出處:https://mp.weixin.qq.com/s/RH5g8rXeWEg9JbXiD_9Jkg

繼續閱讀