Lindorm寬表引擎支援按自訂時間列歸檔冷熱資料。購買容量型雲端儲存後,您可以指定表或二級索引中的某個時間列作為冷熱分離的依據,將資料分別儲存於不同的介質中,有效提升熱資料查詢效率,降低冷資料存放區成本。本文介紹按自訂時間列冷熱分離的具體操作步驟及相關注意事項。
前提條件
已開通冷儲存功能。如何開通,請參見容量型雲端儲存。
已通過Lindorm-cli串連寬表引擎。如何串連,請參見通過Lindorm-cli串連並使用寬表引擎。
表或列簇的儲存屬性STORAGE_POLICY不能為
COLD
(即需要開啟冷熱分離的表不能是冷存表)。如何修改儲存屬性,請參見配置冷儲存。
注意事項
僅支援Lindorm SQL,不支援HBase相容使用方式。
當自訂時間列中的值越過設定的冷熱分界線後,整行資料會被歸檔至冷儲存中。
自訂時間列的設定需遵循以下規則:
自訂時間列必須為主鍵。
自訂時間列不能作為主鍵第一列。
自訂時間列僅支援BIGINT和TIMESTAMP類型。如果指定列不存在、資料沒有寫入或寫入的資料類型不正確,資料則無法冷熱分離,將被全部寫入熱儲存。
操作步驟
設定表的冷熱分界線
設定自訂時間列及冷熱分界線。
方法一:建表時設定。
建立表dt,設定冷熱分離時間點為一天,按p2列冷熱分離。
CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar, constraint pk primary key(p1, p2, p3)) WITH(COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=p2');
參數說明
CHS:冷熱分離時間點,單位為秒(s)。例如CHS為86400,代表自訂時間列的時間戳記取值在86400秒(一天)前的資料會被自動歸檔到冷儲存。
COMPRESSION:壓縮演算法。整張表生效。演算法名稱大小寫不敏感。預設配置為none。
CHS_L2:配置第二層屬性,一般配置儲存屬性:
storagetype=COLD
。CHS_COLUMN:自訂時間列。
方法二:建表時未開啟冷熱分離,通過
ALTER TABLE
語句添加相關屬性。-- 已有資料表、建表時未開啟冷熱分離,例如: -- CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar, constraint pk primary key(p1, p2, p3)); -- 為表dt開啟按自訂欄冷熱分離,設定冷熱分離時間點為一天,按p2列冷熱分離 ALTER TABLE dt SET 'CHS' ='86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN' = 'COLUMN=p2';
可選:修改表的冷熱分界線和自訂時間列。
修改冷熱分界線。
ALTER TABLE dt SET 'CHS'='1000';
修改自訂時間列。
ALTER TABLE dt SET 'CHS_COLUMN'='COLUMN=p3';
可選:取消表的冷熱分離。
ALTER TABLE dt SET 'CHS'='', 'CHS_L2' = '', 'CHS_COLUMN'='';
說明修改冷熱分界線或取消冷熱分離後,需要等待系統後台執行完
compaction
,資料才能從冷儲存回到熱儲存中。如果需要資料立即回到熱儲存,請手動執行major_compact命令。
設定二級索引的冷熱分界線
二級索引預設儲存在一張表中,因此,二級索引可以像表一樣進行冷熱分離。
以上文建立的表dt為例,為表dt建立二級索引。
建立二級索引並開啟冷熱分離。
方法一:建立二級索引時設定自訂時間列及冷熱分界線。
CREATE INDEX idx on dt (c1) WITH(CHS = '86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN='COLUMN=p2');
說明二級索引無法指定自訂時間列,CHS_COLUMN必須設定為主表的自訂時間列。
方法二:建立二級索引時未設定,通過
ALTER TABLE
設定自訂時間列及冷熱分界線。-- 已有二級索引、建立二級索引時未開啟冷熱分離,例如: -- CREATE INDEX idx on dt (c1); -- 為二級索引表開啟冷熱分離,設定冷熱分離時間點為一天,按p2列冷熱分離 ALTER TABLE `dt.idx` SET 'CHS' = '86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN'='COLUMN=p2';
可選:修改二級索引的冷熱分界線和自訂時間列。
修改冷熱分界線。
ALTER TABLE `dt.idx` SET 'CHS'='10000';
修改自訂時間列。
ALTER TABLE `dt.idx` SET 'CHS_COLUMN'='COLUMN=p2';
說明二級索引表的表名格式為
表名+點號(.)+二級索引名
。由於二級索引表名中有特殊符號,使用時必須在表名前後添加反引號(`)進行轉義。例如,原表名為test.idx
,轉義後的表名為`test.idx`
。可選:取消二級索引的冷熱分離。
ALTER TABLE `dt.idx` SET 'CHS'='', 'CHS_L2' = '', 'CHS_COLUMN'='';
資料寫入
冷熱分離的表與普通表的資料寫入方式完全一致,資料會先儲存在熱儲存(標準型/效能型)中。隨著時間的推移,如果一行資料滿足目前時間-時間列值>CHS設定的值
條件,則會在執行compaction
時被歸檔到冷儲存中。
資料查詢
由於冷熱資料都在同一張表中,因此使用者所有的查詢操作都只需在一張表內進行。在查詢時,建議通過自訂時間列來限定資料查詢的時間範圍,系統將會根據指定的時間範圍決定查詢模式,即僅查詢熱儲存區、僅查詢冷儲存區或同時查詢冷儲存區和熱儲存區。如果查詢時未限定時間範圍,則會導致查詢命中冷資料,進而使得查詢吞吐受到冷儲存的限制。詳細內容,請參見容量型雲端儲存。
如果查詢條件中無法設定自訂時間列,也可以使用HINT設定_l_hot_only_參數的屬性來避免查詢冷資料。
查詢樣本
隨機查詢Get
-- p2為自訂時間列 SELECT * FROM dt WHERE p1 = 10 AND p2 = 10;
範圍查詢Scan
-- p2為自訂時間列 SELECT * FROM dt WHERE p2 > 10 AND p2 < 1000;
重要當執行SELECT語句被識別為低效查詢時,寬表引擎預設不允許執行該類查詢,同時會拋出異常。詳細介紹及解決方案,請參見SELECT。
通過HINT僅查詢熱資料
SELECT /*+ _l_hot_only_(true) */ * FROM dt WHERE p1>1;
最佳實務
在車連網情境中,一般將表的主鍵設計為vin(車架號)和時間戳記列
,並將時間戳記列定義為冷熱分離的自訂時間列。在查詢一輛車某段時間內的資料時,系統可以根據查詢條件定位到是否需要查詢冷資料,或是否僅查詢熱資料。
USE test;
CREATE TABLE dt (
vin varchar, ts bigint, c1 varchar, c2 varchar, constraint pk primary key(vin, ts)) WITH
(COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=ts'); // 時間列必須是主鍵
-- 查詢某輛車一段時間的資料
SELECT * FROM dt WHERE vin='xxxx' AND ts > 1675065122000 AND ts < 1675975222000;
常見問題
Q:如果更新了原有的冷資料,更新後的資料還是冷資料嗎?
A:如果更新的冷資料不是自訂時間列,那麼更新後的資料依舊是冷資料;如果更新的是自訂時間列中的資料,則需要根據新寫入的時間內容來重新劃分冷熱資料。假設一個表的主鍵列為p1,p2, 非主鍵列為c1,c2,某一行為p1=row1, p2=2023.1.28日, c1=”c1“, c2=”c2“,冷熱分界線CHS=1天,目前時間為2023.1.30日,此時這一行為冷資料。如果更新這一行中的c1,c2列的值,那麼這一行仍然為冷資料;如果將這一行中p2的值更新為2023.1.30日,那麼這一行將變為熱資料,直到2023年2月1日(2天后),才會重新變為冷資料。
說明已設定為主鍵的自訂時間列中的值無法更新。
Q:如果在一行資料中未寫入自訂時間列,那麼這一行資料還會冷熱分離嗎?
A:不會。自訂時間列是系統對資料冷熱分離儲存的依據。如果一行資料未寫入時間,那麼這行資料會被保留在熱儲存區。