简单来说,根本原因在于:ES是一个为“复杂检索”而生的通用搜索引擎,而CK是一个为“大规模分析”而生的列式数据库。 当面对每天100亿条(约11.5万条/秒)这种量级的、结构相对固定的日志数据接入和查询场景时,CK的架构优势被充分发挥,而ES的架构弱点则被暴露。

下面我们从几个关键维度进行详细对比分析:


1. 数据写入模式

  • Elasticsearch: Near Real-Time (近实时) 和 倒排索引的构建成本

    • 写入流程复杂: 数据写入ES时,需要经过多个步骤:Buffer -> Segment -> 构建倒排索引 -> 刷新 才能使文档可被搜索。构建倒排索引(为每个词建立到文档的映射)是一个CPU和IO密集型的操作。

    • 近实时性: 默认1秒的刷新间隔(refresh_interval)虽然提供了很好的搜索实时性,但频繁的刷新和索引创建会给集群带来巨大的开销。对于100亿/天的纯写入场景,这种“实时”能力反而成了负担。

    • 小批量写入: ES更擅长处理中等到大批量的写入,对于持续不断的超高速数据流,其内部的事务和刷新机制可能成为瓶颈。

  • ClickHouse: 批量追加和列式存储

    • 类LSM-Tree结构: CK的数据写入是先写入内存的MemTable,当积累到一定阈值后,再批量、有序地刷盘到磁盘,形成一个Data Part。这个过程中,数据是按列压缩存储的。

    • 极少更新: CK假设数据一旦写入就很少更新,这非常适合日志类数据。这种“追加式”写入极大地减少了磁盘寻址和随机IO,吞吐量极高。

    • 写入成本低: 写入过程不构建复杂的反向索引,只是对数据进行排序、压缩并写入列式文件,开销远小于ES。

结论: 在超高吞吐的写入场景下,CK的批量追加模式比ES的近实时索引模式在CPU和IO效率上高出一个数量级。


2. 数据存储与压缩

  • Elasticsearch: 行式存储 + 倒排索引

    • 存储膨胀: ES为了实现快速搜索,不仅存储原始数据(_source),还为几乎所有字段创建了倒排索引(除非显式关闭)。这导致了存储空间的巨大浪费。100亿条原始日志可能只有几十TB,但在ES中存储后,占用空间可能翻倍甚至更多。

    • 压缩率一般: 虽然也支持压缩,但行式存储的压缩效率低于列式存储。

  • ClickHouse: 列式存储 + 高效压缩

    • 极致压缩: 同一列的数据类型相同,重复率高(如日志级别IP地址),这使得CK可以采用高效的压缩算法(如LZ4, ZSTD),压缩比通常可以达到10:1到20:1甚至更高。这直接减少了磁盘IO,是高性能的基石。

    • 仅读取所需列: 在进行分析查询时(如计算某个错误码的出现次数),CK只需要读取错误码这一列,而不是整行数据,I/O效率极高。

结论: CK的列式存储和高效压缩使其在存储成本和查询IO上具有碾压性优势。


3. 查询模式

  • Elasticsearch: 擅长点查和全文检索

    • 强项: 根据某个ID快速检索文档、复杂的多条件过滤、模糊查询、相关性评分(Score)。这是搜索引擎的核心能力。

    • 弱项: 大规模聚合分析(如Group By、多维度聚合)性能较差,容易触发Circuit Breaker导致内存溢出(OOM),因为它需要在内存中构建大量的中间结果。

  • ClickHouse: 擅长大规模聚合分析

    • 强项: 凭借列式存储、向量化执行引擎和丰富的聚合函数,CK在进行GROUP BYCOUNT(DISTINCT)窗口函数等分析查询时,性能可以比ES快几个数量级。

    • 弱项: 不支持事务,不擅长按点更新/删除,全文检索能力远弱于ES。

结论: 态势感知平台在接入日志后,大量的场景是统计、分析、聚合(如:统计不同攻击来源IP的访问次数、按小时统计错误日志趋势),这正是CK的绝对主场。而ES的强项(全文检索)在这个场景下反而用得不多。


场景模拟:每天100亿Syslog

假设每条日志1KB,每天100亿条就是 ~100TB 的原始数据。

  • 在ES集群中

    1. 写入瓶颈: 持续的索引创建和刷新会压垮Data节点的CPU和IO。

    2. 存储成本: 由于索引膨胀,实际存储可能需要200TB+,磁盘成本和IO压力巨大。

    3. 查询压力: 一旦需要做全量或大范围的聚合分析,很容易导致节点OOM,查询缓慢甚至集群崩溃。

    4. 扩展性: 虽然ES可以水平扩展,但在这个量级下,为了维持稳定,可能需要一个非常庞大(例如几十个甚至上百个节点)的集群,运维成本和硬件成本极高。

  • 在CK集群中

    1. 写入轻松: 利用批量导入(如每批次1-10万条),可以轻松吃满磁盘IO,写入瓶颈通常在于网络和客户端。

    2. 存储高效: 经过压缩,100TB原始数据可能只需要10-20TB的磁盘空间。

    3. 查询迅捷: 即使是对全量数据进行聚合分析,CK也能在秒级甚至亚秒级返回结果。

    4. 扩展性: 通过分片和复制,CK可以用比ES少得多的节点数量(可能十分之一)来支撑同样的数据量和查询负载。


总结与最佳实践

特性 Elasticsearch ClickHouse
核心定位 通用搜索引擎,全文检索 在线分析处理(OLAP)数据库
写入模式 近实时,构建倒排索引,成本高 批量追加,列式压缩,成本极低
存储效率 行存 + 倒排索引,膨胀严重 列存 + 高效压缩,空间节省
查询强项 点查、复杂过滤、相关性搜索 大规模聚合、分组、统计
适用场景 应用搜索、日志追踪(少量)、安全分析点查 日志分析、用户行为分析、时序数据、商业智能

现代态势感知平台的常见架构

实际上,很多大型系统并不二选一,而是结合两者优势,构建混合架构

  1. 数据流: Syslog -> 日志采集器(Logstash/Fluentd/Vector) -> 消息队列(Kafka/Pulsar) -> ClickHouse -> Elasticsearch

  2. 分工

    • ClickHouse: 作为数据湖长期存储,承接所有原始数据,用于执行大规模、复杂的离线分析和历史数据挖掘

    • Elasticsearch: 作为热数据索引,只接收最近几天(例如7天)的数据,或者经过预聚合、筛选后的关键数据,用于支持运维人员的实时交互式查询、告警和仪表盘

在这种架构下,CK扛住了海量数据的写入和存储压力,并提供了强大的分析能力;而ES则在其擅长的领域提供了优秀的交互式查询体验。两者相辅相成,共同构成了一个强大而稳定的态势感知数据底座。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