Easticsearch性能优化之索引优化

Easticsearch性能优化之索引优化

  • 一、合理的索引设计
  • 二、合理的分片和副本
  • 三、合理的索引设置

对于性能优化,Elasticsearch(以下简称ES)索引优化是提高性能的关键因素之一。合理的设计索引,合理的分片和副本以及合理的缓存设置等,都有利于提升ES的索引性能和查询效率。

一、合理的索引设计

合理的索引设计是确保 ES 高效运行的关键因素之一。以下是一些设计ES索引时应考虑的最佳实践:

1. 理解数据和查询需求

数据特性:了解数据的类型(文本、数字、地理位置等)、大小和复杂性。
查询模式:明确你的查询需求,包括查询的频率、类型(全文搜索、精确匹配、范围查询等)以及期望的响应时间。

2. 索引结构优化

合理使用字段类型:根据数据的性质选择合适的字段类型,如text、keyword、date等。
控制索引映射:通过显式定义索引映射来控制字段的索引方式和格式化。
避免过度索引:不要索引那些永远不会被搜索的字段,可以在映射中将其设置为false。

3. 利用别名和索引模板

索引别名:使用索引别名可以更灵活地管理索引,如无缝切换索引或实现索引的滚动升级。
索引模板:利用索引模板可以自动应用预定义的设置和映射到新创建的索引,简化管理工作。

4. 考虑数据生命周期管理

使用ILM(Index Lifecycle Management):Elasticsearch提供了索引生命周期管理功能,允许你基于索引的大小或年龄自动执行优化、滚动升级和删除操作。

二、合理的分片和副本

合理设置Elasticsearch中的分片和副本是确保高效性能和数据可靠性的关键。它是一个需要根据具体情况不断调整和优化的过程,没有一成不变的规则。理解自己的数据特性和业务需求,做出选择,这里提供一些指导原则和建议:

1. 分片 (Shards)
分片是Elasticsearch进行数据分布和并行处理的基本单位,一个索引可以被分成多个分片。合理设置分片数量对于优化存储、查询性能和扩展性至关重要。

分片大小:理想的分片大小通常在几GB到几十GB之间。太大的分片会增加恢复时间和降低某些操作的速度,而太小的分片则可能浪费资源并增加集群的管理开销,这会严重影响搜索性能。
默认分片数:Elasticsearch 7.x版本以后,默认创建的索引有1个主分片。主分片的设置需要结合集群节点规模、全部数据量和日增数据等维度综合考量才给出的值,一般建议设置为数据节点的1~3倍
预估数据量:在确定分片数量时,考虑预期的数据增长。可以通过预估总数据量除以理想的分片大小来计算理想的分片数量。
扩展性:分片一旦被创建,其数量就不能更改(除非重新索引)。如果预计数据量会显著增长,应该规划额外的分片以便未来扩展。

2. 副本 (Replicas)
副本是分片的拷贝,用于提供数据冗余、提高查询吞吐量和提升系统的容错能力。

副本数量:至少设置一个副本是一个好习惯,这样即使失去一个节点也不会丢失数据。更多的副本可以提高读取性能,但会占用更多的硬盘空间和资源。Elasticsearch 7.x版本以后,默认创建的索引有1个副分片。对于一般的非高可用场景,一个副本基本足够。
读写比例:如果读请求远多于写请求,增加副本数量可以提高读取性能,因为查询可以在多个副本上并行执行。
资源和性能权衡:增加副本会提高查询性能,但同时也会增加索引和更新操作的开销,因为所有的写操作都必须在所有副本上执行。增加副本前,要考虑磁盘存储空间的容量上限和磁盘警戒水位线,其本质还是以空间换时间。
动态调整:副本数量可以根据需要动态调整,不会影响现有数据的完整性或可用性。

3. 实践建议

使用Index Templates:通过索引模板自动应用分片和副本的设置,以确保新索引遵循最佳实践。
监控和调整:利用Elasticsearch提供的监控工具,如Elasticsearch自身的监控API和Kibana,定期检查分片和副本的状态,并根据需要进行调整。
测试和评估:在生产环境部署前,通过测试来评估不同分片和副本配置下的性能表现,找到最适合自己数据和查询特性的设置。

