一、概念说明
在大数据业务中,虽然每天都有大量的数据入库,但通常只有时间最新的,如一个月内,甚至一周内的数据才会被频繁更新和访问。习惯性的,我们将这部分需要频繁访问或操作的数据称为“热数据”,也将更早期的不经常使用到的数据称为“冷数据”。为了有效降低业务成本,StarRocks也推出了冷热数据分离存储这一功能。
StarRocks支持为不同分区的数据设置不同的存储介质,目前支持的介质为机械硬盘(HDD)和固态硬盘(SSD)。在某些数据具有冷热特性的业务中,我们可以将“热数据”所在的分区指定存放在SSD上,利用SSD的随机读写性能来提高查询或更新性能,这部分数据存储在SSD中的分区我们就称为“热分区”。在创建“热分区”时,我们还需要同时设定一个“分区数据冷却时间”(storage_cooldown_time),“热分区”在系统时钟到达“冷却时间”后就会触发后台迁移逻辑,分区中的数据将自动迁移至HDD盘中,以节省数据存储的成本,此时这个分区就变成了数据存储在HDD上的“冷分区”。
StarRocks不会自动识别服务器中的存储介质类型,在不进行手动配置时,StarRocks默认的存储介质为HDD。若集群服务器的存储介质唯一,无论是全HDD还是全SSD,我们都不需要单独配置。以全SSD为例,虽然StarRocks默认展示的磁盘类型是HDD,但因为SSD带来的性能提升是源自物理层面的,所以并不会影响实际的查询或导入性能。
注意:目前主键模型在实现上不支持tablet跨磁盘迁移,因此逻辑上无法进行冷热分区的处理。
二、操作步骤
1、配置存储介质
在一台既有SSD又有HDD的服务器中,若要使用冷热分区,我们首先需要在be.conf中为storage_root_path显式的指定存储介质类型,配置格式参考be.conf中的示例说明:
storage_root_path = /data1,medium:HDD;/data2,medium:SSD;/data3 |
在storage_root_path中我们可以配置多个以“英文分号”分割的存储目录,每个存储目录可以配置各自的存储介质,以示例中的三个存储目录为例:
“/data1,medium:HDD”:存储路径为/data1,存储介质为HDD;
“/data2,medium:SSD”:存储路径为/data2,存储介质为SSD;
“/data3”:存储路径为/data3,存储介质为默认的HDD。
2、建表指定分区存储介质
StarRocks的冷热分区目前有以下几个使用方式:
方式1:创建无分区表时,指定表级别的存储介质及存储到期时间
例如,创建无分区表exp,指定表数据到期时间为2023-01-01:
CREATE TABLE exp (
c1 INT COMMENT "",
c2 INT COMMENT "",
c3 DECIMAL(10,2) COMMENT "",
c4 DATETIME NOT NULL COMMENT ""
)
DISTRIBUTED BY HASH(c1) BUCKETS 8
PROPERTIES (
"replication_num" = "1",
"storage_medium" = "SSD",
"storage_cooldown_time" = "2023-01-01 23:59:59"
);
备注:在逻辑上,无分区表被视为一个分区名和表名相同的一个整分区表,我们可以通过 show partitions from exp; 命令来查看表exp的存储介质情况(观察StorageMedium项和CooldownTime项)。
方式2:创建分区表时,指定表中所有分区的存储介质及存储到期时间
例如,创建分区表part_exp:
CREATE TABLE part_exp (
c1 INT COMMENT "",
c2 INT COMMENT "",
c3 DECIMAL(10,2) COMMENT "",
c4 DATETIME NOT NULL COMMENT "",
c5 DECIMAL(18,2) SUM DEFAULT "0" COMMENT ""
)
AGGREGATE KEY(c1,c2,c3,c4)
PARTITION BY RANGE(c4)
(
PARTITION p1 VALUES LESS THAN ('2022-01-01'),
PARTITION p2 VALUES LESS THAN ('2022-01-02'),
PARTITION p3 VALUES LESS THAN ('2022-01-03')
)
DISTRIBUTED BY HASH(c1) BUCKETS 8
PROPERTIES (
"replication_num" = "1",
"storage_medium" = "SSD",
"storage_cooldown_time" = "2023-01-01 23:59:59"
);
通过show语句,查看分区存储介质及其到期时间:
show partitions from part_exp;
可以确定分区p1、p2和p3的StorageMedium为SSD,CooldownTime均为2023-01-01 23:59:59。
方式3:创建分区表时,指定各个分区的存储介质及存储到期时间
例如,创建分区表part_exp_1,给分区p2和p3分别指定不同的到期时间:
CREATE TABLE part_exp_1 (
c1 INT COMMENT "",
c2 INT COMMENT "",
c3 DECIMAL(10,2) COMMENT "",
c4 DATETIME NOT NULL COMMENT "",
c5 DECIMAL(18,2) SUM DEFAULT "0" COMMENT ""
)
AGGREGATE KEY(c1,c2,c3,c4)
PARTITION BY RANGE(c4)
(
PARTITION p1 VALUES LESS THAN ('2022-01-01'),
PARTITION p2 VALUES LESS THAN ('2022-01-02') ("storage_medium"="SSD","storage_cooldown_time" = "2023-01-01 23:59:59"),
PARTITION p3 VALUES LESS THAN ('2022-01-03') ("storage_medium"="SSD","storage_cooldown_time" = "2024-01-01 23:59:59")
)
DISTRIBUTED BY HASH(c1) BUCKETS 8
PROPERTIES (
"replication_num" = "1"
);
方式4:建表完成后,修改分区的存储介质及存储到期时间
以上面的表part_exp为例,修改分区p3的存储到期时间:
ALTER TABLE part_exp MODIFY PARTITION p3 SET("storage_medium"="SSD", "storage_cooldown_time"="2023-03-11 10:29:01");
备注:
1、若需要修改storage_cooldown_time参数,alter命令中的storage_medium参数必须存在。
2、已经到期迁移到HDD中的“冷分区”同样支持使用Alter命令重新回迁至SSD中(主键模型表暂不支持回迁)。
方式5:建表完成后,新增分区时设置分区的存储介质及存储到期时间
在part_exp表中,我们虽然在PROPERTIES中设置了"storage_medium" = "SSD"和"storage_cooldown_time",但这个属性仅会用于表创建时的三个分区,后面新建的分区若不指定,还是会使用默认的存储介质HDD(HDD就没有所谓的存储到期时间了)。分区默认存储介质类型受fe.conf中的default_storage_medium参数控制,默认为HDD。
为part_exp表新增分区p4,指定存储介质及存储到期时间:
ALTER TABLE part_exp ADD PARTITION p4 VALUES LESS THAN ('2022-01-04') ("storage_medium" = "SSD","storage_cooldown_time"="2023-03-11 10:29:01");
当时钟到达分区存储到期时间后,就会触发迁移逻辑,该分区存储在SSD中的数据会向HDD中迁移。对于某些维度表,若我们希望数据一直保存在SSD中,就需要设置一个较大的"storage_cooldown_time"到期时间,避免分区到期。
方式6:动态分区表自动调度使用冷热分区
动态分区表调度创建的分区会使用集群默认配置的存储介质和到期时间,若需要为动态分区表自动配置冷热分区,可以将集群默认的存储介质调整为SSD(fe.conf中调整default_storage_medium=SSD),配合调整分区默认到期时间(fe.conf中调整storage_cooldown_second参数,默认2592000秒,即30天),且在建表语句的PROPERTIES中指定storage_medium和storage_cooldown_time参数,例如:
CREATE TABLE part_exp_2 (
c1 INT COMMENT "",
c2 INT COMMENT "",
c3 DECIMAL(10,2) COMMENT "",
c4 DATETIME NOT NULL COMMENT "",
c5 DECIMAL(18,2) SUM DEFAULT "0" COMMENT ""
)
AGGREGATE KEY(c1,c2,c3,c4)
PARTITION BY RANGE(c4)
(
PARTITION p1 VALUES LESS THAN ('2022-08-26'),
PARTITION p2 VALUES LESS THAN ('2022-08-27'),
PARTITION p3 VALUES LESS THAN ('2022-08-28')
)
DISTRIBUTED BY HASH(c1) BUCKETS 8
PROPERTIES (
"replication_num" = "1",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-60",
"dynamic_partition.end" = "1",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "8",
"storage_medium"="SSD",
"storage_cooldown_time" = "2024-01-01 23:59:59"
);
说明:动态分区调度线程在后台默认每10分钟调度一次,表part_exp_2中,动态分区调度产生的新分区,都会使用SSD存储数据,分区到期时间为“分区被调度创建的时间向后顺延30天”。