Elasticsearch常见的5个错误及应对策略

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 网罗Elasticsearch最佳实践,实际应用场景中常见错误要预知和避免,以最大化提升集群性能。

image.png

链接

1、采用动态模板

如果不定义Mapping,Elasticsearch会根据输入的数据,创建对应的Mapping,这看起来非常完美,但是Elasticsearch的动态Mapping并不总是精确的。

动态Mapping对于入门很有用,但在某些时候您需要结合业务数据指定Mapping。


举例1:5.x版本之后,需要分词的字段需要设定text类型和对应的analyzer ;仅需要精确匹配的可直接设置为keyword类型。

举例2:长文本高亮需要在text类型的基础上,设置fast-vector-highlighter高亮方式,高亮效率能提升20倍以上。


2、聚合设置不当导致OOM

在某些聚合中,没有足够的内存来支持复杂的嵌套聚合,导致聚合结果超时甚至OOM。


举例说明:


现有9亿条数据,45个索引,每条数据大小为2k左右 在查询时候,

首先要按照时间进行排序,然后做三次分组操作?

https://elasticsearch.cn/question/6323

聚合爆炸是计算问题,可能导致某些聚合的桶生成呈指数增长,并可能导致不受控制的内存使用。

Elasticsearch“terms”字段根据您的数据构建存储桶,但无法预测将提前创建多少存储桶。 对于由多个子聚合组成的父聚合,这可能会有问题。 组合每个子聚合中的唯一值可能会导致创建的桶数量大幅增加。


我们来看一个例子。


假设您有一个代表运动队的数据集。 如果你想特别关注那支球队的前10名球员和以及他们的支持球员,那么聚合将如下所示


