MySQL 的 ElasticSearch 用于聚合数千万条非常简单的记录

Posted

技术标签:

【中文标题】MySQL 的 ElasticSearch 用于聚合数千万条非常简单的记录【英文标题】:ElasticSearch of MySQL for aggregating tens of millions of very simple records 【发布时间】:2020-02-07 08:29:34 【问题描述】:

我想知道 MySQLElasticSearch 从根本上来说是构建这个项目的更好工具吗?

给定一个 PING 响应时间数据库,格式如下:

Timestamp Host Success ResponseTime 2020-02-01 12:00:00 1.1.1.1 1 5.00 2020-02-01 12:00:01 1.1.1.1 1 4.00 2020-02-01 12:00:01 8.8.8.8 1 2.00 2020-02-01 12:00:02 1.1.1.1 1 4.50 2020-02-01 12:00:02 8.8.8.8 1 1.80 2020-02-01 12:00:02 1.1.1.1 0 NULL

我想按 1 分钟、5 分钟、1 小时组汇总这些数据,并收集最小/最大/平均响应时间以及计算错误数(成功 = 0)。

目标很简单:

快速读取查询(不用担心写入速度) 需要很小的存储空间 可以删除旧记录并重新获得已用空间 最好是简单的设置(不用担心手动调整索引,...)

【问题讨论】:

标签“大数据”是什么意思?预期的数据负载是什么,每秒新的文档/行?每天多少字节?每秒搜索?期望的响应时间?保留时间是多少?您需要弹性/高可用性吗? 可能两者都不是;为什么不直接使用像 druid 这样的时间序列数据库? @ibexit 我预计每秒有几十个主机和一个 ping,所以假设 [50 个主机] x [24 * 3600 条记录/天] x [365 天] = 1.5B 条记录。 @Backgammon 我从来没有听说过德鲁伊,惭愧。就 100 毫秒到数十亿条记录的性能而言,它与 Elasticsearch 相比如何? 它们有一些不同的优势,但如果你使用 druid 处理真正的时间序列数据,只需要最少的字符串/文本处理,它在分析类型的东西(如聚合)上的性能远远优于 ES。 【参考方案1】:

我会使用 mysql 来构建和增量扩充一个汇总表,按 1 分钟间隔细分。它还包括 min、max、count、sum。

我希望它将行数缩减到原来的十分之一,从而使查询的运行速度提高十倍以上。

一旦我对这一切感到满意,我就会拥有主表PARTITION BY RANGE(),这样我就可以定期有效地DROP PARTITION

同时,我会“永远”保留汇总表。

我说的是COUNTSUM,而不是AVGAVG 可以通过(总和)除以(计数总和)得出。

http://mysql.rjweb.org/doc.php/summarytableshttp://mysql.rjweb.org/doc.php/partitionmaint

【讨论】:

谢谢,这是我目前的架构:MySQL 表 + 另一个 M1 表,按 min/max/avg 细分。不过我还没有准备好分区,这是个好主意。您认为没有理由打扰 Elastic? @adamsfamily - 抱歉,我不太了解 Elastic 来解决这部分问题。 @adamsfamily - 根据您的其他 cmets,我只会在汇总前保存 1 天的数据。也就是说,我永远不会有 1.5B 行的原始数据,每年只有 2500 万行的汇总数据。 1.5B 行将受 I/O 限制,无论什么软件正在访问它。因此,除非 Elastic 进行某种自动汇总,否则它不会像我建议的那样快。 请看一下弹性数据框功能:elastic.co/de/blog/elasticsearch-7-3-0-released

以上是关于MySQL 的 ElasticSearch 用于聚合数千万条非常简单的记录的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch:索引数据是如何完成的

搭建Elasticsearch服务环境并实现将与mysql数据的同步

MySQL和Lucene(Elasticsearch)索引对比分析

mysql 高级学习笔记

带你走进神一样的Elasticsearch索引机制

带你走进神一样的Elasticsearch索引机制