主流引擎概览:ClickHouse、Doris、StarRocks、Elasticsearch、Hologres、Kylin、Druid

市面上实时OLAP引擎多得让人眼花缭乱。我经常被问到:「到底该选哪个?」

说实话,没有银弹。每个引擎都有自己的脾气。今天我把七个主流引擎拉出来遛一遛,讲讲它们的核心差异、适用场景,以及我踩过的坑。

一句话总结:ClickHouse 适合单表大宽表聚合;Doris/StarRocks 适合多表关联和实时更新;Elasticsearch 适合文本检索+聚合;Hologres 适合阿里云生态;Kylin 适合预计算固定维度;Druid 适合时序事件流。

主流实时OLAP引擎定位矩阵 低实时性 高实时性 高并发 低并发 ClickHouse Apache Doris StarRocks Elasticsearch Hologres Apache Kylin Apache 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

嗯,七个引擎讲完了。你可能会问:「那我到底该选哪个?」

我的建议是:先看你的查询模式,再看你的数据模型,最后看团队运维能力。没有最好的引擎,只有最合适的。