为什么在大数据平台Elasticsearch扛不住每天100亿的syslog数据接入,而ClickHouse却可以
简单来说,根本原因在于: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 BY、COUNT(DISTINCT)、窗口函数等分析查询时,性能可以比ES快几个数量级。 -
弱项: 不支持事务,不擅长按点更新/删除,全文检索能力远弱于ES。
-
结论: 态势感知平台在接入日志后,大量的场景是统计、分析、聚合(如:统计不同攻击来源IP的访问次数、按小时统计错误日志趋势),这正是CK的绝对主场。而ES的强项(全文检索)在这个场景下反而用得不多。
场景模拟:每天100亿Syslog
假设每条日志1KB,每天100亿条就是 ~100TB 的原始数据。
-
在ES集群中:
-
写入瓶颈: 持续的索引创建和刷新会压垮Data节点的CPU和IO。
-
存储成本: 由于索引膨胀,实际存储可能需要200TB+,磁盘成本和IO压力巨大。
-
查询压力: 一旦需要做全量或大范围的聚合分析,很容易导致节点OOM,查询缓慢甚至集群崩溃。
-
扩展性: 虽然ES可以水平扩展,但在这个量级下,为了维持稳定,可能需要一个非常庞大(例如几十个甚至上百个节点)的集群,运维成本和硬件成本极高。
-
-
在CK集群中:
-
写入轻松: 利用批量导入(如每批次1-10万条),可以轻松吃满磁盘IO,写入瓶颈通常在于网络和客户端。
-
存储高效: 经过压缩,100TB原始数据可能只需要10-20TB的磁盘空间。
-
查询迅捷: 即使是对全量数据进行聚合分析,CK也能在秒级甚至亚秒级返回结果。
-
扩展性: 通过分片和复制,CK可以用比ES少得多的节点数量(可能十分之一)来支撑同样的数据量和查询负载。
-
总结与最佳实践
| 特性 | Elasticsearch | ClickHouse |
|---|---|---|
| 核心定位 | 通用搜索引擎,全文检索 | 在线分析处理(OLAP)数据库 |
| 写入模式 | 近实时,构建倒排索引,成本高 | 批量追加,列式压缩,成本极低 |
| 存储效率 | 行存 + 倒排索引,膨胀严重 | 列存 + 高效压缩,空间节省 |
| 查询强项 | 点查、复杂过滤、相关性搜索 | 大规模聚合、分组、统计 |
| 适用场景 | 应用搜索、日志追踪(少量)、安全分析点查 | 日志分析、用户行为分析、时序数据、商业智能 |
现代态势感知平台的常见架构:
实际上,很多大型系统并不二选一,而是结合两者优势,构建混合架构:
-
数据流:
Syslog->日志采集器(Logstash/Fluentd/Vector)-> 消息队列(Kafka/Pulsar) -> ClickHouse -> Elasticsearch。 -
分工:
-
ClickHouse: 作为数据湖和长期存储,承接所有原始数据,用于执行大规模、复杂的离线分析和历史数据挖掘。
-
Elasticsearch: 作为热数据索引,只接收最近几天(例如7天)的数据,或者经过预聚合、筛选后的关键数据,用于支持运维人员的实时交互式查询、告警和仪表盘。
-
在这种架构下,CK扛住了海量数据的写入和存储压力,并提供了强大的分析能力;而ES则在其擅长的领域提供了优秀的交互式查询体验。两者相辅相成,共同构成了一个强大而稳定的态势感知数据底座。
更多推荐


所有评论(0)