首页 > 其他分享 >Elasticsearch 聚合性能优化六大猛招

Elasticsearch 聚合性能优化六大猛招

时间:2022-10-18 22:39:15浏览次数:118  
标签:聚合 0001 猛招 写入 Elasticsearch 刷新 test


Elasticsearch 最少必要知识实战教程直播回放



1、问题引出

默认情况下,Elasticsearch 已针对大多数用例进行了优化,确保在写入性能和查询性能之间取得平衡。我们将介绍一些聚合性能优化的可配置参数,其中部分改进是以牺牲写入性能为代价的。目标是将聚合优化招数汇总到一个易于消化的短文中,为大家的 Elasticsearch 集群聚合性能优化提供一些指导。

2、聚合实战问题

  • 问题1:1天的数据 70W,聚合2次分桶正常查询时间是 200ms左右, 增加了一个去重条件, 就10-13秒了,有优化的地方不?
  • 问题2:请问在很多 terms 聚合的情况下,怎样优化检索?我的场景在无聚合时,吞吐量有 300,在加入 12 个聚合字段后,吞吐量不到20。
  • 问题3:哪位兄弟 帮忙发一个聚合优化的链接,我这个聚合 几千万 就好几秒了?

3、认知前提

3.1 Elasticsearch 聚合是不严格精准的

原因在于:数据分散到多个分片,聚合是每个分片的取 Top X,导致结果不精准。

可以看一下之前的文章:​​Elasticsearch 聚合数据结果不精确,怎么破?​

3.2 从业务层面规避全量聚合

聚合结果的精准性和响应速度之间是相对矛盾的。

正常业务开发,产品经理往往要求:

  • 第一:快速秒级或者毫秒级聚合响应。
  • 第二:聚合结果精准。

殊不知,二者不可兼得。

遇到类似两者都要兼得的需求,建议从架构选型和业务层面做规避处理。

3.3 刷新频率

如下图所示,Elasticsearch 中的 1 个索引由一个或多个分片组成,每个分片包含多个segment(段),每一个段都是一个倒排索引。

在 lucene 中,为了实现高索引速度,使用了segment 分段架构存储。一批写入数据保存在一个段中,其中每个段最终落地为磁盘中的单个文件。

Elasticsearch 聚合性能优化六大猛招_大数据

如下图所示,将文档插入 Elasticsearch 时,它们会被写入缓冲区中,然后在刷新时定期从该缓冲区刷新到段中。刷新频率由 refresh_interval 参数控制,默认每1秒发生一次。也就是说,新插入的文档在刷新到段(内存中)之前,是不能被搜索到的。

Elasticsearch 聚合性能优化六大猛招_数据库_02

刷新的本质是:写入数据由内存 buffer 写入到内存段中,以保证搜索可见。

来看个例子,加深对 refresh_inteval(232, 232, 232); background: rgb(249, 249, 249);">

PUT test_0001/_doc/1
{
"title":"just testing"
}
# 默认一秒的刷新频率,秒级可见(用户无感知)
GET test_0001/_search

DELETE test_0001
# 设置了60s的刷新频率
PUT test_0001
{
"settings": {
"index":{
"refresh_interval":"60s"
}
}
}

PUT test_0001/_doc/1
{
"title":"just testing"
}
# 60s后才可以被搜索到
GET test_0001/_search

标签:聚合,0001,猛招,写入,Elasticsearch,刷新,test
From: https://blog.51cto.com/elasticsearch/5768285

相关文章