為了降低數據存儲成本、提高查詢性能和系統資源利用率。云數據庫ClickHouse提供了冷熱數據分層存儲的功能。您可以根據查詢頻率將數據存儲在不同類型的磁盤中。本文介紹如何開啟冷熱數據分層存儲功能和設置分層存儲策略。
前提條件
云數據庫ClickHouse集群為社區兼容版且版本為20.8及以上版本。
集群未開通數據備份功能。
對于不支持的低版本,可以先將數據遷移至20.8及以上版本的集群,再進行冷熱數據分層存儲。具體請參見云數據庫ClickHouse集群間的數據遷移。
云數據庫ClickHouse企業版基于緩存及共享存儲,自動進行冷熱分層。不依賴冷熱數據存儲規則。
背景知識
熱數據:訪問頻次較高的數據,存儲在熱數據盤(即創建集群時所選的ESSD云盤或高效云盤)中,滿足高性能訪問的需求。
冷數據:訪問頻次較低的數據,存儲在較低價的冷數據盤中,滿足高性價比的存儲需求。
冷熱數據分層存儲提供了兩種存儲策略,具體如下:
存儲策略
詳情
默認存儲策略
將新寫入的數據存儲在熱數據盤中,提供高效查詢。當熱數據存儲量達到業務使用閾值時,自動將當前熱數據盤中占用空間最大的part數據文件移動到冷數據盤存儲,從而釋放熱數據盤存儲空間。
TTL存儲策略
在默認存儲策略基礎上,添加TTL語句,實現將間隔時間之前的所有數據自動轉移到冷數據盤中。
注意事項
開通冷熱數據分層存儲功能,請在業務低峰期進行。開通該功能后集群會立即進行重啟,重啟期間只能查看集群信息,無法進行升配、擴容、縮容、修改參數配置等操作。
使用冷熱數據分層存儲功能時,需要給表指定存儲策略。
建表時,通過
SETTINGS storage_policy = 'hot_to_cold'
指定存儲策略。修改存量表的存儲策略。
2024年1月1日之后開通冷熱存儲策略的集群
執行以下語句進行策略修改。
ALTER TABLE <table_name> MODIFY SETTING storage_policy = 'hot_to_cold';
2024年1月1日之前開通冷熱存儲策略的集群
通過管控運維操作,新增冷熱存儲策略,讓您能夠使用新策略將熱盤數據遷移到冷盤。
冷熱數據分層存儲功能開通后,暫不支持關閉。
計費說明
計費規則如下。
存儲類型
計費詳情
熱數據存儲
購買集群后已經擁有了熱數據存儲空間,與購買集群的存儲空間相同。
冷數據存儲
采用按量付費模式。無需提前購買固定的存儲空間,先使用,后付費,并按照實際使用的存儲空間每小時計費一次。
冷數據存儲的詳細單價,請參見社區兼容版存儲空間費用。
計費公式:冷存儲空間費用=冷數據存儲單價×冷數據存儲使用量×使用時長。
示例:若冷數據存儲單價為0.0002元/GB/小時,19:00-20:00使用冷數據存儲2000 GB,則總費用為:0.0002元/GB/小時×2000 GB×1小時=0.4元。20:00-21:00釋放了500 GB冷數據存儲空間,實際使用了1500 GB存儲空間,那么20:00-21:00的總費用為:0.0002元/GB/小時×1500 GB×1小時=0.3元。
本示例中的價格僅用于舉例,實際價格以控制臺為準。
開通冷熱分層存儲
在頁面左上角,選擇集群所在的地域。
在集群列表頁面,選擇社區版實例列表,單擊目標集群ID。
單擊左側導航欄的冷熱分層存儲。
單擊開通冷熱分層存儲。
在彈出的冷熱數據分層開啟提示窗口,單擊確定。
確定開通后,集群會進行重啟。待集群狀態從配置變更中變為運行中,即完成開通。
冷熱分層默認存儲策略
冷熱分層存儲功能開通后,默認存儲策略的相關參數如下表所示。
參數 | 說明 |
move_factor | 當熱數據盤中的可用存儲空間所占比例小于該參數時,自動將當前熱數據盤中占用空間最大的part數據文件移動到冷數據盤存儲。 取值范圍為 說明 如何查看磁盤空間,請參見查看磁盤空間。 |
prefer_not_to_merge | 冷數據盤中的數據是否進行合并。取值范圍如下。
|
建表時設置TTL分層存儲策略
在默認存儲策略的基礎上,添加TTL語句,實現將間隔時間之前的所有數據自動轉移到冷數據盤中。
語法
TTL <time_column> + INTERVAL <number> TO DISK 'cold_disk'
示例
以date列為依據,將90天之前的所有數據移動到冷數據盤。建表語句如下。
CREATE TABLE ttl_test_tbl
(
`f1` String,
`f2` String,
`f3` Int64,
`f4` Float64,
`date` Date
)
ENGINE = MergeTree()
PARTITION BY date
ORDER BY f1
TTL date + INTERVAL 90 DAY TO DISK 'cold_disk'
SETTINGS storage_policy = 'hot_to_cold';
更改TTL分層存儲策略
您可以更改TTL分層存儲策略的日期或日期類型的列以及間隔的時間。
注意事項
數據影響。
存量數據:默認情況下,存量數據將按照新策略進行存儲,但需要時間異步處理,如需立即生效,您需更改TTL分層存儲策略之后,還要執行
ALTER TABLE materialize TTL;
語句。如果您不期望更改存量數據的TTL分層存儲策略,需要在更改TTL分層存儲策略之前,執行SET materialize_ttl_after_modify=0;
語句。增量數據:默認情況下,增量數據也將按照新策略進行存儲。
更改TTL分層存儲策略后,已經進入冷數據盤中的數據不會自動移動到熱數據盤。如果需要移動,請參見移動冷熱數據盤的數據。
語法
ALTER TABLE <table_name> ON CLUSTER default MODIFY TTL <time_column> + INTERVAL <number> TO DISK 'cold_disk';
參數說明
參數 | 說明 |
table_name | 表名。 |
time_column | 目標日期或日期類型的列。 |
number | 間隔時間。 常用單位有:Day、Week、Month、Year。 |
移動冷熱數據盤的數據
移動熱數據盤數據到冷數據盤。
ALTER TABLE <table_name> ON CLUSTER default MOVE PARTITION <partition> TO DISK 'cold_disk';
移動冷數據盤數據到熱數據盤。
ALTER TABLE <table_name> ON CLUSTER default MOVE PARTITION <partition> TO DISK 'default';
說明partition
為分區名稱,您可以在system.parts系統表中查看。
查看冷熱數據盤上的數據
查看熱數據盤上的數據。
SELECT * FROM system.parts WHERE database = '<db_name>' AND TABLE = '<tbl_name>' AND disk_name ='default' AND active = 1;
查看冷數據盤上的數據。
SELECT * FROM system.parts WHERE database = '<db_name>' AND TABLE = '<tbl_name>' AND disk_name ='cold_disk' AND active = 1;
查看磁盤空間
開通冷熱數據分層存儲功能后,您可以執行如下語句查看磁盤空間。
SELECT * FROM system.disks;
返回結果如下。
┌─name─────┬─────────path───────────────────────────┬─free_space───────────┬─total_space ─────────┬─used_space───┬─keep_free_space───┬──type──┐
│ cold_disk│ /clickhouse/data/data/disks/cold_disk/ │ 18446744073709551615 │ 18446744073709551615 │ 115312080698 │ 0 │ OSS │
│ default │ /clickhouse/data/data/ │ 201663209472 │ 207083249664 │ 5420040192 │ 0 │ local │
└──────────┴────────────────────────────────────────┴──────────────────────┴──────────────────────┴──────────────┴───────────────────┴────────┘
結果集列名說明如下。
參數 | 說明 |
name | 磁盤名稱。
|
path | 磁盤上的數據存儲路徑。 |
free_space | 當前磁盤剩余可用空間。冷數據盤可用空間不受限制。單位:Byte。 |
total_space | 當前磁盤總空間。冷數據盤可用空間不受限制。單位:Byte。 |
used_space | 當前磁盤已經被使用的空間。單位:Byte。 |
keep_free_space | 預留的空閑空間。單位:Byte。 |
type | 存儲介質。取值如下。
|
常見問題
Q:數據尚未從熱數據盤存儲至冷數據盤的原因是什么?
A:數據是否遷至冷數據盤,取決于system.parts表中move_ttl_info.min
和move_ttl_info.max
的值大小。您可以使用以下語句獲取二者的值。
SELECT move_ttl_info.min,move_ttl_info.max FROM system.parts WHERE database = '<db_name>'AND table = '<tb_name>'AND disk_name = 'default'
如果查詢結果中,任意一個值未超過當前時間,則該部分數據不應被移動到冷存。也有可能是系統正在進行或準備將該數據移動至冷數據盤的操作,但操作尚未處理完畢。