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

minio笔记之windows下安装使用

minio安装使用 去官网下载安装包启动访问管理平台创建桶创建用户、资源授权访问访问策略创建创建用户创建accessKey&#xff0c;用于应用程序开发 去官网下载安装包 直接安装即可 启动 设置密码 set MINIO_ROOT_USERadmin set MINIO_ROOT_PASSWORD12345678 cd到安装目录 mi…...

代码随想录算法训练营day31 | 56. 合并区间、738.单调递增的数字

碎碎念&#xff1a;加油 参考&#xff1a;代码随想录 56. 合并区间 题目链接 56. 合并区间 思想 这道题的核心还是判断重叠区间&#xff0c;本题和之前做过的452. 用最少数量的箭引爆气球、435. 无重叠区间的区别在于判断出重叠区间之后的操作&#xff0c;本题需要做的是合…...

利用 Python 制作图片轮播应用

在这篇博客中&#xff0c;我将向大家展示如何使用 xPython 创建一个图片轮播应用。这个应用能够从指定文件夹中加载图片&#xff0c;定时轮播&#xff0c;并提供按钮来保存当前图片到收藏夹或仅轮播收藏夹中的图片。我们还将实现退出按钮和全屏显示的功能。 C:\pythoncode\new\…...

报表系统之Cube.js

Cube.js 是一个开源的分析框架&#xff0c;专为构建数据应用和分析工具而设计。它的主要目的是简化和加速构建复杂的分析和数据可视化应用。以下是对 Cube.js 的详细介绍&#xff1a; 核心功能和特点 1. 多数据源支持 Cube.js 支持从多个数据源中提取数据&#xff0c;包括 SQ…...

代码随想录算法训练营第45天

115.不同的子序列 但相对于刚讲过 392.判断子序列&#xff0c;本题 就有难度了 &#xff0c;感受一下本题和 392.判断子序列 的区别。 代码随想录 class Solution {public int numDistinct(String s, String t) {int lenS s.length();int lenT t.length();int[][] dp new …...

solidity合约创建

合约可以通过使用new关键字来创建其他合约的实例。 这个过程会执行被创建合约的构造函数&#xff08;如果存在的话&#xff09;&#xff0c;并返回一个指向新创建合约的地址的引用。 这种方式允许智能合约动态地在区块链上部署新合约&#xff0c;并与它们交互。 通过 new 创…...

队列---循环队列实现

循环队列详解 概述 循环队列是一种基于数组实现的队列数据结构&#xff0c;其中队列的队首和队尾是通过模运算连接起来形成一个逻辑上的环形结构。这样可以有效地利用数组的空间&#xff0c;避免出现“假溢出”的情况。 结构体定义 循环队列的结构体定义如下&#xff1a; …...

【视频讲解】后端增删改查接口有什么用?

B站视频地址 B站视频地址 前言 “后端增删改查接口有什么用”&#xff0c;其实这句话可以拆解为下面3个问题。 接口是什么意思&#xff1f;后端接口是什么意思&#xff1f;后端接口中的增删改查接口有什么用&#xff1f; 1、接口 概念&#xff1a;接口的概念在不同的领域中…...

双指针hard题

[LeetCode]4. Median of Two Sorted Arrays 中文 - YouTube 依赖merge sort和priorityqueue的废物 正式变身山景城一姐小迷妹✪ω✪ 寻找正序数组中位数 class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int len1 nums1.length;int len2 …...

前端实现【 批量任务调度管理器 】demo优化

一、前提介绍 我在前文实现过一个【批量任务调度管理器】的 demo&#xff0c;能实现简单的任务批量并发分组&#xff0c;过滤等操作。但是还有很多优化空间&#xff0c;所以查找一些优化的库&#xff0c; 主要想优化两个方面&#xff0c; 上篇提到的&#xff1a; 针对 3&…...

利用webflow建网站/百度搜索指数查询

在Spring Boot单体服务中&#xff0c;添加Transactional注解就能实现事务。在单体服务中&#xff0c;执行事务都是在同一个数据库下进行。但是随着业务越来越复杂&#xff0c;数据量越来越大会进行分库分表。在微服务场景下&#xff0c;每个服务都有自己的数据库。之前的单体事…...

做logo找灵感的网站/网站建设哪家好

#include<stdio.h>int main(){int i,j,k,line,m;printf("几行&#xff1f;:");scanf("%d",&line);m(line1)/2; //控制上半行for(i1;i<m;i) //i从1开始到中间行{for(k0;k<m-i;k) //输出每行前面的空格{printf(" &…...

做临时工看哪个网站/个人如何推广app

2019独角兽企业重金招聘Python工程师标准>>> 查询 查询语句中使用连接表达式 有时为了让现实的查询结果更有意义,需要交多个字符串连接起来,可以使用连接操作符"||" 来实现,如果要连接的是数字,可以直接书写,如果是字符串或日期,则必须使用单引号括起来。…...

工程公司logo图片大全集/seo项目经理

如图&#xff0c;拿到一个openwrt路由器我们第一步要远程控制。 这里在买了两块wifi-robots wifi视频模块。 0首先说下这个WIIF的信息 淘宝购买链接 https://item.taobao.com/item.htm?spma312a.7700824.w5001-18055431271.3.18644705m9g8Qz&id555120245987&scenetao…...

适响应式网站弊端/百度写一篇文章多少钱

第一种方法 string sabcdeabcdeabcde; string[] sArrays.Split(c) ; foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab deab deab de 第二种方法 我们看到了结果是以一个指定的字符进行的分割。使用另一种构造方法对多个字 符进行分割: strin…...

物流跟踪网站建设/营销失败案例分析

上一篇主要介绍Expression系列产品&#xff0c;另外概述了Blend的强大功能&#xff0c;本篇将用Blend 3创建一个新Silverlight项目&#xff0c;通过创建的过程&#xff0c;对Blend进行快速入门学习。在开始使用Blend前&#xff0c;首先需要进行Silverlight的开发环境搭建&#…...