好奇?!Elasticsearch 25 个必知必会的默认值

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 我一搜不要紧:聊天记录中涉及“默认”关键词的讨论接近 400 多处。这些默认值对于架构选型、开发实战、运维排查性能问题等都有很好的借鉴价值,虽官方文档都有详细论述,但散落在各个角度。处于本能的好奇心,我认为非常有必要结合自己的实战经历梳理出 Elasticsearch 最常用的默认值的适用场景、参数、默认值大小、静态/动态参数类型、实战建议等知识点。

image.png

链接

没别的,让更多人提前建立全局(相对)认知、少走弯路。


0、参数类型以及静态和动态参数的区别?

0.1参数类型

参数类型分为:集群级别参数、索引级别、Maping级别参数等。


0.1.1集群级别参数


举例1 :cluster.max_shards_per_node


前缀是:cluster.*,修改针对集群生效。


举例2:indices.query.bool.max_clause_count


需要在: elasticsearch.yml 配置文件中设置,重启 ES 生效。


0.1.2 索引级别参数


举例:index.number_of_shards


前缀是:index.*,修改针对索引生效。


0.2 区分静态参数和动态参数

Elasticsearch 主分片数在索引创建之后,不可以修改(除非reindex)


index.number_of_shards 是静态参数。


但副本分片数,可以动态的借助:update-index-settings API 任意调整。


index.number_of_replicas 是动态参数。


以下内容分别从:集群层面、索引层面、映射层面、其他常用逐步展开讲解。


1、ES 集群 bool 类型默认支持最大子句个数?

适用场景:N 多子句的bool 组合查询,实现类似规则过滤的功能。


参数:indices.query.bool.max_clause_count。


参数类型:静态参数(需要在elasticsearch.yml 中设置)


默认最大值:1024。


限制原因:为了防止搜索子句过多而占用过多的CPU和内存,导致集群性能下降 。


https://www.elastic.co/guide/en/elasticsearch/reference/current/search-settings.html


2、ES 集群数据节点支持默认分片数个数?

适用场景:大数据量的集群分片选型。


参数:cluster.max_shards_per_node


默认最大值:1000(7.X版本后)。


扩展知识:(1)超大规模集群会遇到这个问题:


1)每个节点可以存储的分片数和可用的堆内存大小成正比关系。


2)Elastic 官方博客文章建议:堆内存和分片的配置比例为1:20,举例:30GB堆内存,最多可有600个分片。


https://www.elastic.co/guide/en/elasticsearch/reference/7.0/misc-cluster.html#cluster-shard-limit


https://github.com/elastic/kibana/issues/35529


(2)不合理分配可能问题:


1)分片数量过多,写入放大,导致  bulk queue打满,拒绝率上升;


2)一定数据量级后,分片数量过少,无法充分利用多节点资源,机器资源不均衡。


3、ES 集群 index_buffer 默认比例是多少?

适用场景:堆内存中索引缓冲区用于存储新索引的文档。填满后,缓冲区中的文档将写入磁盘上的某个段。它在节点上的所有分片之间划分。


参数:


(1) indices.memory.index_buffer_size


(2) indices.memory.min_index_buffer_size


(3) indices.memory.max_index_buffer_size


参数类型:静态参数(需要在elasticsearch.yml 中设置)


默认值:


(1)indices.memory.index_buffer_size: 10%


(2)indices.memory.min_index_buffer_size : 48 Mb


使用建议:


(1)必须在集群中的每个数据节点上进行配置。


(2)写入优化中首选的优化参数之一,有助于提高写入性能和稳定性。


https://www.elastic.co/guide/en/elasticsearch/reference/current/indexing-buffer.html


4、ES 默认磁盘使用率 85% 不再支持写入数据吗?

适用场景:基于磁盘分配分片的参数之一,控制磁盘的使用率低警戒水位线值。


参数:cluster.routing.allocation.disk.watermark.low/high/flood_stage


默认值


(1)cluster.routing.allocation.disk.watermark.low:85%


(2)cluster.routing.allocation.disk.watermark.high:90%


(3)cluster.routing.allocation.disk.watermark.flood_stage:95%


参数类型:集群动态参数


使用建议


(1)85%:禁止写入;90%:索引分片迁移到其他可用节点;95%:索引只读。


(2)磁盘使用率也是监控的一个核心指标之一。


5、ES 集群 默认的 gc 方式?

适用场景:写入到可搜索的最小时间间隔(单位s)。


默认参数:


-XX:+UseConcMarkSweepGC

-XX:CMSInitiatingOccupancyFraction=75

-XX:+UseCMSInitiatingOccupancyOnly

使用建议


(1)官方建议:


目前,我们仍然认为CMS垃圾收集器是大多数部署的最佳选择,但是自ES 6.5.0(如果在JDK 11或更高版本上运行)以来,我们现在也支持G1GC。


https://github.com/elastic/elasticsearch/issues/44321


(2)配置位置:jvm.options, 优化参考 wood 大叔建议:更改为


-XX:+UseG1GC

-XX:MaxGCPauseMillis=50