三、合理的索引设置

1. 合理调整堆内存的索引缓冲区大小
堆内存中,索引缓冲区用于存储新索引的文档。填满后,缓冲区中的文档将最终写入磁盘上的某个段。索引缓冲的设置可以控制多少内存分配给索引进程。这是一个全局配置,会应用于一个节点上所有不同的分片上。 index_buffer_size的默认值为堆内存的10%,如下:

indices.memory.index_buffer_size: 10%

比如,给JVM提供31G的内存,它将为索引缓冲区提供3.1G的内存,一般情况下足以容纳大量的数据和写入操作。如果数据量着实非常大,则建议调大该默认值,比如调整为对内存的20%。但是必须在集群中的每个数据节点上进行配置。缓冲区越大,意味着能缓存的数据量越大,相同时间内,写入磁盘的频次低、磁盘IO小,间接提升写入性能

indices.memory.min_index_buffer_size: 48mb

indices.memory.index_buffer_size 接受一个百分比或者一个表示字节大小的值。默认是10%,意味着分配给节点的总内存的10%用来做索引缓冲的大小。这个数值被分到不同的分片(shards)上。如果设置的是百分比,还可以设置 min_index_buffer_size (默认 48mb)和 max_index_buffer_size(默认没有上限)。

2. 合理的调整刷新频率
为了提高索引性能,Elasticsearch 在写入数据的时候,采用延迟写入的策略,即数据先写到内存中,当超过默认1秒(index.refresh_interval)会进行一次写入操作,就是将内存中 segment 数据刷新到磁盘中,此时我们才能将数据搜索出来,所以这就是为什么 Elasticsearch 提供的是近实时搜索功能,而不是实时搜索功能。

如果我们的系统对数据延迟要求不高的话,我们可以通过延长 refresh 时间间隔,可以有效地减少 segment 合并压力,提高索引速度。比如在做全链路跟踪的过程中,我们就将 index.refresh_interval 设置为30s,减少 refresh 次数。再如,在进行全量索引时,可以将 refresh 次数临时关闭,即 index.refresh_interval 设置为-1,数据导入成功后再打开到正常模式,比如30s。命令如下:

# 写入前
PUT test
{
	"settings":{
		"refresh_interval":-1
	}
}
#写入后
{
	"settings":{
		"refresh_interval":30
	}
}

3. 修改 translog 相关的设置
一是控制数据从内存到硬盘的操作频率,以减少硬盘 IO。可将 sync_interval 的时间设置大一些。默认为5s。

index.translog.sync_interval: 5s

也可以控制 tranlog 数据块的大小,达到 threshold 大小时,才会 flush 到 lucene 索引文件。默认为512m。

index.translog.flush_threshold_size: 512mb

4. 优先使用系统自动生成的ID方式
文档ID,即_id 字段的生成有两种方式:系统自动生成ID和外部控制自增ID。不过如果使用外部控制自增ID,ES会先尝试读取原来文档的版本号,以判断是否需要更新。也就是说,使用外部控制自增ID比系统自动生成ID要多进行一次读取磁盘操作。所以,非特殊场景推荐使用系统自动生成ID的方式。

5. 注意 _all 字段及 _source 字段的使用
_all 字段及 _source 字段的使用,应该注意场景和需要,_all 字段包含了所有的索引字段,方便做全文检索,如果无此需求,可以禁用;_source 存储了原始的 document 内容,如果没有获取原始文档数据的需求,可通过设置 includes、excludes 属性来定义放入 _source 的字段。

6. 合理的配置使用 index 属性
合理的配置使用 index 属性,analyzed 和 not_analyzed,根据业务需求来控制字段是否分词或不分词。只有 groupby 需求的字段,配置时就设置成 not_analyzed,以提高查询或聚类的效率。

7. 合理使用分析器
分词器决定分词粒度,对于中文分常用的IK分词,可细分为粗粒度分词ik_smart和细粒度分词ik_max_word。从存储角度来看,基于ik_max_word分词的索引会比基于ik_smart分词的索引占据空间。而更细粒度的自定义分词Ngram会占用大量资源,并且可能减慢索引速度并显著增加索引大小。所以,要结合**检索指标(召回率和精准率)**以及写入场景进行选型。

