30 个 ElasticSearch 调优知识点,都给你整理好了!,java面试你在项目中遇到的困难

5.使用自动生成的id(auto-generated ids)

索引具有显式id的文档时,Elasticsearch需要检查具有相同id的文档是否已经存在于相同的分片中,这是昂贵的操作,并且随着索引增长而变得更加昂贵。通过使用自动生成的ID,Elasticsearch可以跳过这个检查,这使索引更快。

6.买更好的硬件

搜索一般是I/O 密集的,此时,你需要

  1. 为filesystem cache分配更多的内存

  2. 使用SSD硬盘

  3. 使用local storage(不要使用NFS、SMB 等remote filesystem)

  4. 亚马逊的 弹性块存储(Elastic Block Storage)也是极好的,当然,和local storage比起来,它还是要慢点

如果你的搜索是 CPU-密集的,买好的CPU吧

7.加大 indexing buffer size

如果你的节点只做大量的索引,确保index.memory.indexbuffersize足够大,每个分区最多可以提供512 MB的索引缓冲区,而且索引的性能通常不会提高。Elasticsearch采用该设置(java堆的一个百分比或绝对字节大小),并将其用作所有活动分片的共享缓冲区。非常活跃的碎片自然会使用这个缓冲区,而不是执行轻量级索引的碎片。

默认值是10%,通常很多:例如,如果你给JVM 10GB的内存,它会给索引缓冲区1GB,这足以承载两个索引很重的分片。

8.禁用fieldnames字段

fieldnames字段引入了一些索引时间开销,所以如果您不需要运行存在查询,您可能需要禁用它。(fieldnames:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-field-names-field.html)

9.剩下的,再去看看 “调优 磁盘使用”吧

(https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-disk-usage.html)中有许多磁盘使用策略也提高了索引速度。微信搜索Java笔记虾,回复“Java进阶资源”,获取微服务等进阶视频资源

第二部分-调优搜索速度


1.filesystem cache越大越好

为了使得搜索速度更快, es严重依赖filesystem cache

一般来说,需要至少一半的 可用内存 作为filesystem cache,这样es可以在物理内存中 保有 索引的热点区域(hot regions of the index)

2.用更好的硬件

搜索一般是I/O bound的,此时,你需要

  • 为filesystem cache分配更多的内存

  • 使用SSD硬盘

  • 使用local storage(不要使用NFS、SMB 等remote filesystem)

  • 亚马逊的 弹性块存储(Elastic Block Storage)也是极好的,当然,和local storage比起来,它还是要慢点

如果你的搜索是 CPU-bound,买好的CPU吧

3.文档模型(document modeling)

文档需要使用合适的类型,从而使得 search-time operations 消耗更少的资源。咋作呢?答:避免 join操作。具体是指

  • nested 会使得查询慢 好几倍

  • parent-child关系 更是使得查询慢几百倍

如果 无需join 能解决问题,则查询速度会快很多

4.预索引 数据

根据“搜索数据最常用的方式”来最优化索引数据的方式

举个例子:所有文档都有price字段,大部分query 在 fixed ranges 上运行 range aggregation。你可以把给定范围的数据 预先索引下。然后,使用 terms aggregation

5.Mappings(能用 keyword 最好了)

数字类型的数据,并不意味着一定非得使用numeric类型的字段。

一般来说,存储标识符的 字段(书号ISBN、或来自数据库的 标识一条记录的 数字),使用keyword更好(integer,long 不好哦,亲)

6.避免运行脚本

一般来说,脚本应该避免。如果他们是绝对需要的,你应该使用painless和expressions引擎。

7.搜索rounded 日期

日期字段上使用now,一般来说不会被缓存。但,rounded date则可以利用上query cache

rounded到分钟等

8.强制merge只读的index

只读的index可以从“merge成 一个单独的 大segment”中收益

9.预热 全局序数(global ordinals)

全局序数 用于 在 keyword字段上 运行 terms aggregations

es不知道 哪些fields 将 用于/不用于 term aggregation,因此 全局序数 在需要时才加载进内存

但,可以在mapping type上,定义 eagerglobalordinals==true,这样,refresh时就会加载 全局序数

