數據存儲冷熱分離
云原生數據倉庫 AnalyticDB MySQL 版彈性模式集群版(新版)(3.1.3.3及以上版本)支持表或分區級別的數據存儲冷熱分離策略。
前提條件
費用說明
集群在使用過程中,存儲熱數據和冷數據占用的存儲空間會按量收費。詳情請參見數倉版計費項和數倉版產品定價。
包年包月集群可以購買存儲資源包來抵扣熱數據存儲空間和冷數據存儲空間。超出存儲資源包的部分按量付費。詳情請參見存儲資源包。
存儲策略
AnalyticDB for MySQL的數據存儲冷熱分離策略分為全冷存儲、全熱存儲、冷熱混合存儲。
全冷存儲指數據全部存儲在OSS中,是一種較為經濟的存儲策略。
說明AnalyticDB for MySQL的冷數據采用OSS本地冗余存儲(單AZ)。
全熱存儲指數據全部存儲在SSD盤,滿足高性能訪問的需求。
冷熱混合存儲指一定數量的分區存儲在SSD盤,其余數據存儲在OSS中。
指定冷熱存儲策略
在執行CREATE TABLE時,您可以通過storage_policy
參數來指定表的數據存儲冷熱分離策略。
對于已有的表,可以通過ALTER TABLE table_name storage_policy;
修改表的冷熱存儲策略。詳情請參見存儲策略。
冷熱混合存儲原理
冷熱混合存儲需要首先指定熱分區數。您可以通過hot_partition_count
參數來指定熱分區數。如何通過hot_partition_count
設置熱分區數,請參見CREATE TABLE。
假設熱分區數為N,數據存儲冷熱分離策略會按照分區的大小(指定分區列數據的數據值大小)降序排序,最大的N個分區為熱分區,存儲在SSD盤,其余分區為冷分區,存儲在OSS中,形成冷熱分區布局。
例如熱分區數為4,分區包含20201110、20201109、20201108、20201107、20201106、20201105和20201104,數據存儲冷熱分離策略會將最大的4個分區20201110、20201109、20201108和20201107指定為熱分區,剩余分區為冷分區。
冷熱分區布局不是固定不變的。以下情況會影響冷熱分區布局:
當數據有新增,修改,刪除時,會重新調整冷熱分區布局。詳細說明,請參見數據變更對冷熱分區布局的影響。
當變更熱分區數量時,會重新調整冷熱分區布局。詳細說明,請參見變更熱分區數量對冷熱分區布局的影響。
數據變更對冷熱分區布局的影響
當有新的分區數據寫入時,數據存儲冷熱分離策略會對所有分區重新排序,超過N的舊數據會遷移到冷分區。
如圖所示,當新增分區20201110之后,20201110為當前最大的分區,應該放在熱分區中,但是當前熱分區數已滿5,數據存儲冷熱分離策略會從熱分區中選一個最小的分區20201105遷移到冷分區,并把20201110放在熱分區中。
變更熱分區數量對冷熱分區布局的影響
當前熱分區數為N,修改熱分區的數量為M。
當熱分區數增加,即M>N時,會從冷分區遷移M-N個分區數據到熱分區。
如圖所示,當前熱分區數為5, 修改熱分區數為6后,數據存儲冷熱分離策略會從冷分區遷移一個最大的分區20201104到熱分區中。
當熱分區數減少,即M<N時,會從熱分區遷移N-M個分區數據到冷分區。
例如,當前熱分區數為5, 修改熱分區數為4后,數據存儲冷熱分離策略會從熱分區遷移一個最小的分區到冷分區中。
查詢數據存儲冷熱分離布局
您可以通過查詢表table_usage
,來查看當前的冷熱數據存儲情況。具體使用方式如下:
查詢所有表的冷熱數據存儲情況:
select * from information_schema.table_usage;
查詢單個表的冷熱數據存儲情況:
select * from information_schema.table_usage where table_schema='<schema_name>' and table_name='<table_name>';
table_usage表字段信息:
字段名 | 字段含義描述 |
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)。 |
table_usage表說明:
table_usage是實時更新的,隨著insert/update/delete/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。
build指令:
build table <table_name>;
由于用戶定義的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
語句修改表的數據存儲冷熱分離策略,詳細信息請參見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>';
storage_policy_modify_progress
表字段信息:
字段名 | 字段含義描述 |
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 | 變更狀態:
|