8. 合理设置映射
实战业务场景中不推荐使用默认映射,一定要手动设置映射。比如,默认字符串类型为text,8.x后默认为text和keyword的组合类型,就不见得使用所有业务场景,要结合自己的业务场景进行设置,正文文本内容一般不需要设置keyword类型(因为不需要排序和聚合操作)。再比如,在互联网公司采集数据并存储的场景中,正文文本内容需要进行全文检索,但HTML样式的文本一般会留给前端展示用,不需要索引,因此,映射设置要果断将index设置为false。

9. 批量提交
当有大量数据提交的时候,建议采用批量提交(Bulk 操作);此外使用 bulk 请求时,每个请求不超过几十M,因为太大会导致内存使用过大。
比如在做 ELK 过程中,Logstash indexer 提交数据到 Elasticsearch 中,batch size 就可以作为一个优化功能点。但是优化 size 大小需要根据文档大小和服务器性能而定。
像 Logstash 中提交文档大小超过 20MB,Logstash 会将一个批量请求切分为多个批量请求。
如果在提交过程中,遇到 EsRejectedExecutionException 异常的话,则说明集群的索引性能已经达到极限了。这种情况,要么提高服务器集群的资源,要么根据业务规则,减少数据收集速度,比如只收集 Warn、Error 级别以上的日志。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/438743.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VSCode报错:/bin/sh: python: command not found

背景 以前都是直接用txt写python,然后直接命令行运行。 这次涉及的代码较多,决定用编译器。 写好的一段python点击运行报错! 问题描述 因为我本地安装的是python3,但是vscode用的是另一个路径的python,所以找不到 解…

[React 进阶系列] React Context 案例学习:使用 TS 及 HOC 封装 Context

[React 进阶系列] React Context 案例学习:使用 TS 及 HOC 封装 Context 具体 context 的实现在这里:[React 进阶系列] React Context 案例学习:子组件内更新父组件的状态。 根据项目经验是这样的,自从换了 TS 之后,…

光谱整形1

华为张德江:下一代光传送网将走向400G80波WDM系统_通信世界网 (cww.net.cn) 张德江指出,400G WDM系统具有三大基本特征:支持400G80波,单纤32T超大容量,传输距离与100G相当;支持32维以上的光交叉&#xff1…

微前端之使用无界创建一个微前端项目

wujie 使用手册 使用简介 主应用配置 安装 wujie依赖main.js配置 是否开启预加载 生命周期函数 – lifecycle.js配置 子应用配置 跨域设置运行模式 生命周期改造 在主应用中,使用wujie,将子应用引入到主应用中去 wujie 使用手册 wujie 是一个基于 Web…

Linux环境下使用interrupt方式操作UART

目录 概述 1 Linux环境下UART设备 2 轮询方式操作UART功能实现 2.1 打开串口函数:usr_serial_open 2.2 关闭串口函数: usr_serial_close 2.3 发送数据函数: usr_serial_sendbytes 2.4 接收数据函数: usr_serial_readinterr…

Android 性能优化--APK加固(2)加密

文章目录 字符串加密图片加密如何避免应用被重新签名分发APK 加壳的方案简析DEX加密原理及实现 本文首发地址:https://h89.cn/archives/212.html 最新更新地址:https://gitee.com/chenjim/chenjimblog 通过 前文 介绍,我们知晓了如何使用代码…

前端网络请求异步处理——Promise使用记录

Promise是ES6中新增的一个处理复杂异步请求的工具,其主要形式为: const baseUrl http://localhost:80 export const $request (param {}) > {console.log(请求参数, param)return new Promise((resolve, reject) > {wx.request({url: baseUrl …

SpringMVC拦截器和过滤器执行顺序及区别

拦截器(Inteceptor)和过滤器(Filter)执行顺序? 拦截器和过滤器区别? 1、拦截次数不同: 过滤器:一次请求只能被一个过滤器拦截一次,它们按照在web.xml中的声明顺序依次执…

Python Web开发记录 Day7:Django(Web框架) part 1

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 七、Django1、快速了解Django①概述②核心功能③…

css flex 布局换行

默认使用display: flex;是不换行的,只需要加上flex-wrap: wrap;就行了,效果图 .app-center {display: flex;flex-wrap: wrap;justify-content:flex-start; } 通过上面我们发现虽然时间换行了,但是每行的边距不一样 加上这个就行了&#xff…

华为配置DHCP Snooping防止DHCP Server仿冒者攻击示例

配置DHCP Snooping防止DHCP Server仿冒者攻击示例 组网图形 图1 配置DHCP Snooping防止DHCP Server仿冒者攻击组网图 DHCP Snooping简介配置注意事项组网需求配置思路操作步骤配置文件 DHCP Snooping简介 在一次DHCP客户端动态获取IP地址的过程中,DHCP Snoopi…

开源分子对接程序rDock使用方法(1)-Docking in 3 steps

欢迎浏览我的CSND博客! Blockbuater_drug …点击进入 文章目录 前言一、Docking in 3 steps 标准对接rDock 的基本对接步骤及注意事项 二、 三步对接案例Step 1. 结构文件准备Step 2. 产生对接位点Step 3. 运行分子对接3.1 检查输入文件3.2 测试-只进行打分3.3 运行…

maven项目结构管理统一项目配置操作

一、maven分模块开发 Maven 分模块开发 1.先创建父工程&#xff0c;pom.xml文件中&#xff0c;打包方式为pom 2.然后里面有许多子工程 3.我要对父工程的maven对所有子工程进行操作 二、解读maven的结构 1.模块1 <groupId>org.TS</groupId><artifactId>TruthS…

利用CesiumJS开发模拟飞机飞行的应用(添加飞行轨迹)

上一节介绍了利用CesiumJS开发模拟飞机飞行的应用(一&#xff0c;基本功能)&#xff0c;本节介绍如何在上节基础上添加飞行轨迹所使用数据是从旧金山到哥本哈根的真实航班&#xff0c;并使用 FlightRadar24收集的雷达数据。 添加单个3D点对象 FlightRadar24 使用多种方法&#…

[c/c++] const

const 和 #define 的区别 ? const 和指针一块出现的时候&#xff0c;到底谁不能修改 &#xff1f; const 和 volatile 能同时修饰一个变量吗 ? const 在 c 中的作用 ? 1 const 和 #define 的区别 const 和 #define 的相同点&#xff1a; (1) 常数 const 和 #define 定…

51-27 DirveVLM:自动驾驶与大型视觉语言模型的融合

本文由清华大学和理想汽车共同发布于2024年2月25日&#xff0c;论文名称DRIVEVLM: The Convergence of Autonomous Driving and Large Vision-Language Models. DriveVLM是一种新颖的自动驾驶系统&#xff0c;旨在针对场景理解挑战&#xff0c;利用最近的视觉语言模型VLM&…

蓝桥杯——web(ECharts)

ECharts 初体验 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><script src"echarts.js">&l…

【APB协议 UVM_Sequencer Driver Monitor_2024.03.04】

apb协议 写时序 地址、写信号、PSEL、写数据信号同时发生变化&#xff0c;即传输的第一个时钟被称为SETUP周期。在下个时钟上升沿,PENABLE信号拉高&#xff0c;表示ENABLE周期&#xff0c;在该周期内&#xff0c;数据、地址以及控制信号都必须保持有效。整个写传输在这个周期…

寻找旋转排序数组中的最小值[中等]

优质博文IT-BLOG-CN 一、题目 已知一个长度为n的数组&#xff0c;预先按照升序排列&#xff0c;经由1到n次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组nums [0,1,2,4,5,6,7]在变化后可能得到&#xff1a; 【1】若旋转4次&#xff0c;则可以得到[4,5,6,7,0,1,2…

perf的安装与迁移

前言 perf是性能优化很重要的工具之一&#xff0c;本篇博客就来看一下perf的安装以及遇到的问题。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨论一起学…