AnalyticDB for MySQL資料冷熱分離功能會將冷熱資料分別儲存在不同的介質上,在保證熱資料查詢效能的同時,降低冷資料的儲存成本。
為什麼要使用資料冷熱分離
在海量巨量資料情境下,一張業務表中可能儲存著大量的業務資料(例如日誌資料、訂單資料或監控資料)。隨著時間的推移,部分資料的訪問頻率會逐漸降低,最終被擱置。但是這部分資料依舊會佔用儲存空間,導致儲存成本增加。
AnalyticDB for MySQL資料冷熱分離主要適用於按時間日期分區的表。叢集會根據指定的熱分區數量,按照分區的大小(分區索引值的大小)降序排序,最大的N個分區為熱分區,其餘分區為冷分區。冷分區的資料會移動到成本更低的Object Storage Service服務OSS中,降低儲存成本;與此同時,熱分區的資料仍然儲存在SSD盤中,保證資料查詢的高效能。
前提條件
AnalyticDB for MySQL叢集需要同時滿足以下條件:
叢集的產品系列為企業版、基礎版、湖倉版或數倉版彈性模式。
叢集核心版本需為3.1.3.3及以上。
說明請在雲原生資料倉儲AnalyticDB MySQL控制台集群資訊頁面的配寘資訊地區,查看和升級核心版本。
費用說明
叢集在使用過程中,儲存熱資料和冷資料佔用的儲存空間會隨用隨付。計費詳情請參見產品定價。
支援使用儲存資源套件抵扣儲存空間。
冷熱儲存策略
AnalyticDB for MySQL冷熱儲存策略分為全冷儲存、全熱儲存、冷熱混合儲存。
全冷儲存指資料全部儲存在OSS中,採用同城冗餘儲存(多AZ),是一種較為經濟的儲存策略。
全熱儲存指資料全部儲存在SSD盤,滿足高效能訪問的需求,查詢效能最好,但儲存成本最高。
冷熱混合儲存指熱分區資料存放區在SSD盤,冷分區資料存放區在OSS。既保證熱分區資料的查詢效能,又節省冷分區資料的儲存成本。其原理如下:
冷熱混合儲存需指定熱分區數。假設熱分區數為N,在按照分區的大小(分區索引值的大小)降序排序後,最大的N個分區為熱分區,儲存在SSD盤,其餘分區為冷分區,儲存在OSS中,形成冷熱分區布局。冷熱分區布局不是固定不變的,當分區數量變更時,會重新調整冷熱分區布局。詳細說明,請參見分區數量變更對冷熱分區布局的影響。
分區數量變更對冷熱分區布局的影響
假設當前熱分區數為N,在有新的分區資料寫入時,冷熱儲存策略會對所有分區重新排序,超過N的舊資料會遷移到冷分區。
假設當前熱分區數為N,修改熱分區的數量為M。
當熱分區數增加,即M>N時,會從冷分區遷移
M-N個分區資料到熱分區。當熱分區數減少,即M<N時,會從熱分區遷移
N-M個分區資料到冷分區。
指定冷熱儲存策略
建立表時指定冷熱儲存策略:您可以在建表時通過
storage_policy參數來指定表的冷熱儲存策略。為已有的表指定冷熱儲存策略:您可以通過ALTER TABLE語句指定表的冷熱儲存策略。
查詢表的冷熱儲存策略
文法
查詢所有表的冷熱儲存策略:
SELECT * FROM information_schema.table_usage;查詢單個表的冷熱儲存策略:
SELECT * FROM information_schema.table_usage WHERE table_schema='<schema_name>' AND table_name='<table_name>';
傳回值說明
參數 | 說明 |
table_schema | 資料庫名。 |
table_name | 表名。 |
storage_policy | 儲存策略。取值如下:
|
hot_partition_count | 熱分區數量。 |
cold_partition_count | 冷分區數量。 |
rt_total_size | 即時資料總量(單位:Byte),是rt_data_size和rt_index_size的總和。 |
rt_data_size | 即時資料量(單位:Byte)。 |
rt_index_size | 即時資料的主鍵和索引大小(單位:Byte)。 |
hot_total_size | 熱分區總資料量(單位:Byte),是hot_data_size和hot_index_size的總和。 |
hot_data_size | 熱分區的資料量(單位:Byte)。 |
hot_index_size | 熱分區資料的主鍵和索引大小(單位:Byte)。 |
cold_total_size | 冷分區總資料量(單位:Byte),是cold_data_size和cold_index_size的總和。 |
cold_data_size | 冷分區的資料量(單位:Byte)。 |
cold_index_size | 冷分區資料的主鍵和索引大小(單位:Byte)。 |
傳回值注意事項:
受到INSERT、UPDATE、BUILD的影響,rt_total_size、rt_data_size、rt_index_size、hot_total_size、hot_data_size、hot_index_size、cold_total_size、cold_data_size、cold_index_size會即時變動。
如果在寫入資料後hot_total_size和cold_total_size都為0,則表示資料還在即時同步中。rt_total_size表示即時資料量。您可以通過BUILD語句將即時資料轉換為歷史資料,待BUILD完成後可以查到hot_total_size和cold_total_size。
由於定義的hot_partition_count是單個分區(Shard)內的熱分區數量,而table_usage表查詢到的hot_partition_count是按照Shard UNION之後的結果,在各Shard內分區資料不一致的情況下,可能會出現table_usage表中查詢到的hot_partition_count大於定義的hot_partition_count。
例如:tableA有兩個Shard(Shard1和Shard2),並且定義了hot_partition_count=2,此時Shard內的資料分布情況如下圖。
Shard1:熱分區為P4、P5,冷分區為P1、P2、P3。
Shard2:熱分區為P3、P4,冷分區為P1、P2。
最終計算的實際熱分區為(P4、P5)UNION(P3、P4)=(P3、P4、P5),因此實際hot_partition_count=3。
查詢表的冷熱儲存策略變更進度
在使用ALTER TABLE語句修改表的冷熱儲存策略後,您可以通過查詢表storage_policy_modify_progress來查看冷熱變更進度。
文法
查詢所有表的冷熱儲存策略變更進度:
SELECT * FROM information_schema.storage_policy_modify_progress;查詢單個表的冷熱儲存策略變更進度:
SELECT * FROM information_schema.storage_policy_modify_progress WHERE table_schema='<schema_name>' AND table_name='<table_name>';
傳回值說明
參數 | 說明 |
table_schema | 資料庫名。 |
table_name | 表名。 |
task_id | 執行冷熱變更任務的ID。 |
source_storage_policy | 原儲存策略。取值如下:
|
source_hot_partition_count | 原熱分區數量。 |
dest_storage_policy | 目標儲存策略。取值如下:
|
dest_hot_partition_count | 目標熱分區數量。 |
hot_to_cold_partition_count | 熱分區到冷分區變更的分區數量。 |
cold_to_hot_partition_count | 冷分區到熱分區變更的分區數量。 |
hot_to_cold_data_size | 熱分區到冷分區變更的資料量(單位:Byte)。 |
cold_to_hot_data_size | 冷分區到熱分區變更的資料量(單位:Byte)。 |
hot_data_size_before_change | 變更前熱資料量(單位:Byte)。 |
cold_data_size_before_change | 變更前冷資料量(單位:Byte)。 |
hot_data_size_after_change | 變更後熱資料量(單位:Byte)。 |
cold_data_size_after_change | 變更後冷資料量(單位:Byte)。 |
start_time | 開始變更時間。 |
update_time | 結束變更時間。 |
progress | 變更進度(單位:百分比)。 |
status | 變更狀態。取值如下:
|