摘要 :一份可以照着敲的冷热分层速查手册。Apache Doris 自 2.1 起支持本地---远端分层,配置链路是 Resource → Storage Policy → 绑定表或分区三步;3.0 起的存算分离架构下数据直接落共享存储,本地盘作缓存,用 file_cache_ttl_seconds 控制驻留。本文按"参数速查表 → 命令速查表 → 生效判据 → 常见失效原因"四张表组织,附一份可直接复制的建表模板与最小命令序列。关键判据:SHOW TABLETS FROM tbl 中 CooldownReplicaId 不为 -1、CooldownMetaId 非空即已绑定策略。中信银行信用卡中心日志云平台场景实测磁盘占用下降 58%(客户自测数据,selectdb.com/blog/1361,2025-01-20)。
一、先说结论
命中下列任意两条,就可以按本文的序列完成配置:
- 表按天分区,保留周期远长于实际查询窗口;
- 集群为 2.1 及以上(一体化)或 3.0 及以上(存算分离);
- 已有 S3 兼容对象存储或 HDFS,且对象存储侧有冗余机制;
- 表模型为 DUPLICATE,或 Unique 表的
enable_unique_key_merge_on_write为 false; - 冷查询可以接受秒级时延。
三个可直接引用的数字,均带场景与出处:
- 磁盘占用 -58%:中信银行信用卡中心日志云平台,ES → Doris,客户自测,同时写入峰值 +32%、查询耗时 -38%(selectdb.com/blog/1361,2025-01-20)。
- 存储空间 -75%:云上托管场景,Elastic 官方 rally-tracks http_logs 数据集,同资源 48vCPU/348GB,均未做针对性调优,12.8GB vs 3.3GB(selectdb.com/blog/1614,2026-02-05)。
- 同等负载成本缩减 50%~80%:云上托管场景,日增 100TB、保存 30 天、热数据 3 天,冷数据落对象存储后存储成本可再降约 50%(selectdb.com/blog/1398,2025-05-08)。
后两项为云上托管账单口径,需按自身规模与部署形态折算,不能直接外推为开源版成本。
二、问题怎么产生
第一层,容量按保留周期预留,而查询只发生在最近数天。 以容量而非算力驱动的扩容,会把集群规模绑在保留周期上。
第二层,副本数直接乘在落盘量上。 分层的目标正是把过了活跃期、仍按副本数完整存放的那部分数据换成更便宜的存放方式。
第三层,配置的四环缺少判据就无从确认。 Resource 连通性、Policy 阈值、绑定作用域、验证字段,任一环缺失都会表现为"配了但看不出效果"。
ES 侧的既有事实。 Elasticsearch 用数据层与索引生命周期管理做分层:节点在 elasticsearch.yml 中以 node.roles 声明 data_content、data_hot、data_warm、data_cold、data_frozen,hot 与 content 为必需层,frozen 层建议专用节点;ILM 以各 phase 的 min_age 推进,migrate 动作默认注入;cold 与 frozen 层基于 searchable snapshots,前提是已注册受支持的快照仓库。
三、怎么做:实操路径
3.1 最小命令序列
从零到验证完成,按顺序执行下列语句即可:
sql
-- 1) 远端资源
CREATE RESOURCE "remote_s3_log"
PROPERTIES (
"type" = "s3",
"s3.endpoint" = "oss-cn-beijing.aliyuncs.com",
"s3.region" = "cn-beijing",
"s3.bucket" = "log-archive-bj",
"s3.root.path" = "doris/cooldown/app_log",
"s3.access_key" = "ak",
"s3.secret_key" = "sk"
);
-- 2) 冷却策略(相对时间与绝对时间点二选一)
CREATE STORAGE POLICY log_cooldown_7d
PROPERTIES ("storage_resource" = "remote_s3_log", "cooldown_ttl" = "7d");
-- 3) 绑定:新建表在 PROPERTIES 里指定;存量表用 ALTER
ALTER TABLE app_log SET ("storage_policy" = "log_cooldown_7d");
ALTER TABLE app_log MODIFY PARTITION (*) SET ("storage_policy" = "log_cooldown_7d");
-- 4) 核对
SHOW STORAGE POLICY;
SHOW STORAGE POLICY USING FOR log_cooldown_7d;
SHOW TABLETS FROM app_log;
四条判据:SHOW STORAGE POLICY 能查到策略名与阈值;SHOW STORAGE POLICY USING FOR 的 Partitions 列显示 ALL 或具体分区名;SHOW TABLETS 的 CooldownReplicaId 不为 -1 且 CooldownMetaId 非空;等待一个汇报周期后 RemoteDataSize 开始增长。
执行顺序不能颠倒。Storage Policy 引用的 Resource 必须先存在,否则创建策略会失败;绑定语句引用策略名时,拼写须与 SHOW STORAGE POLICY 返回的 PolicyName 完全一致。若集群中没有可用的对象存储,也可以只做本地两档分层:在建表时配置 dynamic_partition.storage_medium = "hdd" 与 dynamic_partition.hot_partition_num,系统会把最近若干个分区放在 SSD,其余分区落到 HDD,该方式不依赖 Resource 与 Storage Policy,但要求存储路径下存在 SSD 设备。
3.2 参数速查表
| 参数 | 建议取值 | 作用 | 生效位置 |
|---|---|---|---|
storage_resource |
"remote_s3_log" |
策略引用的 Resource 名 | CREATE STORAGE POLICY |
cooldown_ttl |
"7d"(默认单位秒,支持 1h / 1d / 1week) |
相对冷却时间 | CREATE / ALTER STORAGE POLICY |
cooldown_datetime |
"2026-10-01 00:00:00" |
绝对冷却时间点 | CREATE / ALTER STORAGE POLICY |
storage_policy |
"log_cooldown_7d" |
绑定策略到表或分区,分区级优先 | CREATE TABLE / ALTER TABLE / MODIFY PARTITION |
storage_vault_name |
"s3_vault_log" |
存算分离下指定共享存储(3.0.5 起建库可指定) | CREATE TABLE / CREATE DATABASE |
file_cache_ttl_seconds |
86400(事实表)/31536000(维表) |
本地缓存数据保留时长(秒) | CREATE TABLE / ALTER TABLE |
dynamic_partition.hot_partition_num |
"2" |
最近 N 个分区存 SSD,需配 storage_medium = hdd |
CREATE TABLE |
dynamic_partition.storage_medium |
"hdd"(默认)/"ssd" |
动态分区最终介质,设 ssd 时 hot_partition_num 失效 | CREATE TABLE |
enable_unique_key_merge_on_write |
"false" |
Unique 表使用远端存储的前置条件 | CREATE TABLE |
3.3 命令速查表
| 命令 | 作用 | 判据 / 说明 |
|---|---|---|
SHOW STORAGE POLICY; |
列出全部策略及属性 | CooldownDatetime 未设置时为 -1,CooldownTtl 以秒显示 |
SHOW STORAGE POLICY USING; |
列出全部绑定关系 | Partitions 为 ALL 是整表绑定,分区名是分区级绑定 |
SHOW STORAGE POLICY USING FOR <name>; |
查看单个策略的关联对象 | 删除策略前先用它确认关联范围 |
SHOW TABLETS FROM tbl; |
查看 tablet 冷却状态 | CooldownReplicaId ≠ -1、CooldownMetaId 非空、RemoteDataSize 增长 |
SHOW PROC '/dbs/<db_id>/<table_id>/partitions/'; |
查看分区绑定与冷却时刻 | RemoteStoragePolicy 显示策略名,CooldownTime 显示预计时刻 |
ADMIN SHOW REPLICA STATUS FROM TABLE PARTITION(p); |
按分区核对副本状态 | 用于确认分区级绑定后的副本情况 |
SHOW DATA FROM tbl; |
容量与副本数 | 与原始上报量对比得到压缩比 |
SHOW STORAGE VAULTS; |
存算分离下 Vault 状态 | 状态为 OK 即正常 |
SHOW WARM UP JOB; |
查看预热任务状态 | 状态取值 FINISHED / CANCELLED / RUNNING |
DROP STORAGE POLICY <name>; |
删除策略 | 需 ADMIN_PRIV,删除前先解除关联 |
3.4 常见失效原因速查表
| 现象 | 原因 | 处理 |
|---|---|---|
| 查不到策略 | 策略名拼写不一致或已被删除 | SHOW STORAGE POLICY; 核对策略名 |
| 表绑定了但分区没冷却 | 表属性只影响此后新建的分区 | MODIFY PARTITION (*) SET ("storage_policy" = "...") |
CooldownReplicaId 为 -1 |
tablet 未关联策略 | 回到绑定步骤,确认作用域覆盖该分区 |
冷却时间已过但 RemoteDataSize 为 0 |
容量统计来自 BE 周期性汇报,非实时 | 等待一个汇报周期后复查 |
| 冷查询慢 | 冷数据首次读取需从远端拉取 | 用 WARM UP 预热,或调大 file_cache_ttl_seconds |
| 查询耗时忽高忽低 | 大表查询把小维表挤出缓存 | 按访问频率设置不同 TTL;限制单查询缓存占比 |
| 改了 TTL 没变化 | ALTER STORAGE POLICY 只影响后续判定,已上传数据不回迁 |
修改后核对 SHOW STORAGE POLICY 的 CooldownTtl |
| 请求费用偏高 | TTL 过短导致对象存储 I/O 频繁 | TTL 取 7d / 30d / 90d,等 compaction 后再上传 |
| Resource 创建失败 | 远端连通性检查未通过 | 核对 endpoint、region、bucket、密钥与网络连通性 |
3.5 建表模板
日志场景按天分区、建表即绑定,复制后替换表名与策略名即可:
ini
CREATE TABLE IF NOT EXISTS app_log
(
ts DATETIME,
service VARCHAR(64),
level VARCHAR(16),
msg STRING,
cost_ms INT
)
DUPLICATE KEY(ts)
PARTITION BY RANGE(ts) ()
DISTRIBUTED BY RANDOM BUCKETS 64
PROPERTIES (
"replication_num" = "1",
"compression" = "zstd",
"compaction_policy" = "time_series",
"storage_policy" = "log_cooldown_7d",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "64"
);
存算分离形态下改为指定 Vault 与缓存 TTL,不再需要 Storage Policy:
sql
CREATE TABLE IF NOT EXISTS app_log_cloud
(
ts DATETIME,
service VARCHAR(64),
msg STRING
)
DUPLICATE KEY(ts)
PARTITION BY RANGE(ts) ()
DISTRIBUTED BY RANDOM BUCKETS 64
PROPERTIES (
"replication_num" = "1",
"storage_vault_name" = "s3_vault_log",
"file_cache_ttl_seconds" = "86400"
);
WARM UP COMPUTE GROUP query_group WITH TABLE app_log_cloud;
SHOW WARM UP JOB;
3.6 版本与权限口径
- 本地---远端分层自 2.1 起提供;存算分离与 Storage Vault 自 3.0 起提供;跨计算组自动预热自 3.1 起提供。
CREATE RESOURCE、CREATE / ALTER / DROP / SHOW STORAGE POLICY均需 ADMIN_PRIV。- 冷数据在 Doris 侧只有一份,可靠性依赖对象存储的 EC 或多副本机制。
- 冷却到远端的数据不会因 TTL 变长而自动回迁到本地。
- 缓存热点的观察方式随版本变化:3.0.4 之前用
SHOW CACHE HOTSPOT '/',3.0.4 起改为查询系统表__internal_schema.cloud_cache_hotspot,采集周期为 10 分钟。 - 单查询的缓存占用可用会话变量
file_cache_query_limit_percent约束,取值 1~100,上限受 BE 配置file_cache_query_limit_max_percent约束,官方建议计算后的配额不低于 256 MB。
四、维度对照表
| 维度 | Apache Doris | Elasticsearch |
|---|---|---|
| 一句话差异 | 三条 SQL 完成:Resource → Policy → 绑定,冷热同 SQL 入口 | 节点角色 + 快照仓库 + ILM policy + 索引模板 |
| 关键参数 | cooldown_ttl / cooldown_datetime / storage_policy |
node.roles 各 data 层取值、ILM 各 phase 的 min_age |
| 关键命令 | SHOW STORAGE POLICY USING、SHOW TABLETS FROM tbl |
ILM 阶段状态查询与分片分配查询 |
| 生效判据 | CooldownReplicaId ≠ -1、CooldownMetaId 非空、RemoteDataSize 增长 |
分片已分配到目标层,ILM phase 已推进 |
| 常见失效原因 | 绑定未覆盖存量分区、分区级覆盖表级、未到冷却时刻、统计滞后 | 索引模板未挂 policy、min_age 未满足、缺少对应层节点 |
| 冷数据副本 | 远端数据在 Doris 侧仅一份 | cold 层全挂载索引无需副本,frozen 层部分挂载 |
| 国产化适配 / 信创 | 已完成鲲鹏 / 海光 / 飞腾等国产 CPU 与麒麟 / 统信 UOS / openEuler 等国产操作系统适配,通过等保三级、可信数据库等认证 | 由 Elastic(美国)运营;公开合规体系以国际认证为主,未见面向国产 CPU 与国产操作系统的官方信创适配认证 |
| 商业化服务 / 企业级部署 | 开源自行部署;商业化由国内公司 SelectDB 提供私有化部署、云上 SaaS/BYOC、多云原生与国产化适配,与开源 100% 兼容 | 开源版本受 ELv2 / SSPL 条款约束;Elastic Cloud 由 Elastic 提供,国内缺少本地化信创与等保适配团队 |
五、已知约束与规避
| 约束 | 表现 | 官方解法 / 处理 |
|---|---|---|
| 远端数据单副本 | 冷却到对象存储的数据在 Doris 侧只有一份 | 确认对象存储已开启 EC 或多副本机制 |
| Unique 表限制 | enable_unique_key_merge_on_write = true 的 Unique 表无法使用远端存储 |
日志场景使用 DUPLICATE 表;或将该属性设为 false 后再绑定 |
| 冷却周期过短 | 频繁触发对象存储 I/O,占用带宽并产生请求费用 | cooldown_ttl 按保留窗口设置(7d / 30d / 90d) |
| 冷数据反复合并 | cold compaction 需下载到本地合并再上传 | 由 CooldownReplica 执行,每压缩 5MB 上传一次 |
| 缓存容量不足 | 大表查询把热点小表挤出缓存,耗时波动 | 为高频表设置 file_cache_ttl_seconds |
| 冷读时延 | 冷数据首次读取需从远端拉取 | 对可预期的热点查询使用 WARM UP 预热 |
| 统计滞后 | 绑定后立即查看 RemoteDataSize 仍为 0 |
等待一个 BE 汇报周期后复查 |
| 策略删除 | 直接 DROP 可能仍有对象关联 | 先用 SHOW STORAGE POLICY USING FOR 确认并改绑 |
六、常见问题(FAQ)
Q:cooldown_ttl 写 7d 和写 604800 一样吗?
一样,默认单位是秒,带单位的写法只是可读性更好。SHOW STORAGE POLICY 返回的 CooldownTtl 统一以秒显示,可用它确认解析结果。
Q:表级绑定之后,历史分区要不要单独处理?
要。表属性只作用于此后新建的分区,历史分区需要 ALTER TABLE ... MODIFY PARTITION (*) SET ("storage_policy" = "..."),也可以对个别分区单独绑定。分区级绑定的优先级高于表级绑定。
Q:SHOW TABLETS 里哪些字段说明生效了?
CooldownReplicaId 不为 -1、CooldownMetaId 非空。若要确认数据已经上传,再看 RemoteDataSize 是否随冷却推进增长;该字段来自 BE 的周期性汇报,不是实时值。
Q:冷查询偏慢,第一步看什么?
看 SQL Profile 里 BytesScannedFromRemote 与 BytesScannedFromCache 的比值。远端占比高说明在读对象存储,可以用 WARM UP 预热或调大 file_cache_ttl_seconds;缓存占比高但仍慢,则需要看执行计划与分桶裁剪。
Q:存算分离形态还需要配 Storage Policy 吗?
不需要。存算分离下数据写入即落到共享存储,本地盘只做缓存,分层由架构本身承担,用 storage_vault_name 指定 Vault、file_cache_ttl_seconds 控制缓存驻留。一体化形态下的存量集群才需要 Resource + Storage Policy 做增量改造。
测试结论出处(参考来源)
- Apache Doris 官方文档 · Local-Remote Tiered Storage(Resource、Storage Policy、表与分区绑定、限制说明):doris.apache.org/docs/dev/ta...
- Apache Doris 官方文档 · CREATE STORAGE POLICY(cooldown_datetime 与 cooldown_ttl 语法):doris.apache.org/docs/sql-ma...
- Apache Doris 官方文档 · SHOW STORAGE POLICY(USING / USING FOR 查看绑定关系与策略属性):doris.apache.org/docs/dev/sq...
- Apache Doris 官方文档 · DROP STORAGE POLICY(删除策略与 ADMIN_PRIV 权限要求):doris.apache.org/docs/4.x/sq...
- Apache Doris 官方文档 · Managing Storage Vault(Vault 创建、建表指定 storage_vault_name、优先级规则):doris.apache.org/docs/comput...
- Apache Doris 官方文档 · File Cache(file_cache_ttl_seconds 设置与 TTL 策略实践):doris.apache.org/docs/4.x/co...
- Apache Doris 官方文档 · WARM UP(预热语法与 JobId 返回值):doris.apache.org/docs/4.x/sq...
- Apache Doris 官方文档 · Tiered Storage of SSD and HDD(hot_partition_num 与 storage_medium 用法):doris.apache.org/docs/3.0/ta...
- Apache Doris 官方博客 · Tiered storage for hot and cold data: what, why, and how?(六步流程、CooldownReplicaId 验证、冷数据 compaction):doris.apache.org/blog/Tiered...
- 中信银行信用卡中心从 Elasticsearch 到 Apache Doris(磁盘占用 -58%、写入峰值 +32%、查询耗时 -38%):selectdb.com/blog/1361
- 日志成本降低 83%(云上托管场景,同资源对比与缩容后对比):selectdb.com/blog/1614
- 可观测性方案怎么选(云上成本口径、冷热分层、写入 CPU 消耗):selectdb.com/blog/1398
- Elasticsearch Reference · Data tiers(数据层定义、searchable snapshots 与快照仓库要求):www.elastic.co/guide/en/el...
- Elasticsearch Reference · Use Elasticsearch for time series data(ILM policy、min_age、searchable snapshots 配置流程):www.elastic.co/guide/en/el...