未来一个很大的使用场景是类似于es日志存储,日志场景下数据会按照日期来切割数据,很多数据是冷数据,查询很少,需要降低这类数据的存储成本。从节约存储成本角度考虑
在Partition级别上设置freeze time,表示多久这个Partition会被freeze,并且定义freeze之后存储的remote storage的位置。在be上daemon线程会周期性的判断表是否需要freeze,若freeze后会将数据上传到s3上。
冷热分层支持所有doris功能,只是把部分数据放到对象存储上,以节省成本,不牺牲功能。因此有如下特点:
存储策略是使用冷热分层功能的入口,用户只需要在建表或使用doris过程中,给表或分区关联上storage policy,即可以使用冷热分层的功能。
SinceVersion dev 创建S3 RESOURCE的时候,会进行S3远端的链接校验,以保证RESOURCE创建的正确。
此外,需要新增fe配置:enable_storage_policy=true
注意:这个属性不会被CCR同步,如果这个表是被CCR复制而来的,即PROPERTIES中包含is_being_synced = true
时,这个属性将会在这个表中被擦除。
例如:
CREATE RESOURCE "remote_s3"
PROPERTIES
(
"type" = "s3",
"s3.endpoint" = "bj.s3.com",
"s3.region" = "bj",
"s3.bucket" = "test-bucket",
"s3.root.path" = "path/to/root",
"s3.access_key" = "bbb",
"s3.secret_key" = "aaaa",
"s3.connection.maximum" = "50",
"s3.connection.request.timeout" = "3000",
"s3.connection.timeout" = "1000"
);
CREATE STORAGE POLICY test_policy
PROPERTIES(
"storage_resource" = "remote_s3",
"cooldown_ttl" = "1d"
);
CREATE TABLE IF NOT EXISTS create_table_use_created_policy
(
k1 BIGINT,
k2 LARGEINT,
v1 VARCHAR(2048)
)
UNIQUE KEY(k1)
DISTRIBUTED BY HASH (k1) BUCKETS 3
PROPERTIES(
"storage_policy" = "test_policy"
);
或者对一个已存在的表,关联storage policy
ALTER TABLE create_table_not_have_policy set ("storage_policy" = "test_policy");
或者对一个已存在的partition,关联storage policy
ALTER TABLE create_table_partition MODIFY PARTITION (*) SET("storage_policy"="test_policy");
具体可以参考docs目录下resource、 policy、 create table、 alter table等文档,里面有详细介绍
方式一: 通过show proc '/backends'可以查看到每个be上传到对象的大小,RemoteUsedCapacity项,此方式略有延迟。
方式二: 通过show tablets from tableName可以查看到表的每个tablet占用的对象大小,RemoteDataSize项。
上文提到冷数据为了优化查询的性能和对象存储资源节省,引入了cache的概念。在冷却后首次命中,Doris会将已经冷却的数据又重新加载到be的本地磁盘,cache有以下特性:
冷数据传入的时间是数据rowset文件写入本地磁盘时刻起,加上冷却时间。由于数据并不是一次性写入和冷却的,因此避免在对象存储内的小文件问题,doris也会进行冷数据的compaction。 但是,冷数据的compaction的频次和资源占用的优先级并不是很高,也推荐本地热数据compaction后再执行冷却。具体可以通过以下be参数调整:
cold_data_compaction_thread_num
可以设置执行冷数据的compaction的并发,默认是2。cold_data_compaction_interval_sec
可以设置执行冷数据的compaction的时间间隔,默认是1800,单位:秒,即半个小时。数据冷却后支持schema change类型如下:
冷数据的垃圾数据是指没有被任何Replica使用的数据,对象存储上可能会有如下情况产生的垃圾数据:
另外,对象上的垃圾数据并不会立即清理掉。 be参数remove_unused_remote_files_interval_sec
可以设置冷数据的垃圾回收的时间间隔,默认是21600,单位:秒,即6个小时。