其中 -XX:MaxGCPauseMillis 是控制预期的最高GC时长,默认值为 200ms ,如果线上业务特性对于GC停顿非常敏感,可以适当设置低一些。但是 这个值如果设置过小,可能会带来比较高的cpu消耗。


G1 对于集群正常运作的情况下减轻 G1 停顿对服务时延的影响还是很有效的,但是如果是 GC 导致集群卡死,那么很有可能换G1 也无法根本上解决问题。通常都是集群的数据模型或者 Query 需要优化。


https://elasticsearch.cn/question/4589


6、ES 索引默认主分片分片大小?

适用场景:数据存储。


参数:index.number_of_shards


参数类型:静态参数。


默认值:1(7.X版本,早期版本是5);单索引最大支持分片数:1024。


使用建议:


(1)只能在创建索引时设置此值。


(2)单索引1024个最大分片数的限制是一项安全限制,可防止因资源分配问题导致集群不稳定。


(3)可通过在每个节点上指定export ES_JAVA_OPTS =“-Des.index.max_number_of_shards = 128”系统属性来修改此限制。


7、ES 索引默认压缩算法是?

适用场景:写入数据压缩。


参数:index.codec


参数类型:静态参数。


默认值:LZ4


使用建议:


(1)可以将其设置为best_compression,它使用DEFLATE以获得更高的压缩率,但代价是存储字段的性能较慢。


(2)不追求压缩效率,追求磁盘占用比低的用户推荐 best_compression 压缩。


8、ES 索引默认副本分片数?

适用场景:确保业务数据的高可用性。


参数:index.number_of_replicas


参数类型:动态参数


默认值:1


使用建议:


根据业务需要合理设置副本,基于数据安全性考虑,建议副本至少设置1。


9、ES 索引默认的刷新频率?

适用场景:写入到可搜索的最小时间间隔(单位s)。


参数:index.refresh_interval


参数类型:动态参数。


默认最小值:1s。


使用建议:对于实时性要求不高且想优化写入的业务场景,建议根据业务实际调大刷新频率。


10、ES 索引 terms 默认最大支持的长度是?

适用场景:Terms query。


参数:index.max_terms_count


参数类型:动态参数


默认最大值:65536


使用建议:一般不会超过此最大值。


11、ES 索引默认分页返回最大条数?

适用场景:搜索的深度翻页。


参数:index.max_result_window


参数类型:动态参数。


默认最大值:10000。


使用建议:


(1)深度翻页的机制,决定了越往后越慢。除非特殊业务需求,不建议修改默认值,可以参考百度和google的实现。


(2)全部数据遍历推荐scroll API。仅支持向后翻页推荐:Search After API。


12、ES 索引默认管道有必要设置吗?

适用场景:索引默认写入数据环节加上 ETL 操作。


参数:index.default_pipeline


参数类型:动态参数


默认值:自定义管道


使用建议:


(1)结合实际业务需要,一些基础需要ETL的功能建议加上。


(2)如果不加index.default_pipeline也可以,update_by_query + 自定义 pipeline 结合也能实现。不过(1)是更周全、简练的方案。


13、ES 索引 Mapping 默认支持最大字段数?

使用场景:防止索引Maping 横向无限增大,导致内存泄露等异常。


参数:index.mapping.total_fields.limit


参数类型:动态参数


默认最大值:1000


使用建议;不建议修改


14、ES 索引 Mapping字段默认的最大深度?

使用场景:防止索引Maping 纵向无限增大,导致异常。


参数:index.mapping.depth.limit


参数类型:动态参数


默认最大值:20


使用建议;不建议修改


计算依据:例如,如果所有字段都在根对象级别定义,则深度为1。如果有一个对象映射,则深度为2,依此类推。默认值为20。


15、ES  索引 Mapping nested 默认支持大小?

适用场景:nested 类型选型。


参数:


(1)index.mapping.nested_fields.limit


一个索引最大支持的nested类型个数


(2)index.mapping.nested_objects.limit


一个nested类型支持的最大对象数


参数类型:动态参数(已验证)


默认值:


(1)index.mapping.nested_fields.limit : 50


(2)index.mapping.nested_objects.limit : 10000


使用建议:


(1)nested 的可能的性能问题不容小觑。


nested本质:每个嵌套对象都被索引为一个单独的Lucene文档。如果我们为包含100个用户对象的单个文档建立索引,则将创建101个Lucene文档。


(2) nested 较 父子文档不同之处:


如果子文档频繁更新,建议使用父子文档。


如果子文档不频繁更新,查询频繁建议  nested类型。


16、ES 索引动态Mapping条件下,匹配的字符串默认匹配的是?

适用场景:不提前设置Mapping精准字段的场景。


默认类型:text + keyword类型。


实战举例如下:


{

 "my_index_0001" : {

   "mappings" : {

     "properties" : {

       "cont" : {

         "type" : "text",

         "fields" : {

           "keyword" : {

             "type" : "keyword",

             "ignore_above" : 256

           }

         }

       }

     }

   }

 }

}

