afumu
afumu
发布于 2022-05-01 / 0 阅读
0
0

日志存储选型思考:Mongo vs. ES vs. ClickHouse 在亿级数据场景下的实测对比

摘要:随着业务规模的扩大,日志数据呈爆炸式增长,选择一个合适的存储与分析引擎成为后端架构设计的关键决策。本文旨在通过一次针对千万级日志数据的实测,从写入性能、存储成本和查询效率三个核心维度,对当前主流的三种解决方案——MongoDB、Elasticsearch和ClickHouse进行深度横向评测,并最终给出一个数据驱动的技术选型思考与建议。

一、 背景:日志分析场景下的存储挑战

日志数据具有几个典型特征:海量写入(高吞吐量)、持续增长(数据量巨大)、以及复杂的分析需求(聚合、分组、排序)。传统的业务数据库(如MySQL)在面对亿级日志的聚合分析时,性能会急剧下降。因此,为日志分析场景选择一个专门的、高性能的存储引擎至关重要。

本次选型的核心目标是找到一个能够满足以下条件的解决方案:

  1. 能够稳定承载高并发的日志写入请求。

  2. 具备优秀的存储效率,以控制不断增长的硬件成本。

  3. 提供高效的聚合查询能力,支撑复杂的数据分析和态势呈现。

为此,我们选择了三个在各自领域极具代表性的数据库进行实测对比:文档型数据库MongoDB、搜索引擎Elasticsearch以及列式分析数据库ClickHouse。

二、 测试环境与数据集

为保证测试结果的公平性和参考价值,我们搭建了统一的测试环境:

  • 服务器配置:[请在此处填写您的服务器配置,例如:16核CPU, 32GB内存, SSD硬盘]

  • 软件版本:MongoDB v4.x, Elasticsearch v7.x, ClickHouse v22.x

  • 测试数据集:模拟的防火墙日志,共计1000万条记录,每条记录包含host,ip_src,ip_dst,port_src,port_dst,happen_time等15个字段。

三、 性能维度实测对比

1. 写入性能 (Write Performance)

我们测试了不同批量大小下的数据插入耗时。

数据量

MongoDB 耗时

Elasticsearch 耗时

ClickHouse 耗时

10万条

4秒

4.6秒

7秒

50万条

18秒

插入失败

34秒

500万条

309秒

插入失败

376秒

分析与洞察

  • 在小批量写入时,三者性能相差不大。

  • 当批量增大到50万条时,Elasticsearch出现了批量写入失败的情况,这可能与其复杂的索引构建和内存限制有关,需要更精细的批次控制和调优。

  • MongoDB和ClickHouse在大数据量批量插入时表现稳定,尽管ClickHouse的耗时略长,但考虑到其后台的数据压缩和分区合并机制,这一性能表现完全可以接受。

结论:在写入稳定性方面,MongoDB和ClickHouse优于Elasticsearch

2. 存储空间占用 (Storage Space Occupation)

存储成本是日志系统长期运维的关键考量。我们对比了1000万条数据在三个系统中的实际磁盘空间占用。

数据库

1000万条数据占用空间

MongoDB

约 1.0 GB

Elasticsearch

约 1.25 GB

ClickHouse

约 300 MB

分析与洞察

  • ClickHouse的优势在此体现得淋漓尽致。得益于其列式存储的物理结构和高效的数据压缩算法,其存储空间仅为MongoDB的30%,为Elasticsearch的24%

  • 列式存储将同一列的数据连续存储,具有极高的相似性,从而获得了惊人的压缩比。这不仅意味着巨大的磁盘成本节省,更意味着在查询时更少的磁盘I/O,为查询性能打下基础。

结论:在存储效率和成本控制上,ClickHouse具有压倒性优势

3. 查询性能 (Query Performance)

聚合查询是日志分析最核心的场景。我们执行了一个典型的分组聚合查询,以模拟真实分析需求。

测试SQL/DSL:SELECT count(*), host, ip_src, ip_dst, port_src, port_dst from t_message GROUP BY host, ip_src, ip_dst, port_src, port_dst

数据库

1000万条数据分组聚合查询耗时

MongoDB

查询失败 (内存超限)

Elasticsearch

2秒

ClickHouse

4.13秒

当我们增加排序条件 (ORDER BY) 后:

数据库

1000万条数据分组排序查询耗时

Elasticsearch

3.8秒

ClickHouse

6.5秒

分析与洞察

  • MongoDB在面对千万级数据的复杂聚合查询时,出现了因内存限制而查询失败的问题 (Exceeded memory limit for $group)。这表明它虽然是优秀的文档数据库,但并非为大规模OLAP(联机分析处理)场景设计。

  • Elasticsearch和ClickHouse都出色地完成了查询任务。ES凭借其强大的倒排索引和缓存机制,在本次测试中表现略快。

  • ClickHouse虽然稍慢,但其查询性能依然处于极高的水平,并且是在占用远小于ES的硬件资源(特别是内存和磁盘)的前提下完成的。

结论:在复杂分析查询方面,Elasticsearch和ClickHouse均表现出色,而MongoDB则难以胜任。

四、 综合分析与技术选型思考

维度

MongoDB

Elasticsearch

ClickHouse

写入性能

优秀,大批量稳定

良好,大批量易出错

优秀,大批量稳定

存储成本

较高

最高

极低

查询性能

差(聚合能力弱)

优秀

优秀

核心优势

灵活的文档模型

强大的全文搜索

极致的OLAP性能与压缩比

适用场景

业务数据库、非结构化数据存储

全文搜索、日志实时检索

海量日志分析、数据仓库、BI报表

综合来看,我们的选型决策变得非常清晰:

  • MongoDB首先被排除。尽管其写入性能不错,但在核心的聚合分析场景下存在致命短板,无法满足我们的需求。

  • Elasticsearch是一个强大的竞争者。它的查询性能优异,生态成熟,尤其在需要复杂全文搜索的场景下无可替代。但其高昂的存储和内存成本,以及对运维调优的较高要求是其主要缺点。

  • ClickHouse则完美契合了我们的核心诉求。它在保证顶尖分析性能的同时,提供了极致的存储效率,这意味着更低的长期运营成本。虽然在点查和全文搜索方面不如ES,但在我们以聚合分析为主的日志场景中,其优势被无限放大。

五、 最终结论

对于旨在构建一个高性能、高性价比、专注于海量数据聚合分析的日志平台而言,ClickHouse是当前最优的技术选型。它以更低的硬件成本,提供了足以与Elasticsearch媲美的分析性能,展现了其作为新生代OLAP引擎的强大实力。

如果业务场景中,实时全文搜索的优先级高于一切,那么Elasticsearch依然是值得考虑的选择,但团队需要为其更高的资源成本和运维复杂性做好准备。


评论