请教一个问题:我们当前生产环境遇到聚合查询瓶颈,
一、查询数据量
总共大概有170多亿日志文档(日志文档会变更,但是总量大概固定)
二、需求
(1) 先按照用户的过滤条件 query,
(2)然后按照日志级别(level)进行 terms 分组,
(3)最后在每个分组中进行日期直方图聚合(date_histogram)
三、问题
日志量太大了,如果用户选择日期范围比较大,每次查询都消耗大量时间,
而且,我们这个页面是定时刷新(30s)的,刷新后,时间范围又会变化,无法利用缓存,
最终集群的 search queue 很快被占满,大量正常的请求被拒绝了
四、思路
(1) ES 查询能不能指定只查询最新的数据(例如:只查询最新的1千万条日志),
a. 只是指定查询最近3个小时,可能不合适(因为有可能3个小时的写入日志,就超过1千万条了);
b. terminate_after 应该也不合适,因为这个参数会在每个分片上取数据;
(2)这种大数据量的聚合查询,如果不使用ES,还有没有其他好的实现方式呢?[捂脸]
五、解决方式
参考 datadog,目前思路确定为:使用 async search 异步查询
一、查询数据量
总共大概有170多亿日志文档(日志文档会变更,但是总量大概固定)
二、需求
(1) 先按照用户的过滤条件 query,
(2)然后按照日志级别(level)进行 terms 分组,
(3)最后在每个分组中进行日期直方图聚合(date_histogram)
三、问题
日志量太大了,如果用户选择日期范围比较大,每次查询都消耗大量时间,
而且,我们这个页面是定时刷新(30s)的,刷新后,时间范围又会变化,无法利用缓存,
最终集群的 search queue 很快被占满,大量正常的请求被拒绝了
四、思路
(1) ES 查询能不能指定只查询最新的数据(例如:只查询最新的1千万条日志),
a. 只是指定查询最近3个小时,可能不合适(因为有可能3个小时的写入日志,就超过1千万条了);
b. terminate_after 应该也不合适,因为这个参数会在每个分片上取数据;
(2)这种大数据量的聚合查询,如果不使用ES,还有没有其他好的实现方式呢?[捂脸]
五、解决方式
参考 datadog,目前思路确定为:使用 async search 异步查询
4 个回复
thewind
赞同来自: laoyang360
tongchuan1992 - 学无止境、学以致用
赞同来自:
FFFrp
赞同来自:
laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net
赞同来自:
然后将给定的基于时间的查询,限定到给定时间范围内的索引的查询。