死磕elasticsearch(七)搜索速度优化
文章目录
- 1 为文件系统cache预留足够的内存
- 2 使用更快的硬件
- 3 文档模型
- 4 预索引数据
- 5 避免使用脚本
- 6 优化日期搜索
- 7 为只读索引执行force-merge
- 8 预热文件系统cache
- 9 调节搜索请求中的batched_reduce_size
- 10 利用自适应副本选择(ARS)提升ES响应速 度
1 为文件系统cache预留足够的内存
在一般情况下,应用程序的读写都会被操作系统“cache”(除了 direct方式),cache保存在系统物理内存中(线上应该禁用swap),命中 cache可以降低对磁盘的直接访问频率。搜索很依赖对系统 cache 的命中,如果某个请求需要从磁盘读取数据,则一定会产生相对较高的延 迟。应该至少为系统cache预留一半的可用物理内存,更大的内存有更 高的cache命中率。
2 使用更快的硬件
写入性能对CPU的性能更敏感,而搜索性能在一般情况下更多的是 在于I/O能力。
- 使用SSD会比旋转类存储介质好得多。
- 尽量避免使用 NFS 等远程文件系统,如果 NFS 比本地存储慢3倍,则在搜索场景下响 应速度可能会慢10倍左右。
这可能是因为搜索请求有更多的随机访问。 如果搜索类型属于计算比较多,则可以考虑使用更快的CPU。
3 文档模型
为了让搜索时的成本更低,文档应该合理建模。特别是应该避免:
join操作,嵌套(nested)会使查询慢几倍。父子(parent-child)关系可能使查询慢数百倍。
因此,如果可以通过非规范化(denormalizing)文 档来回答相同的问题,则可以显著地提高搜索速度。
4 预索引数据
还可以针对某些查询的模式来优化数据的索引方式。例如,如果所 有文档都有一个 price字段,并且大多数查询在一个固定的范围上运行 range聚合,那么可以通过将范围“pre-indexing”到索引中并使用terms聚 合来加快聚合速度。
5 避免使用脚本
一般来说,应该避免使用脚本。如果一定要用,则应该优先考虑 painless和expressions。
6 优化日期搜索
在使用日期范围检索时,使用now的查询通常不能缓存,因为匹配 到的范围一直在变化。但是,从用户体验的角度来看,切换到一个完整的日期通常是可以接受的,这样可以更好地利用查询缓存。
7 为只读索引执行force-merge
为不再更新的只读索引执行force merge,将Lucene索引合并为单个 分段,可以提升查询速度。当一个Lucene索引存在多个分段时,每个分段会单独执行搜索再将结果合并,将只读索引强制合并为一个Lucene分 段不仅可以优化搜索过程,对索引恢复速度也有好处。
基于日期进行轮询的索引的旧数据一般都不会再更新。此前的章节 中说过,应该避免持续地写一个固定的索引,直到它巨大无比,而应该 按一定的策略,例如,每天生成一个新的索引,然后用别名关联,或者 使用索引通配符。这样,可以每天选一个时间点对昨天的索引执行 force-merge、Shrink等操作。
8 预热文件系统cache
如果ES主机重启,则文件系统缓存将为空,此时搜索会比较慢。可 以使用index.store.preload设置,通过指定文件扩展名,显式地告诉操作 系统应该将哪些文件加载到内存中。
如果文件系统缓存不够大,则无法保存所有数据,那么为太多文件 预加载数据到文件系统缓存中会使搜索速度变慢,应谨慎使用。
9 调节搜索请求中的batched_reduce_size
该字段是搜索请求中的一个参数。默认情况下,聚合操作在协调节 点需要等所有的分片都取回结果后才执行,使用 batched_reduce_size 参 数可以不等待全部分片返回结果,而是在指定数量的分片返回结果之后 就可以先处理一部分(reduce)。这样可以避免协调节点在等待全部结 果的过程中占用大量内存,避免极端情况下可能导致的OOM。该字段 的默认值为512,从ES 5.4开始支持。
10 利用自适应副本选择(ARS)提升ES响应速 度
为了充分利用计算资源和负载均衡,协调节点将搜索请求轮询转发 到分片的每个副本,轮询策略是负载均衡过程中最简单的策略,任何一 个负载均衡器都具备这种基础的策略,缺点是不考虑后端实际系统压力 和健康水平。
例如,一个分片的三个副本分布在三个节点上,其中Node2可能因 为长时间GC、磁盘I/O过高、网络带宽跑满等原因处于忙碌状态,如下图所示。
如果搜索请求被转发到副本2,则会看到相对于其他分片来说,副 本2有更高的延迟。 · 分片副本1:100ms。
· 分片副本2(degraded):1350ms。
· 分片副本3:150ms。
由于副本2的高延迟,使得整个搜索请求产生长尾效应。
ES希望这个过程足够智能,能够将请求路由到其他数据副本,直到 该节点恢复到足以处理更多搜索请求的程度。在ES中,此过程称为“自 适应副本选择”。
ES的ARS实现基于这样一个设定:对每个搜索请求,将分片的每个 副本进行排序,以确定哪个最可能是转发请求的“最佳”副本。与轮询方 式向分片的每个副本发送请求不同,ES选择“最佳”副本并将请求路由到那里。
死磕elasticsearch(七)搜索速度优化相关推荐
- Elasticsearch优化——搜索速度优化
Elasticsearch优化--搜索速度优化 文章目录 Elasticsearch优化--搜索速度优化 1. 为文件系统cache预留足够的内存 2. 使用更快的硬件 3. 文档模型 4. 预索引数 ...
- ElasticSearch(七) 搜索
title: ElasticSearch(七) 搜索 tags: ElasticSearch author: Clown95 搜索 在前面,已经介绍了在ElasticSearch索引中处理数据的基础知 ...
- Elasricsearch搜索速度优化
Elasricsearch搜索速度优化 1.合理设置副本数量 增加副本,可以提升搜索的能力. 如果副本设置过多,会对服务器造成额外的压力,因为主分片需要给所有副本同步数据.另外,副本过多也会占用磁盘空 ...
- 如何系统学习ElasticSearch、Kibana、Logstash:死磕 Elasticsearch 方法论(初学者必看)
目录 一.ELK Stack 的应用场景 场景一:使用 ES 作为业务系统的后端. 场景二:在原有系统中增加 ES.Logstash.Kibana等. 场景三:使用 ELK Stack 结合现有工具对 ...
- 死磕 Elasticsearch 方法论:普通程序员高效精进的 10 大狠招!
人工智能.大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需.Elasticsearch 作为开源领域的后起之秀,从 2010 年至今得到飞跃式的发展.Elasticsear ...
- Elasticsearch 异步搜索 Async search 实战
1.Elasticsearch 异步搜索定义 异步搜索 API 可异步执行搜索请求.监控其进度并检索可用的部分结果. 如下的官方介绍动画,能更加生动的介绍清楚异步检索. 传统检索 VS 异步检索,在数 ...
- elasticsearch 生产级别深度优化
这是一篇转自别人的文章,真的讲的很详细.已经读了很多遍,分享给大家. 贴上原文地址(原文将了很多内容,这是优化方面摘取出来的):https://www.cnblogs.com/kevingrace/p ...
- 总是搜不到想要的内容?Elasticsearch搜索排名优化了解一下
导语 | Elasticsearch(下文简称ES) 是当前热门的开源全文搜索引擎,利用它我们可以方便快捷搭建出搜索平台,但通用的配置还需要根据平台内容的具体情况做进一步优化,才能产生令用户满意的搜索 ...
- 【Elasticsearch】es 提高 搜索速度
1.概述 官网:Tune for search speededit 将内存分配给文件系统缓存 Elasticsearch严重依赖于文件系统缓存,以加快搜索速度.通常,您应该确保至少有一半的可用内存分配 ...
最新文章
- AI学习与进阶实践-基于行业价值的AI学习与进阶路径
- lcx转发3389数据
- 本机不装Oracle,使用plsql连接远程Oracle的方法
- python学习------面向对象进阶
- Java实现 LeetCode 75 颜色分类
- 蓝牙耳机哪个牌子好?国庆出游蓝牙耳机推荐
- 感恩母亲节主题活动照片作品征集小程序
- 提高电脑速度的超多方法。
- 我的眼眸,等你路过我的容颜
- Gmail配置邮箱客户端
- Delphi: RTTI与ini配置文件
- 覆盖vue.js样式_使用Vue.js和Cloudinary在化身上覆盖眼镜/面罩
- 什么是SPOOLing?
- 互联网校招研发薪资汇总
- Java开发人员必知必会的20种常用类库和API
- 潍坊风尚米兰能耗监测系统的应用-安科瑞耿敏花
- MySQL迁移到kdb_Q语言把mysql输入导入到KDB+数据库
- 使用Sandcastle 基于代码注释生成接口文档
- DNSPod十问陆婷婷:什么是创造101背后的破圈秘诀?
- 2020 Android 大厂面试-插件化、模块化、组件化,移动开发工程师的岗位职责