实际建议:建议结合业务需要,提前精准设置Mapping,并优化数据建模。


17、ES 默认的评分机制是?

默认值:BM 25


除非业务需要,否则不建议修改。https://www.elastic.co/guide/en/elasticsearch/reference/current/similarity.html


18、ES keyword类型默认支持的字符数是多少?

1)ES5.X版本以后,keyword支持的最大长度为32766个UTF-8字符,text对字符长度没有限制。


2)设置ignore_above后,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。


https://blog.csdn.net/laoyang360/article/details/78207980


19、为什么说,ES 默认不适用别名,不算入门ES?

一句话概括:别名可以零停机改造(经典技巧,无缝切换)。https://www.elastic.co/guide/en/elasticsearch/reference/6.8/indices-aliases.html


20、ES 集群节点默认属性值?

默认:候选主节点、数据节点、Ingest节点、协调节点、机器学习节点(如果付费)的角色。


建议:集群规模到达一定量级后,一定要独立设置专有的主节点、协调节点、数据节点。角色划分清楚。


https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html


21、ES客户端请求的节点默认是?

如果不明确指定协调节点,默认请求的节点充当协调节点的角色。


每个节点都隐式地是一个协调节点。协调节点:需要具有足够的内存和CPU才能处理收集阶段。


https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html


22、ES 默认分词器?

适用场景:不明确指定分词器的场景。


默认类型:analyzer 分词器。


实战举例如下:


POST /_analyze

{

 "text": "屹立在东方之林",

 "analyzer": "standard"

}

切分结果:


实战建议:_analyze API 在解决分词问题中的作用巨大!


23、ES 聚合默认UTC时间,可以修改吗?

可以聚合时候修改,设置时区 time_zone即可解决。


"+08:00": 代表东8区。


GET my_index/_search?size=0

{

 "aggs": {

   "by_day": {

     "date_histogram": {

       "field":     "date",

       "calendar_interval":  "day",

       "time_zone": "+08:00"

     }

   }

 }

}

24、ES 默认堆内存大小?

默认值:2gB,建议一定结合实际机器环境修改。


ES 建议独立机器环境部署,不和其他进程:如logstash,hadoop,redis等共享机器资源。


JVM设置建议:min(31GB, 机器内存的一半)


25、ES JDK 什么版本开始默认自带的?

7.0 版本。7.0 版本之后开始默认捆绑了 JDK(安装包里自带JDK),因此我们可以不单独安装 JDK。


小结

没有别的,我就是好奇!

image.png

大而全的建议参考官方文档,上述25个默认值都是死磕Elasticsearch交流群中提到的实战问题。


您的实战中有遇到默认值的困惑,欢迎留言交流。


索引(动态/静态)设置参考:


https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
Java Linux
白话Elasticsearch69-ES生产集群部署重要的 Elasticsearch参数设置
白话Elasticsearch69-ES生产集群部署重要的 Elasticsearch参数设置
118 1
|
SQL 数据建模 索引
Elasticsearch 空值处理实战指南
1、引言 实战业务场景中,经常会遇到定义空值、检索指定空值数据的情况。 这时候,当我们翻看官方文档 null_value 部分,会看到如下的描述: Accepts a string value which is substituted for any explicit null values. Defaults to null, which means the field is treated as missing. 接受一个字符串值替换所有显式的空值。默认为null,这意味着该字段被视为丢失。 A null value cannot be indexed or searched. W
1127 0
Elasticsearch 空值处理实战指南
|
存储 自然语言处理 负载均衡
Elasticsearch基础知识补齐
Elasticsearch基础知识补齐
133 0
|
自然语言处理 Java API
【ElasticSearch从入门到放弃系列 十一】Elasticsearch常用查询方式讨论及实践(一)
【ElasticSearch从入门到放弃系列 十一】Elasticsearch常用查询方式讨论及实践
134 0
|
SQL 关系型数据库 MySQL
【ElasticSearch从入门到放弃系列 十一】Elasticsearch常用查询方式讨论及实践(五)
【ElasticSearch从入门到放弃系列 十一】Elasticsearch常用查询方式讨论及实践(五)
88 0
|
自然语言处理
【ElasticSearch从入门到放弃系列 十一】Elasticsearch常用查询方式讨论及实践(二)
【ElasticSearch从入门到放弃系列 十一】Elasticsearch常用查询方式讨论及实践(二)
79 0
|
缓存
【ElasticSearch从入门到放弃系列 十一】Elasticsearch常用查询方式讨论及实践(三)
【ElasticSearch从入门到放弃系列 十一】Elasticsearch常用查询方式讨论及实践(三)
86 0
【ElasticSearch从入门到放弃系列 十一】Elasticsearch常用查询方式讨论及实践(四)
【ElasticSearch从入门到放弃系列 十一】Elasticsearch常用查询方式讨论及实践(四)
68 0
|
存储 SQL 缓存
【ElasticSearch从入门到放弃系列 十】Elasticsearch深度分页查询方式讨论
【ElasticSearch从入门到放弃系列 十】Elasticsearch深度分页查询方式讨论
170 0