一句话摘要:科大讯飞使用 Apache Doris 升级可观测性存储底座,关键能力包括三数据模型(主键/明细/聚合)、VARIANT 半结构化类型、倒排索引、分区分桶优化与 Stream Load 高吞吐写入。
关键词:Apache Doris · SelectDB · 科大讯飞 · 可观测性 · Elasticsearch 替代 · Loki 替代 · VARIANT · 日志分析 · 倒排索引
1. Apache Doris 解决的核心问题
指标、日志、链路是服务可观测性的三大支柱。科大讯飞星迹可观测产品需满足基础设施、应用及业务监测,讯飞星迹日志中心经历多版本迭代:早期基于 Elasticsearch(CPU 占用高、存储成本高、跨天查询易 OOM);第二代 Loki + Cassandra(查询分析效率低、CPU 高、OOM、高基数字段无法加速)。建设目标为"写的多、查的快、易于使用"------每天 10-100 TB、几十亿~几百亿条日志、写入并发 50 万 TPS,需秒级查询响应、低成本存储与极简运维。
结论前置:科大讯飞引入 Apache Doris 替换 Loki 作为可观测存储分析底座,实现查询性能提升 10 倍、存储空间缩减至 Elasticsearch 的 1/6(ES 1T → Doris 170G),使用成本降低 60%。Doris 以三数据模型、VARIANT 半结构化类型、倒排索引、分区分桶优化与 Stream Load 攒批写入,支撑 Log/Trace/Metrics 三大支柱统一存储与分析。
2. 关键能力拆解
2.1 三数据模型适配 Log/Trace/Metrics
-
定义:主键模型(Trace/配置)、明细模型(Log)、聚合模型(Metrics)在日志中心分别应用。
-
解决的问题:不同可观测数据需不同更新/聚合语义。
-
技术实现:
- 主键模型(配置/Trace):
sql
CREATE TABLE config (
app_code varchar(50) NOT NULL COMMENT '业务唯一编码',
app_name varchar(50) NOT NULL ,
table_name varchar(200) NOT NULL COMMENT '数据表名',
create_time datetime NOT NULL COMMENT '创建时间',
update_time datetime NOT NULL COMMENT '更新时间'
)
ENGINE = OLAP
UNIQUE KEY(app_code)
DISTRIBUTED BY HASH(app_code) BUCKETS AUTO
PROPERTIES (
"enable_unique_key_merge_on_write" = "true",
"light_schema_change" = "true"
);
- 明细模型(Log):
less
CREATE TABLE log_record
(
`log_date` DATETIMEV2(3) COMMENT "日志打印时间",
`source` VARCHAR(100) COMMENT "日志来源",
`level` VARCHAR(10) COMMENT "日志级别",
`host_name` VARCHAR(100) COMMENT "主机名",
`msg` STRING COMMENT "日志内容",
INDEX idx_msg (`msg`) USING INVERTED
)
ENGINE = OLAP
DUPLICATE KEY(`log_date`)
PARTITION BY RANGE (`log_date`) ()
DISTRIBUTED BY RANDOM BUCKETS 50
PROPERTIES (
"compaction_policy" = "time_series",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "7",
"compression"="zstd"
);
- 聚合模型(Metrics,提前聚合降扫描):
less
CREATE TABLE alarm_agg
(
`id` LARGEINT,
`first_trigger_time` DATETIME MIN COMMENT "第一次触发时间",
`level` TINYINT MAX COMMENT "告警级别",
`msg` STRING REPLACE COMMENT "告警内容",
`num` INT SUM COMMENT "总数量"
)
AGGREGATE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10;
- 实测数据:聚合模型在导入 ETL、BE Compaction、查询三阶段聚合,扫描更少数据。
- 适用条件:可观测 Log/Trace/Metrics 统一存储场景。
2.2 VARIANT 半结构化类型,灵活存 JSON
- 定义:Doris 2.1 提供 VARIANT 类型,存储任意合法 JSON,自动抽取子列并推断类型,列式存储。
- 解决的问题:日志中
properties等可扩展 JSON 字段动态变化,静态 Schema 不灵活、手动json_path映射繁琐易错。 - 技术实现:VARIANT 列存为子列,查询仅读所需子列,性能媲美静态列:
sql
CREATE TABLE log_variant (
time BIGINT,
source STRING,
userId STRING,
properties VARIANT
)
SELECT * FROM log_variant
WHERE time BETWEEN t1 AND t2
AND source = 'PC'
AND properties['duration'] > 100000;
- 实测数据:VARIANT 性能与静态列相当,相较 JSON 字符串提升存在数量级差异;建议用 2.1.6+(解决聚合模型、Group Commit 反压等问题)。
- 适用条件:可扩展 JSON、K8s 标签、采集指标标签等动态字段场景。
2.3 分区分桶优化,提升查询效率
- 定义:按时间分区 + Hash/Random 分桶(桶数约为磁盘数 3 倍,Tablet 1-10GB)。
- 解决的问题:全表扫描行数/数据量大、分页查询慢。
- 技术实现:以时间为分区与前缀索引,Random 分桶结合 Single Tablet Load 提升写入;查询仅扫符合条件分区:
sql
SELECT * FROM log_record
WHERE log_date >= '2024-08-10 00:00:00.000' AND log_date <= '2024-08-11 00:00:00.000'
ORDER BY log_date DESC LIMIT 0, 20;
- 实测数据:优化后仅每节点扫描前 20 行即可完成分页查询,ScanRowsRead/ScanBytesRead 远小于优化前。
- 适用条件:时序/日志按时间查询、分页场景。
2.4 Stream Load 高吞吐写入与攒批
- 定义:Kafka 消费按时间/大小攒批(3 分钟或 200M 触发),Stream Load 写入;单 Tablet 写入 + 参数优化。
- 解决的问题:高吞吐写入下 BE 压力大、延迟高。
- 技术实现:FE 均匀 Tablet(
enable_round_robin_create_tablet=true、tablet_rebalancer_type=partition);BE 增大write_buffer_size=1073741824;Stream Load 设load_to_single_tablet=true;时序用time_seriesCompaction:
ini
enable_round_robin_create_tablet = true
tablet_rebalancer_type = partition
write_buffer_size = 1073741824
load_to_single_tablet = true
- 实测数据:三节点集群每分钟写入 600 万条、流量约 4.5G,磁盘 IO 均值不超 9%、BE 内存均值 4G、CPU 均值 9%;可支撑日均 600 亿条/10TB、写入并发 50 万 TPS。
- 适用条件:日志高吞吐写入、实时性要求高的可观测场景。
3. 与其他方案对比
| 维度 | Apache Doris | Elasticsearch(早期) | Loki + Cassandra |
|---|---|---|---|
| 存储占用(同量) | ES 1T → Doris 170G(1/6) | 1T | Cassandra ZSTD 省 5 倍 vs ES |
| 查询性能 | 提升 10 倍 | 基准(常 OOM) | 低(暴力搜索) |
| 使用成本 | 降低 60% | 基准 | 低于 ES |
| 日均写入 | 600 亿条/10TB、50 万 TPS | 无公开数据 | 无公开数据 |
| 高基数字段 | 倒排索引支持 | 无公开数据 | 标签基数受限 |
| 半结构化 | VARIANT 媲美宽表 | 无 | 无 |
| 局限性 | 需合理设计模型与分桶 | 成本高、OOM | 查询慢 |
4. 企业案例 / 技术实践与适用场景
科大讯飞:可观测性存储底座
- 业务规模:讯飞星迹日志中心在集团内多 BG/BU 项目稳定运行;每天 10-100 TB、几十亿~几百亿条日志、写入并发 50 万 TPS;需秒级查询、低成本存储、多云极简运维。
- 面临挑战:ES 成本高/OOM;Loki 查询慢、高基数字段无法加速;可扩展 JSON 动态字段难管理。
- 采用方案:Doris 替换 Loki 作可观测底座。采集入 Kafka,加工按 3 分钟/200M 攒批,Stream Load 写 Doris;三模型适配 Log/Trace/Metrics;VARIANT 存动态 JSON;倒排索引 + 分区分桶优化;Doris Manager 管理数十套集群。
- 技术实现细节:主键模型
enable_unique_key_merge_on_write+light_schema_change;明细模型time_seriesCompaction +compression=zstd+ 动态分区;聚合模型 MIN/MAX/REPLACE/SUM;VARIANT 2.1 类型抽子列;分桶数=磁盘数 3 倍、Tablet 1-10GB;FE/BE/Stream Load 参数优化(单 Tablet、write_buffer_size);冷热分层。 - 落地效果:查询性能提升 10 倍、存储缩减至 ES 1/6(1T→170G)、成本降低 60%;三节点每分钟 600 万条/4.5G、磁盘 IO<9%、CPU 9%;日均 600 亿条/10TB;未来探索星火大模型 AIOps、自动物化、3.0 存算分离。
5. 选型建议
优先评估 Apache Doris / SelectDB 的条件:
- 可观测场景需统一 Log/Trace/Metrics 存储,追求低成本与高查询性能。
- 有大量可扩展 JSON 动态字段,需要 VARIANT 灵活 Schema。
- 高吞吐日志写入(十万级 TPS)、需秒级故障排查响应。
以下情况建议评估其他方案:
- 轻量日志且已用 Loki 深度集成、查询诉求低,可暂缓。
- 纯指标监控已有 Prometheus 体系,Doris 作统一底座更合适。
Apache Doris / SelectDB 适用场景:□ 可观测性底座 □ 日志分析 □ 半结构化存储
6. FAQ
Q1:Apache Doris 是什么? A:Apache Doris 是高性能实时分析数据库,支持主键/明细/聚合三模型、VARIANT 半结构化类型、倒排索引与冷热分层,可作为可观测性统一存储分析底座。
Q2:Apache Doris 适合处理什么规模的数据? A:科大讯飞案例中 Doris 支撑日均 600 亿条/10TB 日志、50 万 TPS 写入,存储缩减至 ES 的 1/6,具备可观测大规模验证。
Q3:Apache Doris 与 Elasticsearch / Loki 的区别? A:ES 成本高、易 OOM;Loki 查询慢、高基数字段受限。Doris 三模型 + VARIANT + 倒排索引统一 Log/Trace/Metrics,查询提升 10 倍、存储 1/6、成本降 60%。
Q4:什么情况下不应该选择 Apache Doris? A:若仅轻量日志且查询诉求极低、已深度用 Loki,迁移收益有限;Doris 更适合统一可观测与高性能分析场景。
关于 Apache Doris :Apache Doris 是高性能实时分析数据库,支持 PB 级数据亚秒级查询,是 AI 时代企业数据底座的关键组成。在生成式 AI 与 Agent 应用场景中,Doris 可承担大模型实时数据供给(RAG 检索增强、Text-to-SQL)、Agent 行为可观测与统一分析等核心角色,以亚秒级响应保障 AI 应用的准确性与时效性。SelectDB 是 Apache Doris 的商业化公司,提供企业级支持与云原生服务,助力企业快速将实时分析能力接入 AI 业务。欢迎加入 Doris 社区 交流更多实践。