阿小信大人的头像
做你说过的,说你能做的 阿小信大人

es优化方案记录2021-08-05 15:47

节点负载不均衡

现象:

每个索引使用默认的1个分片,1个副本,在3节点集群出现负载不均衡现象,两个节点cpu负载很高,另外一个节点cpu负载更低。

原因:

分片+副本一共2个,只能被分散到两个节点上,查询请求只能命中这两个节点。

解决方案:

Es 创建索引后无法动态修改分片数,但是可以动态修改副本数,增加副本数可以分散查询请求。在不改变分片数的情况下,通过调整分片的副本数,使分片副本数+原始分片数的总数为节点数基数或倍数,以达到节点负载均衡,将索引的分片副本数增加到2,加上分片自身,一共3个,刚好均分给3个节点,调整后节点cpu负载到达均衡。

慢查询

现象:

全匹配导致慢查询,一个简单的查询,耗时需要500ms

原因:

查询请求参数中使用terms条件查询如下:

{
    "terms": {
      "my_int_field": [
        5,0,0
      ]
    }
}

其中terms条件 my_int_field 字段的默认值为0,这里只查特定非0值,查询条件中使用了几乎全部记录都会被匹配的0,导致了慢查询。

开启ES慢查询日志:

默认没有开启慢查询日志,需要手动调用es api进行开启。 如下对全部索引都配置开启慢查询日志:

PUT */_settings
{
    "index.indexing.slowlog.threshold.index.debug" : "5ms",
    "index.indexing.slowlog.threshold.index.info" : "50ms",
    "index.indexing.slowlog.threshold.index.warn" : "100ms",
    "index.search.slowlog.threshold.fetch.debug" : "10ms",
    "index.search.slowlog.threshold.fetch.info" : "50ms",
    "index.search.slowlog.threshold.fetch.warn" : "100ms",
    "index.search.slowlog.threshold.query.debug" : "100ms",
    "index.search.slowlog.threshold.query.info" : "200ms",
    "index.search.slowlog.threshold.query.warn" : "500ms"
}

具体时间可以根据实际情况调整。

使用filter子句优化bool查询:

对于bool查询,must和should子句使用query context,filter和must_not使用filter context。

query context关注的是文档的匹配程度,因此查询除了关注文档是否匹配以外还需要计算匹配度得分。

filter context关注的只是文档是否匹配,没有额外计算,并且ES会自动缓存filter context的查询结果。

参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html

查询性能分析:

在kibana的dev tool中,使用search profile可以查看具体耗时分析

image

从View details中可以看到主要耗时是在should子句的计算得分

image

这里的should子句在使用filter context后,es会缓存结果,当3个节点都有缓存时耗时明显减少,在console中进行查询时基本可以在30毫秒内返回。

再对查询全匹配的错误参数进行调整,可以看到性能有明显提升:

image

terms查询优化:

将terms替换为多个term查询可以提高性能。精确匹配使用term查询,不要使用match查询。

should子句中使用了terms查询,可以看到耗时较多,类型为PointInSetQuery,这里主要耗时也是在计算得分。

image

image

将terms查询条件替换为多个term的组合查询,可以看到查询类型变成了PointRangeQuery类型,性能又得到了相当大的提升!

image

term查询数字类型的值使用range查询,查询类型会变成IndexOrDocValuesQuery,性能可以更进一步提升:

image

同样的查询场景,耗时从最开始的270ms->99ms->12ms,性能提升20多倍-.-

如果您觉得从我的分享中得到了帮助,并且希望我的博客持续发展下去,请点击支付宝捐赠,谢谢!

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#数据库#   #elk 阅读[459] 评论[0]

你可能也感兴趣的文章推荐

本文最近访客

网友185.*.*.40[火星]2021-12-05 09:59
网友116.*.*.162[火星]2021-12-05 09:48
网友157.*.*.70[Redmond]2021-12-05 09:40
网友106.*.*.52[火星]2021-12-05 09:33

发表评论