ES性能调优详解

简介: ES性能调优详解

前言


网上关于ES性能优化的文章太多,这里参考官网收集整理下。


官网优化说明:how-to


一、常规建议


1、不要返回数据量非常大的结果集

2、避免出现大文档,即单条索引记录的体积不要过大。

默认情况下, http.max_content_length 设置为100mb,限制单个索引记录的大小不能超过100mb。


二、优化索引速度


1.尽量使用批请求bulk


2.采用从多个线程或进程发送数据到ES


3.增加索引刷新时间大小index.refresh_interval,默认1s刷新一次,设置为-1表示关闭索引刷新。


4.初始加载数据时禁用副本,将index.number_of_replicas 设置为0。

一般我们在进行大量数据的同步任务和加载的时候,可以先设置index.refresh_interval=-1,index.number_of_replicas=0,关闭自动刷新并将索引的副本数设置为0。待完成数据同步后,再调整回正常值。


5.禁用内存交换swapping


6.分配足够的内存给文件系统缓存

文件系统缓存将用于缓冲 I/O 操作。应该确保将运行 Elasticsearch 的计算机的至少一半内存提供给文件系统缓存。


7.使用自动生成id

在索引具有显式 id 的文档时,Elasticsearch 需要检查具有相同 id 的文档是否已存在于同一个分片中,这是一项代价高昂的操作,并且随着索引的增长而变得更加昂贵。

通过使用自动生成的 id,Elasticsearch 可以跳过此检查,从而加快索引速度。


8.使用更快的硬件,比如使用SSD固态硬盘


9.索引缓冲区大小index_buffer_size

索引缓冲区index.memory.index_buffer_size默认值是 10%,例如,如果 JVM 10GB 的内存,它将为索引缓冲区提供 1GB。


10.使用跨集群复制,避免争抢资源。


11.尽量避免使用深度分页,实在不能避免可以采用Scroll 遍历查询或Search After 查询。


三、优化查询速度


1.分配足够的内存给文件系统缓存

Elasticsearch 严重依赖文件系统缓存来加快搜索速度。 通常,您应该确保至少有一半的可用内存进入文件系统缓存,以便 Elasticsearch 可以将索引的热点区域保留在物理内存中。


2.使用更快的硬件

如果搜索速度受限I/O,可以使用读写速度更快的固态硬盘SSD;

如果搜索速度受限CPU,那么可以购买速度更快的CPU。


3.优化索引文档结构,避免使用连接查询


4.搜索尽可能少的字段

可以通过copy_to将多个字段的值合并到一个字段,这样减少搜索过程匹配的字段。


5.预处理索引数据,减少查询过程中的计算消耗


6.考虑将索引的mapping中的标识符字段(如id字段)设置为keyword类型

numeric 类型适合范围查询range queries

keyword 类型适合等值查询term queries.

当然,你也可以使用多字段multi-field适配多种场景下的查询。


7.避免使用脚本

尽量避免使用脚本排序,脚本计算得分,脚本聚合查询。


8.合并只读索引


9.热身全局序数,会占用部分JVM 堆空间,可以优化聚合查询性能。


10.预热文件系统缓存

如果重新启动运行 Elasticsearch 的机器,文件系统缓存将是空的,因此操作系统将索引的热点区域加载到内存中需要一些时间,以便快速搜索操作。 您可以使用 index.store.preload 设置根据文件扩展名明确告诉操作系统哪些文件应该立即加载到内存中。


11.设置索引存储时的排序方式加快连接查询性能。


12.使用首选项帮助优化缓存的使用。

主要是集群中各个节点上的缓存配置可能存在差异,通过首选项的配置可以统一配置、优化缓存的使用。


13.设置正确的副本数来提高吞吐量。

那么正确的副本数量是多少?如果您的集群有 num_nodes 个节点、num_primaries 主分片,并且您希望最多同时处理 max_failures 个节点故障,那么适合您的副本数为 max(max_failures, ceil(num_nodes / num_primaries) - 1)。


14.使用更高性能的查询API。比如多用filter少用query。


15.使用constant_keyword字段类型提升filter速度。


四、优化磁盘使用


1.禁用你不需要的特性

比如:

1)不作为查询条件的属性,可以添加在mapping中声明:"index": false;

2)text类型字段如果你只匹配而不关注匹配的分数,可以将类型声明为match_only_text,此字段类型通过删除评分和位置信息来节省大量空间。


2.不要使用默认的动态字符串映射

默认的动态字符串映射会将字符串字段同时作为text和keyword进行索引。 如果您只需要其中之一,这是一种浪费。 通常,id 字段只需要作为关键字索引,而 body 字段只需要作为文本字段索引。


3.注意你的分片大小

说明:更大的分片在存储数据方面会更有效。 要增加分片的大小,可以通过创建具有较少主分片的索引、创建更少的索引(例如通过利用 Rollover API)或使用 Shrink API 修改现有索引来减少索引中主分片的数量。

但是注意,大的分片也有缺点,例如完整的恢复时间长。


4.禁用 _source

说明:_source 字段存储文档的原始 JSON 正文。 如果您不需要访问它,您可以禁用它。 但是,需要访问 _source 的 API(例如 update 和 reindex)将不起作用。


5.使用压缩器best_compression

说明:_source 和 stored 字段可以很容易地占用不可忽略的磁盘空间量。 可以使用 best_compression 编解码器更积极地压缩它们。


