题记:
技术交流群中有小伙伴说起:“es 节点默认1000 个分片的限制”?这引起了我对Elasticsearch 默认值的关注。html
我一搜没关系:聊天记录中涉及“默认”关键词的讨论接近 400 多处。node
这些默认值对于架构选型、开发实战、运维排查性能问题等都有很好的借鉴价值,虽官方文档都有详细论述,但散落在各个角度。git
处于本能的好奇心,我认为很是有必要结合本身的实战经历梳理出 Elasticsearch 最经常使用的默认值的适用场景、参数、默认值大小、静态/动态参数类型、实战建议等知识点。github
没别的,让更多人提早创建全局(相对)认知、少走弯路。redis
0、参数类型以及静态和动态参数的区别?
0.1参数类型
参数类型分为:集群级别参数、索引级别、Maping级别参数等。算法
0.1.1集群级别参数
举例1 :cluster.max_shards_per_node
前缀是:cluster.*,修改针对集群生效。api
举例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 是动态参数。app
如下内容分别从:集群层面、索引层面、映射层面、其余经常使用逐步展开讲解。
一、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
二、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)必定数据量级后,分片数量过少,没法充分利用多节点资源,机器资源不均衡。
三、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
四、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)磁盘使用率也是监控的一个核心指标之一。
五、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
六、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”系统属性来修改此限制。
七、ES 索引默认压缩算法是?
适用场景:写入数据压缩。
参数:index.codec
参数类型:静态参数。
默认值:LZ4
使用建议:
(1)能够将其设置为best_compression,它使用DEFLATE以得到更高的压缩率,但代价是存储字段的性能较慢。
(2)不追求压缩效率,追求磁盘占用比低的用户推荐 best_compression 压缩。
八、ES 索引默认副本分片数?
适用场景:确保业务数据的高可用性。
参数:index.number_of_replicas
参数类型:动态参数
默认值:1
使用建议:
根据业务须要合理设置副本,基于数据安全性考虑,建议副本至少设置1。
九、ES 索引默认的刷新频率?
适用场景:写入到可搜索的最小时间间隔(单位s)。
参数:index.refresh_interval
参数类型:动态参数。
默认最小值:1s。
使用建议:对于实时性要求不高且想优化写入的业务场景,建议根据业务实际调大刷新频率。
十、ES 索引 terms 默认最大支持的长度是?
适用场景:Terms query。
参数:index.max_terms_count
参数类型:动态参数
默认最大值:65536
使用建议:通常不会超过此最大值。
十一、ES 索引默认分页返回最大条数?
适用场景:搜索的深度翻页。
参数:index.max_result_window
参数类型:动态参数。
默认最大值:10000。
使用建议:
(1)深度翻页的机制,决定了越日后越慢。除非特殊业务需求,不建议修改默认值,能够参考百度和google的实现。
(2)所有数据遍历推荐scroll API。仅支持向后翻页推荐:Search After API。
十二、ES 索引默认管道有必要设置吗?
适用场景:索引默认写入数据环节加上 ETL 操做。
参数:index.default_pipeline
参数类型:动态参数
默认值:自定义管道
使用建议:
(1)结合实际业务须要,一些基础须要ETL的功能建议加上。
(2)若是不加index.default_pipeline也能够,update_by_query + 自定义 pipeline 结合也能实现。不过(1)是更周全、简练的方案。
1三、ES 索引 Mapping 默认支持最大字段数?
使用场景:防止索引Maping 横向无限增大,致使内存泄露等异常。
参数:index.mapping.total_fields.limit
参数类型:动态参数
默认最大值:1000
使用建议;不建议修改
1四、ES 索引 Mapping字段默认的最大深度?
使用场景:防止索引Maping 纵向无限增大,致使异常。
参数:index.mapping.depth.limit
参数类型:动态参数
默认最大值:20
使用建议;不建议修改
计算依据:例如,若是全部字段都在根对象级别定义,则深度为1。若是有一个对象映射,则深度为2,依此类推。默认值为20。
1五、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类型。
1六、ES 索引动态Mapping条件下,匹配的字符串默认匹配的是?
适用场景:不提早设置Mapping精准字段的场景。
默认类型:text + keyword类型。
实战举例以下:
{
"my_index_0001" : {
"mappings" : {
"properties" : {
"cont" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
实际建议:建议结合业务须要,提早精准设置Mapping,并优化数据建模。
1七、ES 默认的评分机制是?
默认值:BM 25
除非业务须要,不然不建议修改。https://www.elastic.co/guide/en/elasticsearch/reference/current/similarity.html
1八、ES keyword类型默认支持的字符数是多少?
1)ES5.X版本之后,keyword支持的最大长度为32766个UTF-8字符,text对字符长度没有限制。
2)设置ignore_above后,超过给定长度后的数据将不被索引,没法经过term精确匹配检索返回结果。
https://blog.csdn.net/laoyang360/article/details/78207980
1九、为何说,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
2一、ES客户端请求的节点默认是?
若是不明确指定协调节点,默认请求的节点充当协调节点的角色。
每一个节点都隐式地是一个协调节点。协调节点:须要具备足够的内存和CPU才能处理收集阶段。
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html
2二、ES 默认分词器?
适用场景:不明确指定分词器的场景。
默认类型:analyzer 分词器。
实战举例以下:
POST /_analyze
{
"text": "屹立在东方之林",
"analyzer": "standard"
}
切分结果:
屹
立
在
东
方
之
林
实战建议:_analyze API 在解决分词问题中的做用巨大!
2三、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"
}
}
}
}
2四、ES 默认堆内存大小?
默认值:2gB,建议必定结合实际机器环境修改。
ES 建议独立机器环境部署,不和其余进程:如logstash,hadoop,redis等共享机器资源。
JVM设置建议:min(31GB, 机器内存的一半)
2五、ES JDK 什么版本开始默认自带的?
7.0 版本。7.0 版本以后开始默认捆绑了 JDK(安装包里自带JDK),所以咱们能够不单独安装 JDK。
小结
没有别的,我就是好奇!
大而全的建议参考官方文档,上述25个默认值都是死磕Elasticsearch交流群中提到的实战问题。