數(shù)據(jù)分層存儲(chǔ)
Hologres從V1.3.37版本開始支持冷熱數(shù)據(jù)分層存儲(chǔ),幫助客戶科學(xué)管理數(shù)據(jù)分層。本文為您詳細(xì)介紹數(shù)據(jù)分層存儲(chǔ)的使用方式。
功能介紹
Hologres的數(shù)據(jù)存儲(chǔ)類型分為標(biāo)準(zhǔn)存儲(chǔ)、低頻訪問存儲(chǔ)。
標(biāo)準(zhǔn)存儲(chǔ)即全SSD熱存儲(chǔ),是Hologres的默認(rèn)存儲(chǔ),滿足低延時(shí)、高性能訪問數(shù)據(jù)需求,對(duì)于大多數(shù)使用場(chǎng)景而言,標(biāo)準(zhǔn)存儲(chǔ)是最有效且最具成本效益的選擇,文中簡(jiǎn)稱為熱存。
低頻訪問存儲(chǔ)即全HDD冷存,滿足低頻訪問數(shù)據(jù)的低成本存儲(chǔ)需求,適用于對(duì)延遲不敏感或不常訪問的超大型數(shù)據(jù)集,文中簡(jiǎn)稱為冷存。
對(duì)于主從實(shí)例,建議升級(jí)到V1.3.55及以上版本開啟冷存。
同時(shí)也支持表級(jí)別的冷熱數(shù)據(jù)分層,可以使用Hologres提供的CREATE PARTITION TABLE功能動(dòng)態(tài)的設(shè)置分區(qū)子表的存儲(chǔ)介質(zhì)。
Hologres從 V2.1版本開始支持基于SSD的緩存加速,幫助您提高冷存訪問速度,當(dāng)前僅支持默認(rèn)分配的緩存空間。緩存加速默認(rèn)開啟,預(yù)計(jì)訪問性能會(huì)提高一倍以上。
前提條件
僅HologresV1.3.37及以上版本支持?jǐn)?shù)據(jù)冷熱分層存儲(chǔ),如果您的實(shí)例低于該版本,請(qǐng)您使用自助升級(jí)或加入Hologres釘釘交流群反饋,詳情請(qǐng)參見如何獲取更多的在線支持?。
對(duì)于低版本的包年包月的實(shí)例,升級(jí)到V1.3.37版本后,實(shí)例的低頻訪問存儲(chǔ)的配額默認(rèn)是0GB。
注意事項(xiàng)
Hologres表的存儲(chǔ)分為Data和Meta兩部分,Data為用戶的數(shù)據(jù),Meta為表的一些元數(shù)據(jù)信息。在冷熱分層存儲(chǔ)中,用戶只能設(shè)置表的Data部分存儲(chǔ)的存儲(chǔ)介質(zhì)。出于性能考慮Meta只能存儲(chǔ)在熱存儲(chǔ),因此即使將表的存儲(chǔ)策略設(shè)置為冷存儲(chǔ),也會(huì)占用少量熱存儲(chǔ)介質(zhì),因此會(huì)產(chǎn)生少量的熱存儲(chǔ)費(fèi)用。
為了不影響用戶服務(wù),冷熱搬遷的任務(wù)優(yōu)先級(jí)較低,即用戶修改表Data的存儲(chǔ)策略后,不是立即生效,Hologres會(huì)在后臺(tái)異步進(jìn)行數(shù)據(jù)冷熱搬遷,搬遷時(shí)間默認(rèn)為當(dāng)天晚上0點(diǎn),從V2.2版本開始支持自定義搬遷時(shí)間,詳情請(qǐng)參見動(dòng)態(tài)分區(qū)管理。
向冷存表新寫數(shù)據(jù)時(shí),數(shù)據(jù)會(huì)先寫到熱存儲(chǔ),后臺(tái)任務(wù)會(huì)異步的搬遷至冷存儲(chǔ),因此會(huì)產(chǎn)生一定的熱存儲(chǔ)費(fèi)用。
由于磁盤尋道時(shí)間的限制,不推薦使用冷存表支撐點(diǎn)查場(chǎng)景(例如Flink維度表,Serving場(chǎng)景等)。冷存表支持的每秒讀取行數(shù)比熱存表低2個(gè)數(shù)量級(jí)。
不推薦將行存表的存儲(chǔ)策略設(shè)為冷存儲(chǔ)介質(zhì)。
批量進(jìn)行冷熱數(shù)據(jù)轉(zhuǎn)換過程中會(huì)打開所有表的
tablet
,導(dǎo)致內(nèi)存占用增加,建議一次性轉(zhuǎn)換的表數(shù)量不超過200張。
創(chuàng)建冷熱分層表
在執(zhí)行建表時(shí),您可以通過設(shè)置SET_TABLE_PROPERTY中的storage_mode
參數(shù)來(lái)指定表的數(shù)據(jù)存儲(chǔ)策略。詳情請(qǐng)參見CREATE TABLE。
非分區(qū)表
指定非分區(qū)表的存儲(chǔ)策略
如果是非分區(qū)表,可以通過SET_TABLE_PROPERTY
來(lái)設(shè)置表的存儲(chǔ)策略。支持的選項(xiàng)有:
hot(熱存儲(chǔ))。
cold(冷存儲(chǔ))。
例如將tbl1設(shè)置為使用冷存存儲(chǔ),代碼如下:
-- 建表時(shí)指定存儲(chǔ)策略為冷存儲(chǔ)
BEGIN;
CREATE TABLE tbl1 (
"id" int NOT NULL,
"name" text NOT NULL
);
CALL set_table_property('tbl1', 'storage_mode', 'cold');
COMMIT;
修改非分區(qū)表的存儲(chǔ)介質(zhì)
Hologres支持建表后修改存儲(chǔ)介質(zhì)。例如將表tbl1的存儲(chǔ)介質(zhì)改為熱存存儲(chǔ),系統(tǒng)會(huì)異步的將數(shù)據(jù)搬遷到熱存存儲(chǔ)。示例如下:
-- 建表后修改存儲(chǔ)介質(zhì)為熱存儲(chǔ)
CALL set_table_property('tbl1', 'storage_mode', 'hot');
分區(qū)表
創(chuàng)建分區(qū)表的存儲(chǔ)策略
分區(qū)表也可以通過SET_TABLE_PROPERTY
來(lái)設(shè)置表的存儲(chǔ)策略,分區(qū)子表默認(rèn)繼承父表的存儲(chǔ)屬性,也可以分別設(shè)置父表和子表的存儲(chǔ)策略。支持的選項(xiàng)有:
hot(熱存儲(chǔ))。
cold(冷存儲(chǔ))。
例如將分區(qū)父表(tbl2)設(shè)置為使用冷存存儲(chǔ),之后該分區(qū)父表(tbl2)對(duì)應(yīng)的分區(qū)子表(tbl2_v1)都會(huì)使用冷存進(jìn)行數(shù)據(jù)存儲(chǔ),代碼如下:
-- 建表時(shí)指定存儲(chǔ)策略為冷存儲(chǔ)
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;
修改分區(qū)表的存儲(chǔ)
Hologres支持在建表后修改存儲(chǔ)介質(zhì)。例如將分區(qū)父表tbl2的存儲(chǔ)介質(zhì)改為熱存存儲(chǔ),系統(tǒng)會(huì)將該分區(qū)父表對(duì)應(yīng)所有分區(qū)子表的數(shù)據(jù)都異步的搬遷到熱存存儲(chǔ)。示例如下:
-- 建表后修改存儲(chǔ)策略為熱存儲(chǔ)介質(zhì)
CALL set_table_property('tbl2', 'storage_mode', 'hot');
如果您需要單獨(dú)設(shè)置某個(gè)分區(qū)子表使用冷存存儲(chǔ),則需要修改該分區(qū)子表的storage_mode
屬性。示例如下:
-- 創(chuàng)建多個(gè)分區(qū)子表
CREATE TABLE tbl2_v2 PARTITION OF tbl2 FOR VALUES IN ('v2');
CREATE TABLE tbl2_v3 PARTITION OF tbl2 FOR VALUES IN ('v3');
-- 查詢表屬性,當(dāng)前默認(rèn)繼承父表的熱存屬性
SELECT * FROM hg_table_storage_status('public', 'tbl2');
-- 修改分區(qū)子表為冷存存儲(chǔ)
CALL set_table_property('tbl2_v3', 'storage_mode', 'cold');
動(dòng)態(tài)管理分區(qū)表的存儲(chǔ)介質(zhì)
為了更智能的管理表分區(qū)的存儲(chǔ)介質(zhì),可以使用動(dòng)態(tài)分區(qū)功能來(lái)設(shè)置數(shù)據(jù)冷熱轉(zhuǎn)換規(guī)則,實(shí)現(xiàn)智能冷熱分層存儲(chǔ),有效的平衡成本和性能。更多對(duì)于動(dòng)態(tài)管理分區(qū)表的信息,詳情請(qǐng)參見動(dòng)態(tài)分區(qū)管理。
查詢存儲(chǔ)介質(zhì)狀態(tài)
可以通過調(diào)用hg_table_storage_status
函數(shù),查詢表的存儲(chǔ)狀態(tài)。hg_table_storage_status
僅顯示數(shù)據(jù)存儲(chǔ)大小,不包含Meta存儲(chǔ)大小。使用方法如下:
SELECT * FROM hg_table_storage_status('<schema_name>', '<table_name>');
參數(shù) | 描述 |
| 表的Schema名 |
| 表名 |
返回結(jié)果如下:
列名 | 內(nèi)容 |
table_name |
|
hot_size | 熱存儲(chǔ)的大小,單位Byte |
cold_size | 冷存儲(chǔ)的大小,單位Byte |
status | 狀態(tài):
|
示例如下:
-- 非分區(qū)父表
SELECT * FROM hg_table_storage_status('public', 'tbl1');--返回單位是Byte
table_name | hot_size | cold_size | status
------------+----------+---------------+--------
tbl1 | 145643 | 3685 | transferring
-- 分區(qū)父表
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版本開始提供日志系統(tǒng)表hologres.hg_table_info
來(lái)按日收集實(shí)例內(nèi)表的統(tǒng)計(jì)信息,幫助您對(duì)實(shí)例中的表信息進(jìn)行查看、分析,以針對(duì)性的做優(yōu)化,詳情請(qǐng)參見表統(tǒng)計(jì)信息查看與分析,我們可以通過查詢?cè)摫慝@取冷熱數(shù)據(jù)的存儲(chǔ)量、表數(shù)據(jù)的訪問頻次、分區(qū)數(shù)據(jù)訪問頻次,以此來(lái)判斷是否需要做冷熱數(shù)據(jù)轉(zhuǎn)換,詳細(xì)查詢語(yǔ)句如下:
非分區(qū)表
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;
分區(qū)表
查詢所有分區(qū):
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;
查詢特定分區(qū)訪問頻次:
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;