10.预热 filesystem cache

机器重启时,filesystem cache就被清空。OS将index的热点区域(hot regions of the index)加载进filesystem cache是需要花费一段时间的。

设置 index.store.preload 可以告知OS 这些文件需要提早加载进入内存

11.使用索引排序来加速连接

索引排序对于以较慢的索引为代价来加快连接速度非常有用。在索引分类文档中阅读更多关于它的信息。

12.使用preference来优化高速缓存利用率

有多个缓存可以帮助提高搜索性能,例如文件系统缓存,请求缓存或查询缓存。然而,所有这些缓存都维护在节点级别,这意味着如果连续运行两次相同的请求,则有一个或多个副本,并使用循环(默认路由算法),那么这两个请求将转到不同的分片副本,阻止节点级别的缓存帮助。

由于搜索应用程序的用户一个接一个地运行类似的请求是常见的,例如为了分析索引的较窄的子集,使用标识当前用户或会话的优选值可以帮助优化高速缓存的使用。

13.副本可能有助于吞吐量,但不会一直存在

除了提高弹性外,副本可以帮助提高吞吐量。例如,如果您有单个分片索引和三个节点,则需要将副本数设置为2,以便共有3个分片副本,以便使用所有节点。

现在假设你有一个2-shards索引和两个节点。在一种情况下,副本的数量是0,这意味着每个节点拥有一个分片。在第二种情况下,副本的数量是1,这意味着每个节点都有两个碎片。哪个设置在搜索性能方面表现最好?通常情况下,每个节点的碎片数少的设置将会更好。

原因在于它将可用文件系统缓存的份额提高到了每个碎片,而文件系统缓存可能是Elasticsearch的1号性能因子。同时,要注意,没有副本的设置在发生单个节点故障的情况下会出现故障,因此在吞吐量和可用性之间进行权衡。

那么复制品的数量是多少?如果您有一个具有numnodes节点的群集,那么numprimaries总共是主分片,如果您希望能够一次处理maxfailures节点故障,那么正确的副本数是max(maxfailures,ceil(numnodes / numprimaries) - 1)。

14.打开自适应副本选择

当存在多个数据副本时,elasticsearch可以使用一组称为自适应副本选择的标准,根据包含分片的每个副本的节点的响应时间,服务时间和队列大小来选择数据的最佳副本。这可以提高查询吞吐量并减少搜索量大的应用程序的延迟。

第三部分:通用的一些建议


1、不要 返回大的结果集

es设计来作为搜索引擎,它非常擅长返回匹配query的top n文档。但,如“返回满足某个query的 所有文档”等数据库领域的工作,并不是es最擅长的领域。如果你确实需要返回所有文档,你可以使用Scroll API

2、避免 大的doc。即,单个doc 小了 会更好

given that(考虑到) http.maxcontextlength默认==100MB,es拒绝索引操作100MB的文档。当然你可以提高这个限制,但,Lucene本身也有限制的,其为2GB 即使不考虑上面的限制,大的doc 会给 network/memory/disk带来更大的压力;

  • 任何搜索请求,都需要获取 _id 字段,由于filesystem cache工作方式。即使它不请求 _source字段,获取大doc _id 字段消耗更大

  • 索引大doc时消耗内存会是 doc本身大小 的好几倍

  • 大doc的 proximity search, highlighting 也更加昂贵。它们的消耗直接取决于doc本身的大小

3、避免 稀疏

  • 不相关数据 不要 放入同一个索引

  • 一般化文档结构(Normalize document structures)

  • 避免类型

  • 在 稀疏 字段上,禁用 norms & doc_values 属性

稀疏为什么不好?

Lucene背后的数据结构 更擅长处理 紧凑的数据

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习

已经将知识体系整理好(源码,笔记,PPT,学习视频)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

最后

我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习

已经将知识体系整理好(源码,笔记,PPT,学习视频)

[外链图片转存中…(img-tTJrunOW-1712598097427)]

[外链图片转存中…(img-07ecLvPw-1712598097427)]

[外链图片转存中…(img-NAKhs8rK-1712598097427)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-ywhnDvko-1712598097428)]

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值