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 时,它们会被写入缓冲区中,然后在刷新时定期从该缓冲区刷新到段中。刷新频率由 refresh_interval 参数控制,默认每1秒发生一次。也就是说,新插入的文档在刷新到段(内存中)之前,是不能被搜索到的。
刷新的本质是:写入数据由内存 buffer 写入到内存段中,以保证搜索可见。
来看个例子,加深对 refresh_inteval(232, 232, 232); background: rgb(249, 249, 249);">
PUT test_0001/_doc/1标签:聚合,0001,猛招,写入,Elasticsearch,刷新,test From: https://blog.51cto.com/elasticsearch/5768285
{
"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