Hologres從V1.3.37版本開始支持冷熱數據分層存儲,幫助客戶科學管理數據分層。本文為您詳細介紹數據分層存儲的使用方式。
功能介紹
Hologres的數據存儲類型分為標準存儲、低頻訪問存儲。
標準存儲即全SSD熱存儲,是Hologres的默認存儲,滿足低延時、高性能訪問數據需求,對于大多數使用場景而言,標準存儲是最有效且最具成本效益的選擇,文中簡稱為熱存。
低頻訪問存儲即全HDD冷存,滿足低頻訪問數據的低成本存儲需求,適用于對延遲不敏感或不常訪問的超大型數據集,文中簡稱為冷存。
對于主從實例,建議升級到V1.3.55及以上版本開啟冷存。
同時也支持表級別的冷熱數據分層,可以使用Hologres提供的CREATE PARTITION TABLE功能動態的設置分區子表的存儲介質。
Hologres從 V2.1版本開始支持基于SSD的緩存加速,幫助您提高冷存訪問速度,當前僅支持默認分配的緩存空間。緩存加速默認開啟,預計訪問性能會提高一倍以上。
前提條件
僅HologresV1.3.37及以上版本支持數據冷熱分層存儲,如果您的實例低于該版本,請您使用自助升級或加入Hologres釘釘交流群反饋,詳情請參見如何獲取更多的在線支持?。
對于低版本的包年包月的實例,升級到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;