6.强制合并Force merge

说明:Elasticsearch 中的索引存储在一个或多个分片中。 每个分片都是一个 Lucene 索引,由一个或多个段segment组成——磁盘上的实际文件。 更大的段segment对于存储数据更有效。

强制合并 API 可用于减少每个分片的段数。 在许多情况下,可以通过设置 max_num_segments=1 将段数减少到每个分片一个。


7.收缩索引分片数量 Shrink index

Shrink API 允许您减少索引中的分片数量。 与上面的强制合并 API 一起,这可以显着减少索引的分片和段的数量。


8.使用足够的最小数字类型有利于节约磁盘空间

说明:数字数据选择的字段类型会对磁盘使用产生重大影响。 特别是,整数应使用整数类型(字节、短整型、整数或长整型)存储,浮点数应存储在 scaled_float 中(如果合适)或适合用例的最小类型:使用 float over double,或 half_float over float 将有助于节省存储空间。


9.使用索引排序来整理相似的文档,提高压缩率

说明:Elasticsearch 在存储_source 时,会一次压缩多个文档,以提高整体压缩率。 例如,文档共享相同的字段名是很常见的,而且它们共享一些字段值也很常见,特别是在基数较低或 zipfian 分布的字段上。

默认情况下,文档按照添加到索引的顺序压缩在一起。 如果您启用了索引排序,那么它们将按排序顺序压缩。 将具有相似结构、字段和值的文档排序在一起应该可以提高压缩率。


10.在文档中以相同的顺序放置字段

说明:由于多个文档被一起压缩成块,如果字段总是以相同的顺序出现,则更有可能在那些 _source 文档中找到更长的重复字符串。


11.汇总历史数据

说明:保留较旧的数据对以后的分析很有用,但由于存储成本,通常会避免。 您可以使用数据汇总以原始数据存储成本的一小部分来汇总和存储历史数据。


12.对于时序数据可以采用数据流data_stream和索引生命周期管理ILM


总结


本文主要是对ES性能调优的一些方案进行了总结。

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
目录
相关文章
|
存储 Kubernetes 关系型数据库
k8s集群安装部署单机MySQL(使用StorageClass作为后端存储)
k8s集群安装部署单机MySQL(使用StorageClass作为后端存储)
1639 0
k8s集群安装部署单机MySQL(使用StorageClass作为后端存储)
|
算法 Java 开发工具
Magisk模块:Audio HeadQuarter(使用前仔细阅读)
Magisk模块:Audio HeadQuarter(使用前仔细阅读)
2351 0
|
JSON 网络协议 Dubbo
RPC框架(技术总结)
RPC框架(技术总结)
RPC框架(技术总结)
|
网络协议 物联网 iOS开发
iOS - App 与外设间的通信方式
1、前言 一般 iOS 开发者做 App 开发大部分时候都是通过 Http(s) 请求跟后台服务器打交道,做一些信息展示和用户交互。很少涉及到去跟外部硬件设备连接的开发。随着近年来车联网和物联网的兴起,智能家居和智能硬件的逐步火热,越来越多的 App 被开发出来,用来跟硬件设备进行来连接,获取硬件相关信息展示或者发送指令控制硬件来提供服务。
3285 0
|
11月前
|
人工智能 自然语言处理 语音技术
Soul App联合西工大和上交大开源语音合成模型SoulX-Podcast,已登顶Hugging Face TTS趋势榜!
Soul AI Lab联合西工大、上交大开源SoulX-Podcast,支持中英粤川等多语种方言及副语言生成,可稳定输出超60分钟自然流畅的多人对话音频,已在Huggingface登顶TTS趋势榜。
1194 0
Soul App联合西工大和上交大开源语音合成模型SoulX-Podcast,已登顶Hugging Face TTS趋势榜!
|
11月前
|
数据采集 Web App开发 API
技术探索:获取拼多多商品券后价数据的接口方案
本文介绍获取拼多多商品券后价的三种技术方案:推荐使用官方开放平台API,合规稳定;可通过Web页面解析但存在法律风险;或借助第三方数据服务商间接获取。强调合规优先、遵守平台规则,避免爬虫风险,确保数据准确与时效。
1153 0
|
11月前
|
Java Maven
Java打包时,本地仓库有jar 包,Maven打包却还去远程拉取
Maven打包时若因网络或权限问题导致依赖下载失败,即使手动添加jar包仍报错,可删除本地仓库对应文件夹下的 `_remote.repositories` 和 `.lastUpdated` 文件后重新打包。常用命令包括 `mvn clean`、`mvn clean package`,以及跳过测试的 `-DskipTests` 或 `-Dmaven.test.skip=true` 参数,提升打包效率。
|
人工智能 Docker 容器
AI思维导图工具跨领域学习的好帮手
AI思维导图工具跨领域学习的好帮手
|
传感器 机器学习/深度学习 人工智能
AI种田有多猛?看它如何“统治”自动化农业!
AI种田有多猛?看它如何“统治”自动化农业!
501 8
|
数据采集 机器学习/深度学习 编解码
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南
本文详细介绍了一个简化版 Veo 3 文本到视频生成模型的构建过程。首先进行了数据预处理,涵盖了去重、不安全内容过滤、质量合规性检查以及数据标注等环节。
1085 5
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南

热门文章

最新文章