3.4.2 远程存储¶
1 功能简介¶
远程存储支持把部分数据放到外部存储(例如对象存储, HDFS )上,节省成本,不牺牲功能。
Tip
远程存储的数据只有一个副本,数据可靠性依赖远程存储的数据可靠性,您需要保证远程存储有 ec (擦除码)或者多副本技术确保数据可靠性。
2 使用方法¶
以 S3 对象存储为例,首先创建 S3 RESOURCE :
| SQL | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Tip
创建 S3 RESOURCE 的时候,会进行 S3 远端的链接校验,以保证 RESOURCE 创建的正确。
之后创建 STORAGE POLICY ,关联上文创建的 RESOURCE :
| SQL | |
|---|---|
1 2 3 4 5 | |
最后建表的时候指定 STORAGE POLICY :
| SQL | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 | |
Tip
UNIQUE 表如果设置了 "enable_unique_key_merge_on_write" = "true" 的话,无法使用此功能。
创建 HDFS RESOURCE :
| SQL | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
Tip
UNIQUE 表如果设置了 "enable_unique_key_merge_on_write" = "true" 的话,无法使用此功能。
除了新建表支持设置远程存储外, Doris 还支持对一个已存在的表或者 PARTITION ,设置远程存储。
对一个已存在的表,设置远程存储,将创建好的 STORAGE POLICY 与表关联:
| SQL | |
|---|---|
1 | |
对一个已存在的 PARTITION ,设置远程存储,将创建好的 STORAGE POLICY 与 PARTITON 关联:
| SQL | |
|---|---|
1 | |
Tip
注意,如果用户在建表时给整张 Table 和部分 Partition 指定了不同的 Storage Policy , Partition 设置的 Storage policy 会被无视,整张表的所有 Partition 都会使用 table 的 Policy 。如果您需要让某个 Partition 的 Policy 和别的不同,则可以使用上文中对一个已存在的 Partition ,关联 Storage policy 的方式修改。
具体可以参考 Docs 目录下 RESOURCE 、 POLICY 、 CREATE TABLE 、 ALTER TABLE 等文档,里面有详细介绍。
2.1 一些限制¶
-
单表或单
Partition只能关联一个Storage policy,关联后不能Drop掉Storage policy,需要先解除二者的关联。 -
Storage policy关联的对象信息不支持修改数据存储path的信息,比如bucket、endpoint、root_path等信息 -
Storage policy支持创建和修改和支持删除,删除前需要先保证没有表引用此Storage policy。 -
Unique模型在开启Merge-on-Write特性时,不支持设置Storage policy。
3 查看远程存储占用大小¶
方式一:通过 show proc '/backends' 可以查看到每个 BE 上传到对象的大小, RemoteUsedCapacity 项,此方式略有延迟。
方式二:通过 show tablets from tableName 可以查看到表的每个 tablet 占用的对象大小, RemoteDataSize 项。
4 远程存储的 cache¶
为了优化查询的性能和对象存储资源节省,引入了 cache 的概念。在第一次查询远程存储的数据时, Doris 会将远程存储的数据加载到 BE 的本地磁盘做缓存, cache 有以下特性:
-
cache实际存储于BE磁盘,不占用内存空间。 -
cache可以限制膨胀,通过LRU进行数据的清理 -
cache的实现和联邦查询Catalog的cache是同一套实现,文档参考此处
5 远程存储的 Compaction¶
远程存储数据传入的时间是 rowset 文件写入本地磁盘时刻起,加上冷却时间。由于数据并不是一次性写入和冷却的,因此避免在对象存储内的小文件问题, Doris 也会进行远程存储数据的 Compaction 。但是,远程存储数据的 Compaction 的频次和资源占用的优先级并不是很高,也推荐本地热数据 compaction 后再执行冷却。具体可以通过以下 BE 参数调整:
-
BE参数cold_data_compaction_thread_num可以设置执行远程存储的Compaction的并发,默认是2。 -
BE参数cold_data_compaction_interval_sec可以设置执行远程存储的Compaction的时间间隔,默认是1800,单位:秒,即半个小时。。
6 远程存储的 Schema Change¶
远程存储支持 Schema Change 类型如下:
-
增加、删除列
-
修改列类型
-
调整列顺序
-
增加、修改索引
7 远程存储的垃圾回收¶
远程存储的垃圾数据是指没有被任何 Replica 使用的数据,对象存储上可能会有如下情况产生的垃圾数据:
-
上传
rowset失败但是有部分segment上传成功。 -
FE重新选CooldownReplica后,新旧CooldownReplica的rowset version不一致,FollowerReplica都去同步新CooldownReplica的CooldownMeta,旧CooldownReplica中version不一致的rowset没有Replica使用成为垃圾数据。 -
远程存储数据
Compaction后,合并前的rowset因为还可能被其他Replica使用不能立即删除,但是最终FollowerReplica都使用了最新的合并后的rowset,合并前的rowset成为垃圾数据。
另外,对象上的垃圾数据并不会立即清理掉。 BE 参数 remove_unused_remote_files_interval_sec 可以设置远程存储的垃圾回收的时间间隔,默认是 21600 ,单位:秒,即 6 个小时。
8 常见问题¶
| Bash | |
|---|---|
1 | |
S3 SDK 默认使用 virtual-hosted style 方式。但某些对象存储系统(如: minio )可能没开启或没支持 virtual-hosted style 方式的访问,此时我们可以添加 use_path_style 参数来强制使用 path style 方式:
| SQL | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |