当前位置: 首页 > news >正文

elasticsearch性能调优方法原理与实战

❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基

文章目录

    • 引言
    • 1. 硬件选择和优化
        • 磁盘优化
        • CPU优化
        • 网络优化
        • 存储与压缩优化
        • JVM与内存管理
    • 2. 索引与分片策略
        • 索引生命周期管理
        • 分片与副本策略
    • 3. 查询优化
        • 缓存机制
        • 聚合优化
        • 数据建模优化
        • 其他
    • 4. 监控与日志
    • 5. 高级调优技巧
        • 脚本优化
        • 文档路由
        • 插件与扩展
    • 5. 案例
      • 背景
      • 痛点分析
      • 解决方案
      • 具体设置及代码
        • JVM设置
        • 索引设置
        • 查询优化
    • 结语

引言

Elasticsearch性能调优对于提升系统整体效能至关重要。然而,性能调优并非一蹴而就,需要深入理解ES的内部工作机制,并结合实际业务场景进行精细化调整。本文将深入解释ES性能调优方法的原理,结合具体案例展示如何在实际应用中优化ES性能。

1. 硬件选择和优化

磁盘优化
  • 使用SSD:对于频繁读写操作的Elasticsearch集群,使用SSD(固态硬盘)可以显著提高I/O性能。

  • RAID配置:可以考虑使用RAID0来提高写入性能,或者使用RAID10(镜像+条带化来兼顾性能和数据安全性。

  • 冷热数据分离:对于不经常访问的“冷数据”,可以将其存储在成本更低的机械硬盘上,以节省成本。

在这里插入图片描述

CPU优化
  • 多核与多线程:选择CPU时,优先考虑核心数和线程数多的型号,以便更好地处理并发查询和索引操作

  • 避免单核高性能:对于Elasticsearch来说,高单核性能并不是首要考虑的因素,因为Elasticsearch的设计可以很好地利用多核多线程。

网络优化
  • 低延迟网络:确保Elasticsearch集群部署在低延迟的网络环境中,以减少节点间通信的延迟。

  • 跨地域部署的注意事项:尽量避免跨地域部署单个集群,以减少网络故障的风险。

存储与压缩优化

Elasticsearch内部对倒排表的存储进行了深度优化,使用了多种压缩算法来减少存储空间和提高查询效率。在数据建模时,应尽可能采用通用最小化法则,例如使用合适的字段类型(如Keyword代替数值类型进行精确匹配查询)、避免重复存储等。

  • FST(Finite State Transducers)模型:Elasticsearch使用FST模型来存储词项字典,可以极大地节省存储空间并提升查询效率。一个TB级的索引,通过FST存储后,其构建的模型大小可缩小至1GB左右。

在这里插入图片描述

JVM与内存管理

Elasticsearch运行在JVM上,合理的JVM配置对于提升性能至关重要。JVM堆内存大小、垃圾回收策略等都会影响ES的写入和查询性能。

  • 堆内存设置:一般建议JVM堆内存大小不超过物理内存的50%,且最大不超过32GB(对于支持Compressed OOP的JVM)。

  • 禁用Swap:Swap交换会导致JVM堆内存被换出到磁盘,严重影响性能,应尽可能禁用Swap。

2. 索引与分片策略

索引生命周期管理
  • Rollover Index:定期创建新的索引来存储新数据,避免单个索引过大。

  • Index Lifecycle Management (ILM):利用Elasticsearch的ILM功能,自动化地管理索引的生命周期,包括创建、滚动、删除等操作。

分片与副本策略

ES通过分片(Shard)和副本(Replica)机制来实现数据的分布式存储和查询,从而提高系统的可用性和性能。

在这里插入图片描述

  • 分片分配:分片用于数据的水平拆分,可以将数据分片存储在不同的节点上,提高查询的并行处理能力。合理的分片数量和大小对于优化性能至关重要。一般建议单个分片大小控制在10GB到50GB之间。根据数据的增长速度和查询负载来动态调整分片数量和大小。分片过多会增加查询时的JVM开销和协调节点的转发压力,影响查询性能。

在这里插入图片描述

  • 副本策略:副本用于数据的冗余存储,提高数据的可用性和容错能力。在写入大量数据时,可以暂时关闭副本以加速索引过程,待数据写入完成后再恢复副本。

3. 查询优化

缓存机制
  • 利用查询缓存:Elasticsearch会自动缓存频繁执行的查询结果,以减少查询延迟。可以通过调整indices.queries.cache.size参数来优化查询缓存的大小。
聚合优化
  • 预索引聚合字段:对于经常需要聚合的字段,可以在索引时预先计算聚合结果,并存储在专门的字段中,以加快查询速度。

  • 避免使用高成本的聚合操作:如global aggregations,这类聚合操作需要访问所有分片的数据,成本较高。

数据建模优化
  • 使用nested和join字段谨慎:nested和join字段会显著增加查询的复杂度,仅在必要时使用,并考虑其性能影响。

  • 合理使用mapping:例如,对于不需要全文检索的字段,可以使用keyword类型而不是text类型,以提高查询性能。

在这里插入图片描述

其他
  • 增加刷新间隔:减少不必要的索引刷新操作,可以提升写入性能。默认情况下,ES每秒刷新一次索引,但在批量写入场景下,可以适当增加刷新间隔。

  • 使用filter代替query:filter查询不计算文档的相关性得分,且通常会被缓存,因此在执行精确匹配查询时,应优先考虑使用filter。

  • 避免深度分页:深度分页会导致大量无用数据的检索,严重影响性能。建议使用scroll API或search_after参数来实现深度分页。

4. 监控与日志

  • 实时监控集群状态:使用Elasticsearch自带的监控工具或第三方监控解决方案(如Kibana、Grafana等)来实时监控集群的性能指标(如CPU使用率、内存占用、查询延迟等)。
  • 日志分析:定期检查Elasticsearch的日志文件,分析错误信息、警告信息和慢查询日志,及时发现并解决潜在的性能问题。

5. 高级调优技巧

脚本优化
  • 避免在查询中使用复杂的脚本:脚本查询通常比DSL查询慢得多,应尽量避免在高频查询中使用脚本。
文档路由
  • 合理设置文档路由:通过为文档指定路由值,可以控制文档存储到哪个分片上,有助于优化查询性能和数据分布。
插件与扩展
  • 利用插件增强功能:Elasticsearch提供了丰富的插件生态系统,可以通过安装合适的插件来扩展功能或优化性能(如analysis插件、security插件等)。

5. 案例

背景

一家提供SMS短信服务的供应商,其主要客户群体为各大银行系统。随着业务量的增长,短信发送记录的索引变得异常庞大,严重影响了系统的写入和查询性能。

痛点分析

  1. 索引过于庞大:单个索引包含了大量的短信发送记录,导致查询和写入性能下降。
  2. 索引过多:虽然通过滚动索引策略解决了单个索引过大的问题,但随着时间推移,索引数量激增,跨索引查询性能成为新的瓶颈。

解决方案

  1. 优化索引结构

    • 采用滚动索引策略,每天创建一个新的索引来存储当天的短信发送记录。
    • 根据业务属性(如手机号归属地、所属运营商)对索引进行拆分,减少跨索引查询的范围。
  2. 调整JVM与内存设置

    • 增加JVM堆内存大小,确保系统有足够的内存来处理大量数据。
    • 禁用Swap,避免JVM堆内存被换出到磁盘。
  3. 优化查询性能

    • 对于精确匹配查询,使用filter代替query。
    • 避免深度分页,使用scroll API来实现大数据量的分页查询。
  4. 动态调整分片与副本

    • 根据数据量和业务需求动态调整分片数量和大小。
    • 在批量写入时,暂时关闭副本以加速索引过程。

具体设置及代码

JVM设置

elasticsearch.yml中配置JVM堆内存大小:

-Xms32g
-Xmx32g

禁用Swap:

# 编辑/etc/sysctl.conf文件
vm.swappiness=0
# 执行sysctl -p使设置生效
sysctl -p
索引设置

调整索引刷新间隔和Buffer大小:

PUT /sms_index/_settings
{"index" : {"refresh_interval" : "30s","indices.memory.index_buffer_size": "20%"}
}

关闭副本进行批量写入:

PUT /sms_index/_settings
{"number_of_replicas": 0
}

批量写入完成后,恢复副本数量:

PUT /sms_index/_settings
{"number_of_replicas": 1
}
查询优化

使用filter代替query进行精确匹配查询:

GET /sms_index/_search
{"query": {"bool": {"filter": [{ "term": { "phone_number": "138xxxxxx88" }}]}}
}

使用scroll API进行深度分页查询:

POST /sms_index/_search?scroll=1m
{"size": 100,"query": {"match_all": {}}
}# 使用scroll id进行后续查询
GET /_search/scroll
{"scroll": "1m","scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}

结语

Elasticsearch性能调优是一个持续的过程,需要根据业务需求、数据量和集群规模不断调整和优化。希望本文提供的详细分析和建议能够帮助读者更好地理解和应用Elasticsearch性能调优方法,提升系统的整体效能。同时,也鼓励读者不断探索和实践新的调优策略,以适应不断变化的业务需求和技术环境。


关注公众号[码到三十五]获取更多技术干货 !

相关文章:

elasticsearch性能调优方法原理与实战

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…...

python print 函数参数:sep 自定义分隔符,end 自定义结尾符

1. 简述 print 函数可以将内容打印到标准输出&#xff0c;如果不指定 end 参数&#xff0c;默认在输出的内容之后加一个 “回车符\n”。 以下是 print 函数常用的参数用法&#xff1a; print(object, …, sepstr, endstr) object, …&#xff1a;要打印的内容&#xff0c;可以…...

git 使用场景

拉取分支 feature 以develop为基础 git checkout -b feature-x develop git checkout demobranch git branch 合并分支 idea 在feature 选 develop 合并到feature...

Ubuntu22.04 Docker更换阿里云镜像

由于运营商网络原因&#xff0c;会导致您拉取Docker Hub镜像变慢&#xff0c;甚至下载失败。那么可以更换阿里云镜像加速器&#xff0c;从而加速官方镜像的下载。 1.获取镜像加速器地址 登录容器镜像服务控制台&#xff0c;在左侧导航栏选择镜像工具 > 镜像加速器&#xf…...

Windows下Rust OpenCV环境配置

首发于Enaium的个人博客 安装Chocolatey 首先我们需要安装Chocolatey&#xff0c;Chocolatey是一个Windows的包管理器。 我们点击右上角的Install进入到Installing Chocolatey&#xff0c;选择Individual 复制命令 Set-ExecutionPolicy Bypass -Scope Process -Force; [Sys…...

PostgreSQL(二十三)TOAST技术

目录 一、TOAST简介 二、TOAST的存储方式 1、存储方式概述 2、实验&#xff1a;创建TOAST表 三、TOAST的4种压缩策略 1、策略说明 2、TOAST表额外的三个字段 四、TOAST表的计算方式 1、说明 2、实验&#xff1a;计算表大小 五、TOAST表的特点 1、优点 2、缺点 3、…...

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《海上风氢系统与沿海电网能量协同优化调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…...

MySQL update set语句中 逗号与and的区别

语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法&#xff1a; UPDATE table_name SET column1 value1, column2 value2, ... WHERE condition; 参数说明&#xff1a; table_name 是你要更新数据的表的名称。column1, column2, ... 是你要更新的列的名称。v…...

C++面试---小米

一、static 关键字的作用&#xff0c;及和const的区别 static关键字作用&#xff1a; 1、在类的成员变量前使用&#xff0c;表示该变量属于类本身&#xff0c;而不是任何类的实例。 2、在类的成员函数前使用&#xff0c;表示该函数不需要对象实例即可调用&#xff0c;且只能访问…...

Java 实现 AVL树

在二叉平衡树中&#xff0c;我们进行插入和删除操作时都需要遍历树&#xff0c;可见树的结构是很影响操作效率的。在最坏的情况下&#xff0c;树成了一个单支树&#xff0c;查找的时间复杂度成了O(N)&#xff0c;建树跟没建树一样。那么是不是有什么办法可以建一个树避免这种情…...

CNN卷积网络实现MNIST数据集手写数字识别

步骤一&#xff1a;加载MNIST数据集 train_data MNIST(root./data,trainTrue,downloadFalse,transformtransforms.ToTensor()) train_loader DataLoader(train_data,shuffleTrue,batch_size64) # 测试数据集 test_data MNIST(root./data,trainFalse,downloadFalse,transfor…...

深入理解Java中的时间处理与时区管理

在Java开发中&#xff0c;时间处理和时区管理是常见的需求&#xff0c;特别是在全球化应用中。Java 8引入了新的时间API&#xff08;java.time包&#xff09;&#xff0c;使时间处理变得更加直观和高效。本文将详细介绍Java中的时间处理与时区管理&#xff0c;通过丰富的代码示…...

虚拟机windows server创建域

目录 准备工作 一、新建域控制器 二、提升为域控制器添加新林 三、新建组织单位&#xff08;OU&#xff09;&#xff0c;用户 四、将计算机加域 五、在域控中管理计算机 六、在域控中配置组策略 七、域内计算机验证组策略配置 准备工作 安装域前&#xff0c;如果有DNS…...

Java 集合框架:Java 中的 Set 集合(HashSet LinkedHashSet TreeSet)特点与实现解析

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 017 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…...

springboot智能健康管理平台-计算机毕业设计源码57256

摘要 在当今社会&#xff0c;人们越来越重视健康饮食和健康管理。借助SpringBoot框架和MySQL数据库的支持&#xff0c;开发智能健康管理平台成为可能。该平台结合了小程序技术的便利性和SpringBoot框架的快速开发能力&#xff0c;为用户提供了便捷的健康管理解决方案。 通过智能…...

LetterBox图像预处理方法

LetterBox图像预处理方法就是要将不同分辨率的图像转换成固定分辨率,比如v8输入网络的固定分辨率为6406403,因此这里分享一下默认情况下对训练集、验证集和测试图片做的letterBox的方法。 1.LetterBox-Train 对于训练集,默认输入网络的图像尺寸为640640,假设有一张7201280…...

C++第五篇 类和对象(下) 初始化列表

目录 1.再探构造函数 2.类型转换 3.static成员 4.友元 friiend 1.再探构造函数 (1).之前我们实现构造函数时&#xff0c;初始化成员变量主要使用函数体内赋值&#xff0c;构造函数初始化还有一种方式&#xff0c;就是初始化列表&#xff0c;初始化列表的使用方式是以一个冒…...

C#中的通信

上位机应用开发-串口通信1、基于C#的串口通信对象:SerialPort 2、字段属性 PortName:获取或设置通信端口 BaudRate:获取或设置串行波特率-DataBits:获取或设置每个字节的标准数据位长度 Parity:获取或设置奇偶校验检查协仪I-StopBits;获取或设置每个字节的标准停止位数 3、…...

CVE-2022-21663: WordPress <5.8.3 版本对象注入漏洞深入分析

引言 在网络安全领域&#xff0c;技术的研究与讨论是不断进步的动力。本文针对WordPress的一个对象注入漏洞进行分析&#xff0c;旨在分享技术细节并提醒安全的重要性。特别强调&#xff1a;本文内容仅限技术研究&#xff0c;严禁用于非法目的。 漏洞背景 继WordPress CVE-2…...

C语言笔试题(三)

本专栏通过整理各专业方向的面试资料并咨询业界相关人士&#xff0c;整合不同方向的面试资料&#xff0c;希望能为您的面试道路点亮一盏灯&#xff01; 1 简单题 如何声明一个二维数组&#xff1f; 答案: int arr[3][4];解析: 二维数组可以看作数组的数组。 union和struct…...

全场景智能化多媒体采集平台:MediaCrawler技术架构与应用实践

全场景智能化多媒体采集平台&#xff1a;MediaCrawler技术架构与应用实践 【免费下载链接】MediaCrawler-new 项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler-new MediaCrawler作为一款开源多媒体内容采集工具&#xff0c;通过智能化技术架构实现了跨…...

收藏 | 小白程序员必看:轻松入门RAG技术,让大模型拥有你的专业知识领域

收藏 | 小白程序员必看&#xff1a;轻松入门RAG技术&#xff0c;让大模型拥有你的专业知识领域 本文介绍了RAG&#xff08;检索增强生成&#xff09;技术&#xff0c;一种经济高效地解决大模型缺乏特定领域知识的方案。文章详细阐述了RAG的工作流程&#xff1a;用户请求→查询资…...

RuoYi-Vue-Plus:企业级应用开发的架构革新与实践指南

RuoYi-Vue-Plus&#xff1a;企业级应用开发的架构革新与实践指南 【免费下载链接】RuoYi-Vue-Plus 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-Plus 一、价值定位&#xff1a;为什么选择RuoYi-Vue-Plus&#xff1f; 在数字化转型浪潮下&#xff0c;…...

Ray框架实战:如何用分布式训练加速你的AI模型(附BERT调参案例)

Ray框架实战&#xff1a;如何用分布式训练加速你的AI模型&#xff08;附BERT调参案例&#xff09; 当你的BERT模型训练时间从72小时缩短到8小时&#xff0c;GPU利用率从35%提升到89%时&#xff0c;那种"早该用这个工具"的顿悟感会瞬间击中你。这就是Ray框架带给AI工程…...

Zinx框架深度解析:连接管理、消息队列与路由设计的实现原理

Zinx框架深度解析&#xff1a;连接管理、消息队列与路由设计的实现原理 在当今高并发的网络服务开发中&#xff0c;选择一个合适的服务器框架往往能事半功倍。Zinx作为一款用Go语言编写的高性能TCP服务器框架&#xff0c;以其轻量级、模块化和易扩展的特性&#xff0c;逐渐成为…...

skimage计算彩色图像SSIM报错?别慌,手把手教你排查‘win_size exceeds image extent’的坑

彩色图像SSIM计算报错全解析&#xff1a;从源码到实战的深度排坑指南 当你满怀信心地调用skimage.metrics.structural_similarity计算彩色图像的SSIM指标时&#xff0c;突然遭遇"win_size exceeds image extent"的报错——即使已经设置了multichannelTrue参数。这种看…...

ValueCell:构建金融投资决策生态系统的多智能体架构设计哲学

ValueCell&#xff1a;构建金融投资决策生态系统的多智能体架构设计哲学 【免费下载链接】valuecell ValueCell is a community-driven, multi-agent platform for financial applications. 项目地址: https://gitcode.com/gh_mirrors/va/valuecell 在当今信息过载的金融…...

Wan2.2-I2V-A14B参数详解:--duration --resolution --prompt最佳实践组合

Wan2.2-I2V-A14B参数详解&#xff1a;--duration --resolution --prompt最佳实践组合 1. 核心参数概述 Wan2.2-I2V-A14B文生视频模型提供了三个关键参数来控制视频生成效果&#xff1a; --duration&#xff1a;控制生成视频的时长&#xff08;秒&#xff09;--resolution&am…...

【RK3588】UBoot环境变量持久化存储实战:从MMC到TF卡的全配置指南

1. 为什么需要持久化存储UBoot环境变量 第一次用RK3588开发板调试时&#xff0c;我就被环境变量丢失的问题坑过。当时花了两天时间配置好的bootargs参数&#xff0c;一次断电重启后就全没了——这种酸爽相信很多嵌入式开发者都体验过。UBoot默认将环境变量存放在内存中&#xf…...

伏羲天气预报开放科学:复现代码、数据、环境全公开,推动可重复研究

伏羲天气预报开放科学&#xff1a;复现代码、数据、环境全公开&#xff0c;推动可重复研究 天气预报&#xff0c;这个与每个人生活息息相关的领域&#xff0c;正经历着一场由人工智能驱动的深刻变革。传统的数值天气预报模型虽然精度高&#xff0c;但计算成本巨大&#xff0c;…...