1、使用Storage policy实现冷热数据分层
存储策略是使用冷热分层功能的入口,用户只需要在建表或使用Doris 过程中,给表或分区关联上Storage policy,即可以使用冷热分层的功能。
在Partition级别上设置Freeze time,表示多久这个Partition会被Freeze,并且定义Freeze之后存储的Remote storage的位置。
在BE上daemon线程会周期性的判断表是否需要freeze,若freeze后会将数据上传到兼容S3协议的对象存储和HDFS上。
冷热分层支持所有 Doris 功能,只是把部分数据放到对象存储上,以节省成本,不牺牲功能。因此有如下特点:
冷数据放到对象存储上,用户无需担心数据一致性和数据安全性问题
灵活的 Freeze 策略,冷却远程存储 Property 可以应用到表和 Partition 级别
用户查询数据,无需关注数据分布位置,若数据不在本地,会拉取对象上的数据,并 cache 到 BE 本地
副本 clone 优化,若存储数据在对象上,则副本 clone 的时候不用去拉取存储数据到本地
远程对象空间回收 recycler,若表、分区被删除,或者冷热分层过程中异常情况产生的空间浪费,则会有 recycler 线程周期性的回收,节约存储资源
cache 优化,将访问过的冷数据 cache 到 BE 本地,达到非冷热分层的查询性能
BE 线程池优化,区分数据来源是本地还是对象存储,防止读取对象延时影响查询性能
2、冷数据占用对象大小
方式一:通过 show proc '/backends’可以查看到每个 BE 上传到对象的大小,RemoteUsedCapacity 项,此方式略有延迟。
方式二:通过 show tablets from tableName 可以查看到表的每个 tablet 占用的对象大小,RemoteDataSize 项。
3、冷数据的cache
冷数据为了优化查询的性能和对象存储资源节省,引入了cache的概念。
在冷却后首次命中,Doris 会将已经冷却的数据又重新加载到 BE 的本地磁盘,cache 有以下特性:
cache 实际存储于 BE 磁盘,不占用内存空间。
cache 可以限制膨胀,通过 LRU 进行数据的清理
cache 的实现和联邦查询 Catalog 的 cache 是同一套实现
4、冷数据的 Compaction
冷数据传入的时间是数据 rowset 文件写入本地磁盘时刻起,加上冷却时间。由于数据并不是一次性写入和冷却的,因此避免在对象存储内的小文件问题,Doris 也会进行冷数据的 Compaction。但是,冷数据的 Compaction 的频次和资源占用的优先级并不是很高,也推荐本地热数据 compaction 后再执行冷却。具体可以通过以下 BE 参数调整:
BE 参数cold_data_compaction_thread_num可以设置执行冷数据的 Compaction 的并发,默认是 2。
BE 参数cold_data_compaction_interval_sec可以设置执行冷数据的 Compaction 的时间间隔,默认是 1800,单位:秒,即半个小时。。
5、冷数据的垃圾回收
冷数据的垃圾数据是指没有被任何Replica使用的数据,对象存储上可能会有如下情况产生的垃圾数据:
1、上传rowset失败但是有部分segment上传成功。
2、FE重新选CooldownReplica后,新旧CooldownReplica的rowset version不一致,FollowerReplica都去同步新CooldownReplica的CooldownMeta,
旧CooldownReplica中version不一致的rowset没有Replica使用成为垃圾数据。
3、冷数据Compaction后,合并前的rowset因为还可能被其他Replica使用不能立即删除,但是最终FollowerReplica都使用了最新的合并后的rowset,
合并前的rowset成为垃圾数据。
4、对象上的垃圾数据并不会立即清理掉。
BE参数remove_unused_remote_files_interval_sec可以设置冷数据的垃圾回收的时间间隔,默认是21600,单位:秒,即6个小时。