主流引擎概览:ClickHouse、Doris、StarRocks、Elasticsearch、Hologres、Kylin、Druid
市面上实时OLAP引擎多得让人眼花缭乱。我经常被问到:「到底该选哪个?」
说实话,没有银弹。每个引擎都有自己的脾气。今天我把七个主流引擎拉出来遛一遛,讲讲它们的核心差异、适用场景,以及我踩过的坑。
一句话总结:ClickHouse 适合单表大宽表聚合;Doris/StarRocks 适合多表关联和实时更新;Elasticsearch 适合文本检索+聚合;Hologres 适合阿里云生态;Kylin 适合预计算固定维度;Druid 适合时序事件流。
1. ClickHouse:单表聚合之王
ClickHouse 是我用得最早的列式引擎。它的核心卖点就一个:快。单表几亿行,group by 秒级出结果。
我的经验:ClickHouse 的 MergeTree 引擎族非常灵活。我习惯用 ReplacingMergeTree 做去重,用 SummingMergeTree 做预聚合。但要注意,它不支持高频行级更新——一次 update 就是一次重写。
适合场景:
- 用户行为日志分析(PV/UV、留存)
- 监控指标聚合(CPU、内存、QPS)
- 大宽表即席查询
避坑:我曾经把 ClickHouse 当 TP 库用,频繁 update 单行,结果 MergeTree 的合并线程把 IO 打满了。记住,ClickHouse 是 AP 引擎,不是 TP 引擎。
2. Apache Doris:MPP 架构的均衡选手
Doris 是百度开源的那一套。它的优势在于多表 JOIN 能力强,而且支持实时导入。
我去年帮一家电商公司做迁移,从 Hive+Impala 换到 Doris,查询延时从分钟级降到了秒级。Doris 的 Colocation Join 和 Bucket Shuffle Join 确实有两把刷子。
| 特性 | Doris | ClickHouse |
|---|---|---|
| 多表 JOIN | 优秀(CBO 优化器) | 一般(需手动优化) |
| 实时写入 | 支持(微批 + 行存) | 支持(但合并压力大) |
| 并发查询 | 高(MPP 弹性) | 中(单节点吞吐有限) |
| 运维复杂度 | 中等 | 低 |
3. StarRocks:Doris 的进化版
StarRocks 是从 Doris 分叉出来的。说白了,它把 Doris 的一些痛点修了,性能又往上提了一截。
我个人最欣赏 StarRocks 的主键模型。它支持 UPSERT 语义,可以做到行级实时更新。这在实时大宽表场景下太香了。
核心差异:StarRocks 的 Primary Key 模型用 Delete+Insert 实现更新,避免了 Merge 开销。写入性能比 Doris 的 Duplicate/Unique 模型更稳定。
我建议:如果你从零开始选型,且团队有 MPP 经验,直接上 StarRocks。如果已经在用 Doris 且跑得稳,没必要迁移。
4. Elasticsearch:检索+聚合的瑞士军刀
Elasticsearch 本质是搜索引擎,但它的聚合能力被很多人忽略了。
我记得有个日志分析项目,用户既要全文搜索错误日志,又要按时间聚合统计。ES 的 terms + date_histogram 组合拳,一套搞定。
// ES 聚合示例:按错误级别统计最近1小时日志
GET /logs-2024-01/_search
{
"size": 0,
"query": {
"range": { "@timestamp": { "gte": "now-1h" } }
},
"aggs": {
"by_level": {
"terms": { "field": "level.keyword" },
"aggs": {
"over_time": {
"date_histogram": { "field": "@timestamp", "interval": "5m" }
}
}
}
}
}
注意:ES 的聚合是实时计算的,数据量大时内存消耗很高。我曾经遇到过节点 OOM,就是因为一个跨天的时间范围聚合,bucket 数量爆炸。建议加 hard_bounds 限制范围。
5. Hologres:阿里云生态的实时数仓
Hologres 是阿里云上的实时数仓服务。如果你公司已经用了 MaxCompute、Flink、DataWorks,那 Hologres 是天然选择。
它的亮点是实时写入+高并发点查。Flink 实时写入 Hologres,然后前端直接点查单行,延时在毫秒级。
但注意,Hologres 是商业产品,不开源。如果你要自建,这条路走不通。
6. Apache Kylin:预计算的老牌选手
Kylin 的思路和前面几个完全不同。它提前算好所有维度的聚合结果,查询时直接读预计算表。
适合场景:固定维度的 BI 报表,比如「按天+按城市+按品类统计销售额」。查询速度极快,但灵活性差——加一个新维度,要重新 Build Cube。
我的建议:Kylin 适合查询模式固定的场景。如果你经常加维度、改粒度,别用 Kylin,你会被 Build 任务折磨疯的。
7. Apache Druid:时序事件流的利器
Druid 是为时序事件设计的。它的数据按时间分片,自动做预聚合(Rollup),查询时走时间索引。
我曾在广告归因项目里用 Druid。每天几十亿条曝光点击事件,按用户 ID 和时间窗口做归因,Druid 的 timeseries 和 topN 查询非常快。
| 特性 | Druid | ClickHouse |
|---|---|---|
| 数据模型 | 时序 + 维度 | 宽表 + 列存 |
| 预聚合 | 内置 Rollup | 需手动建物化视图 |
| 实时摄入 | 原生支持(Tranquility/Kafka) | 需外部工具(Kafka 引擎) |
| 运维 | 复杂(多组件:Coordinator/Overlord/Broker/Historical) | 简单(单进程) |
避坑:Druid 的 Segment 合并(Compaction)在数据量大时很吃资源。我遇到过 Historical 节点磁盘写满,就是因为 Compaction 任务积压。建议控制 Segment 粒度,别太小。
选型速查表
| 引擎 | 核心优势 | 最大短板 | 推荐场景 |
|---|---|---|---|
| ClickHouse | 单表聚合极快 | 多表 JOIN 弱 | 日志分析、监控 |
| Doris | MPP 均衡 | 社区迭代慢 | 报表、Ad-hoc |
| StarRocks | 主键更新、性能强 | 生态较新 | 实时大宽表 |
| Elasticsearch | 全文检索+聚合 | 内存消耗大 | 日志检索、APM |
| Hologres | 阿里云生态 | 不开源 | 阿里云实时数仓 |
| Kylin | 预计算极速 | 灵活性差 | 固定维度 BI |
| Druid | 时序事件流 | 运维复杂 | 广告归因、IoT |
嗯,七个引擎讲完了。你可能会问:「那我到底该选哪个?」
我的建议是:先看你的查询模式,再看你的数据模型,最后看团队运维能力。没有最好的引擎,只有最合适的。