当前位置: 首页 > 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…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...