设置参数 `node.name` 可以自定义 Elasticsearch 节点的名字。 此条 Tips 由 medcl 贡献。

ES 大数据量,频繁聚合查询请求,导致集群异常?

Elasticsearch | 作者 thewind | 发布于2021年10月20日 | 阅读数:2238

请教一个问题:我们当前生产环境遇到聚合查询瓶颈,


一、查询数据量
 
 
总共大概有170多亿日志文档(日志文档会变更,但是总量大概固定)
 

es2.png




二、需求
 
(1) 先按照用户的过滤条件 query, 
 
(2)然后按照日志级别(level)进行 terms 分组,
 
(3)最后在每个分组中进行日期直方图聚合(date_histogram)
 
es.png


三、问题
 
日志量太大了,如果用户选择日期范围比较大,每次查询都消耗大量时间,
 
而且,我们这个页面是定时刷新(30s)的,刷新后,时间范围又会变化,无法利用缓存,
 
最终集群的 search queue 很快被占满,大量正常的请求被拒绝了

 
四、思路

(1) ES 查询能不能指定只查询最新的数据(例如:只查询最新的1千万条日志),

a. 只是指定查询最近3个小时,可能不合适(因为有可能3个小时的写入日志,就超过1千万条了);

b. terminate_after 应该也不合适,因为这个参数会在每个分片上取数据;

(2)这种大数据量的聚合查询,如果不使用ES,还有没有其他好的实现方式呢?[捂脸]
 
 
五、解决方式
 
参考 datadog,目前思路确定为:使用 async search 异步查询


es1.png


 
已邀请:

thewind

赞同来自: laoyang360

目前初步思路,异步调用 async search

tongchuan1992 - 学无止境、学以致用

赞同来自:

您好,你这种原数据就这么多,可以通过缩小查询原数据的方式,比如你们把每固定10分钟次查询的结果,放到另外一个索引,然后去查询你这个索引。

FFFrp

赞同来自:

赞同楼上,设置rollover index,可以按时间或者数量

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

建议索引生命周期管理 基于时间切分索引
然后将给定的基于时间的查询,限定到给定时间范围内的索引的查询。

要回复问题请先登录注册