Hologres從V1.3.37版本開始支援冷熱資料階層式存放區,協助客戶科學管理資料分層。本文為您詳細介紹資料階層式存放區的使用方式。
功能介紹
Hologres的資料存放區類型分為標準儲存、低頻訪問儲存。
標準儲存即全SSD熱儲存,是Hologres的預設儲存,滿足低延時、高效能訪問資料需求,對於大多數使用情境而言,標準儲存是最有效且最具成本效益的選擇,文中簡稱為熱存。
低頻訪問儲存即全HDD冷存,滿足低頻訪問資料的低成本儲存需求,適用於對延遲不敏感或不常訪問的超大型資料集,文中簡稱為冷存。
對於主從執行個體,建議升級到V1.3.55及以上版本開啟冷存。
同時也支援表層級的冷熱資料分層,可以使用Hologres提供的CREATE PARTITION TABLE功能動態設定分區子表的儲存介質。
Hologres從 V2.1版本開始支援基於SSD的緩衝加速,協助您提高冷存訪問速度,當前僅支援預設分配的緩衝空間。緩衝加速預設開啟,預計訪問效能會提高一倍以上。
前提條件
僅HologresV1.3.37及以上版本支援資料冷熱階層式存放區,如果您的執行個體低於該版本,請您使用自助升級或加入HologresDingTalk交流群反饋,詳情請參見如何擷取更多的線上支援?。
對於低版本的訂用帳戶的執行個體,升級到V1.3.37版本後,執行個體的低頻訪問儲存的配額預設是0GB。
注意事項
Hologres表的儲存分為Data和Meta兩部分,Data為使用者的資料,Meta為表的一些中繼資料資訊。在冷熱階層式存放區中,使用者只能設定表的Data部分儲存的儲存介質。出於效能考慮Meta只能儲存在熱儲存,因此即使將表的儲存原則設定為冷儲存,也會佔用少量熱儲存介質,因此會產生少量的熱儲存費用。
為了不影響使用者服務,冷熱搬遷的任務優先順序較低,即使用者修改表Data的儲存策略後,不是立即生效,Hologres會在後台非同步進行資料冷熱搬遷,搬遷時間預設為當天晚上0點,從V2.2版本開始支援自訂搬遷時間,詳情請參見動態分區管理。
向冷存表新寫資料時,資料會先寫到熱儲存,背景工作會非同步搬遷至冷儲存,因此會產生一定的熱儲存費用。
由於磁碟尋道時間的限制,不推薦使用冷存表支撐點查情境(例如Flink維度資料表,Serving情境等)。冷存表支援的每秒讀取行數比熱存表低2個數量級。
不推薦將行存表的儲存策略設為冷儲存介質。
批量進行冷熱資料轉換過程中會開啟所有表的
tablet
,導致記憶體佔用增加,建議一次性轉換的表數量不超過200張。
建立冷熱分層表
在執行建表時,您可以通過設定SET_TABLE_PROPERTY中的storage_mode
參數來指定表的資料存放區策略。詳情請參見CREATE TABLE。
非分區表
指定非分區表的儲存策略
如果是非分區表,可以通過SET_TABLE_PROPERTY
來設定表的儲存策略。支援的選項有:
hot(熱儲存)。
cold(冷儲存)。
例如將tbl1設定為使用冷存儲存,代碼如下:
-- 建表時指定儲存策略為冷儲存
BEGIN;
CREATE TABLE tbl1 (
"id" int NOT NULL,
"name" text NOT NULL
);
CALL set_table_property('tbl1', 'storage_mode', 'cold');
COMMIT;
修改非分區表的儲存介質
Hologres支援建表後修改儲存介質。例如將表tbl1的儲存介質改為熱存儲存,系統會非同步將資料搬遷到熱存儲存。樣本如下:
-- 建表後修改儲存介質為熱儲存
CALL set_table_property('tbl1', 'storage_mode', 'hot');
分區表
建立分區表的儲存策略
分區表也可以通過SET_TABLE_PROPERTY
來設定表的儲存策略,分區子表預設繼承父表的儲存屬性,也可以分別設定父表和子表的儲存策略。支援的選項有:
hot(熱儲存)。
cold(冷儲存)。
例如將分區父表(tbl2)設定為使用冷存儲存,之後該分區父表(tbl2)對應的分區子表(tbl2_v1)都會使用冷存進行資料存放區,代碼如下:
-- 建表時指定儲存策略為冷儲存
BEGIN;
CREATE TABLE tbl2(
c1 text NOT NULL,
c2 text
)
PARTITION BY LIST(c2);
CALL set_table_property('tbl2', 'storage_mode', 'cold');
CREATE TABLE tbl2_v1 PARTITION OF tbl2 FOR VALUES IN ('v1');
COMMIT;
修改分區表的儲存
Hologres支援在建表後修改儲存介質。例如將分區父表tbl2的儲存介質改為熱存儲存,系統會將該分區父表對應所有分區子表的資料都非同步搬遷到熱存儲存。樣本如下:
-- 建表後修改儲存策略為熱儲存介質
CALL set_table_property('tbl2', 'storage_mode', 'hot');
如果您需要單獨設定某個分區子表使用冷存儲存,則需要修改該分區子表的storage_mode
屬性。樣本如下:
-- 建立多個分區子表
CREATE TABLE tbl2_v2 PARTITION OF tbl2 FOR VALUES IN ('v2');
CREATE TABLE tbl2_v3 PARTITION OF tbl2 FOR VALUES IN ('v3');
-- 查詢表屬性,當前預設繼承父表的熱存屬性
SELECT * FROM hg_table_storage_status('public', 'tbl2');
-- 修改分區子表為冷存儲存
CALL set_table_property('tbl2_v3', 'storage_mode', 'cold');
動態管理分區表的儲存介質
為了更智能的管理表分區的儲存介質,可以使用動態資料分割函數來設定資料冷熱轉換規則,實現智能冷熱階層式存放區,有效平衡成本和效能。更多對於動態管理分區表的資訊,詳情請參見動態分區管理。
查詢儲存介質狀態
可以通過調用hg_table_storage_status
函數,查詢表的儲存狀態。hg_table_storage_status
僅顯示資料存放區大小,不包含Meta儲存大小。使用方法如下:
SELECT * FROM hg_table_storage_status('<schema_name>', '<table_name>');
參數 | 描述 |
| 表的Schema名 |
| 表名 |
返回結果如下:
列名 | 內容 |
table_name |
|
hot_size | 熱儲存的大小,單位Byte |
cold_size | 冷儲存的大小,單位Byte |
status | 狀態:
|
樣本如下:
-- 非分區父表
SELECT * FROM hg_table_storage_status('public', 'tbl1');--返回單位是Byte
table_name | hot_size | cold_size | status
------------+----------+---------------+--------
tbl1 | 145643 | 3685 | transferring
-- 分區父表
SELECT * FROM hg_table_storage_status('public', 'tbl2');--返回單位是Byte
table_name | hot_size | cold_size | status
-----------------+----------+-----------+--------
tbl2_2022062222 | 0 | 0 | hot
tbl2_2022062221 | 1125 | 0 | hot
tbl2_2022062220 | 1245 | 0 | hot
tbl2_2022062219 | 1358 | 0 | hot
tbl2_2022062218 | 0 | 1875 | cold
tbl2_2022062217 | 0 | 1143 | cold
tbl2_2022062216 | 0 | 1299 | cold
查詢表訪問頻率
Hologres從V1.3.37版本開始提供日誌系統資料表hologres.hg_table_info
來按日收集執行個體內表的統計資訊,協助您對執行個體中的表資訊進行查看、分析,以針對性的做最佳化,詳情請參見表統計資訊查看與分析,我們可以通過查詢該表擷取冷熱資料的儲存量、表資料的訪問頻次、分區資料訪問頻次,以此來判斷是否需要做冷熱資料轉換,詳細查詢語句如下:
非分區表
SELECT a.table_name,
(a.total_read_count - b.total_read_count) AS read_count,
(a.total_write_count - b.total_write_count) AS write_count,
a.hot_storage_size
FROM (SELECT * FROM hologres.hg_table_info
WHERE type='TABLE' AND collect_time::DATE = CURRENT_DATE - interval '1 day') a
JOIN
(SELECT * FROM hologres.hg_table_info
WHERE type='TABLE' AND collect_time::DATE = CURRENT_DATE - interval '${days} day') b
ON a.table_name = b.table_name
ORDER BY hot_storage_size DESC;
分區表
查詢所有分區:
SELECT parent_table_name,count(*) AS partition_cnt,
sum(hot_storage_size)/1024/1024/1024 AS hot_size_gb
FROM hologres.hg_table_info
WHERE type = 'PARTITION' AND collect_time::DATE = CURRENT_DATE - interval '1 day'
GROUP BY parent_table_name
ORDER BY hot_size_gb DESC;
查詢特定分區訪問頻次:
SELECT a.table_name,
(a.total_read_count - b.total_read_count) as read_count,
(a.total_write_count - b.total_write_count) as write_count,
a.hot_storage_size
FROM (SELECT * FROM hologres.hg_table_info
WHERE type = 'PARTITION'
AND parent_table_name = '${p_table_name}'
AND collect_time::DATE = CURRENT_DATE - interval '1 day') a
JOIN
(SELECT * FROM hologres.hg_table_info
WHERE type = 'PARTITION'
AND parent_table_name = '${p_table_name}'
AND collect_time::DATE = CURRENT_DATE - interval '${days} day') b
ON a.table_name = b.table_name
ORDER BY table_name DESC;