{

"aggs" : {

"play_aggs" : {

"terms" : {

"field" : "players",

"size" : 10

},

"aggs" : {

"other_aggs" : {

"terms" : {

"field" : "players",

"size" : 5

}

}

}

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

聚合将返回前10名球员的列表以及每位顶级球员的前五名支持球员的列表 - 这样总共将返回50个值。这个看上去简单的查询可以轻而易举地消耗大量内存。


terms聚合可以显示为使用每个级别的桶的树。因此,以上聚合中每个顶级球员的桶将构成第一级,而另一个聚合中的每个支持球员的桶将构成第二级。因此,一个团队将生产n²桶。想象一下,如果您拥有5亿个文档的数据集会发生什么。


Collection Mode用于帮助控制子聚合的执行方式。聚合的默认Collection Mode称为深度优先,首先需要构建整个树,然后修剪边缘。虽然深度优先是大多数聚合的适当收集模式,但它不适用于上面的运动员聚合示例。因此,Elasticsearch允许您将特定聚合中的收集模式更改为更合适的方式。


诸如上面的示例之类的规范应该使用广度优先收集模式,该模式一次构建和修剪树一级以控制聚合爆炸。 此收集模式极大地帮助减少消耗的内存量并保持节点稳定。


{

"aggs" : {

"play_aggs" : {

"terms" : {

"field" : "players",

"size" : 10,

"collect_mode" : "breadth_first"

},

"aggs" : {

"other_aggs" : {

"terms" : {

"field" : "players",

"size" : 5

}

}

}

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

推荐阅读:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_preventing_combinatorial_explosions.html


3. ES索引设置不当

3.1 集群名称配置

ES启动的默认群集名称称为elasticsearch。 如果群集中有许多节点,最好保持命名标志尽可能一致,例如:


cluster.name:app_es_production

node.name:app_es_node_001

1

2

3.2 集群恢复设置

节点的恢复设置也很重要。 假设群集中的某些节点由于故障而重新启动,并且某些节点在其他节点之后重启。 为了使所有这些节点之间的数据保持一致,我们必须运行一致性程序,以使所有集群保持一致状态。


举例1:只要10个数据或主节点已加入群集,即可恢复。


gateway.recover_after_nodes:10

1

举例2:集群中期待启动节点达到20个以及时间超过7分钟后,集群重启或恢复。


gateway.expected_nodes:20

gateway.recover_after_time:7m

1

2

使用正确的配置,可能需要数小时的恢复缩减到只需要分钟级,极大提高工作效率。


3.3 防脑裂配置

minimum_master_nodes对于群集稳定性非常重要。 它们有助于防止脑裂。

此设置的建议值为(N / 2)+ 1 , 其中N是候选主节点的节点数。

有了这个,如果你有10个可以保存数据并成为主数据的 候选主节点,那么该值将是6。

如果您有三个专用主节点和1,000个数据节点,则该值为两个(仅计算候选主节点):

discovery.zen.minimum_master_nodes:2


4、集群不做规划,遇到问题再说

“我需要多少存储空间、多大的内存?”是用户经常问自己的问题。

1

遗憾的是,没有固定的公式,但可以采取某些步骤来协助规划资源。

推荐方法:模拟实际用例。

步骤1:创建ES集群。

步骤2:使用与生产设置所需的数据速率几乎相同的数据。

步骤3:启动节点,用真实文档填充它们,然后推送填充数据到索引分片。


在模拟实际用例过程中了解资源利用率非常重要,因为它允许您为节点保留适当的RAM量,配置JVM堆空间并优化整个测试过程。


根据模拟结果,决定实际集群的内存、CPU、磁盘容量。


5、线程池设置不合理

ES节点具有许多线程池,以便改进节点内线程的管理方式。 但是每个线程可以处理多少数据存在限制。 要跟踪此值,我们可以使用ES属性:


threadpool.bulk.queue_size:2000

1

这会向ES通知分片中的请求数,当没有可用于处理请求的线程时,新请求可以在节点中排队等待执行。 如果任务数高于此值,您将获得RemoteTransportException。 该值越高,节点机器上所需的堆空间量就越大,并且JVM堆也将被消耗。

此外,你应该在代码的开发阶段做好异常处理。


注意:ES官网不建议修改此值。


小结

Elasticsearch的使用过程中总会遇到这样、那样的问题,多总结、多思考,形成针对业务场景的有效的解决方案。

同时,也要多吸取国内外社区、论坛、博客中的精华,取长补短。


注意:网络文献一般没有涉及版本,老版本ES一些配置不一定适用于6.X最新版本,但,底层的技术永远不过时。


参考:


[1] https://logz.io/blog/the-top-5-elasticsearch-mistakes-how-to-avoid-them/

[2] https://linuxhint.com/elasticsearch-best-practices/

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
Java Spring
spring data elasticsearch: 设置保活策略|长时间不连接es,报错超时连接
java client长时间没有连接es后,再次调用访问接口,报错连接超时
1322 0
|
2月前
|
API 索引
Elasticsearch Index Shard Allocation 索引分片分配策略
Elasticsearch Index Shard Allocation 索引分片分配策略
76 1
|
4月前
|
存储 数据库
elasticsearch 主键生成策略以及如何指定特定字段为id主键列
elasticsearch 主键生成策略以及如何指定特定字段为id主键列
262 0
|
5月前
|
存储 自然语言处理 搜索推荐
深入了解Elasticsearch搜索引擎篇:倒排索引、架构设计与优化策略
首先,我们介绍了Elasticsearch(ES)的倒排索引,这是一种用于快速检索的数据结构。其次,我们了解了ES集群的架构,包括主节点、数据节点和协调节点的功能和作用。然后,我们探讨了中文分词器的选择,其中包括IK、HanLP和Jieba等常用的分词工具。接着,我们解释了写入数据和查询数据的工作原理,包括请求的分配和预处理,数据的存储和查询结果的处理过程。最后,我们讨论了ES部署的优化方法,包括调整JVM内存、分片布局和数量、节点身份设计以及配置Ingest节点等方面的策略。
深入了解Elasticsearch搜索引擎篇:倒排索引、架构设计与优化策略
|
11月前
|
算法
白话Elasticsearch14-深度探秘搜索技术之基于multi_match 使用most_fields策略进行cross-fields search弊端
白话Elasticsearch14-深度探秘搜索技术之基于multi_match 使用most_fields策略进行cross-fields search弊端
65 0
|
11月前
|
搜索推荐 C++
白话Elasticsearch13-深度探秘搜索技术之基于multi_match+most fields策略进行multi-field搜索
白话Elasticsearch13-深度探秘搜索技术之基于multi_match+most fields策略进行multi-field搜索
55 0
|
11月前
|
Java Apache 索引
白话Elasticsearch10-深度探秘搜索技术之基于dis_max实现best fields策略进行多字段搜索
白话Elasticsearch10-深度探秘搜索技术之基于dis_max实现best fields策略进行多字段搜索
50 0
|
安全
ElasticSearch错误:uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException
ElasticSearch错误:uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException
236 0
|
Java 测试技术 索引
Elasticsearch索引分片的数量及大小分配策略
Elasticsearch索引分片的数量及大小分配策略
|
测试技术 API 索引

热门文章

最新文章