ES内存溢出报错问题解决方案

博主有话说:该博文根据实际案例编写,在编写过程中将敏感信息进行替换,可能存在矛盾的地方,望见谅

1 错误详情

[type=circuit_breaking_exception, reason=[parent] Data too large, data for [<http_request>] would be [125643918/119.8mb], which is larger than the limit of [90832896/86.6mb], real usage: [125639936/119.8mb], new bytes reserved: [3982/3.8kb], usages [request=0/0b, fielddata=0/0b, in_flight_requests=3982/3.8kb, accounting=15713/15.3kb]] ElasticsearchStatusException[Elasticsearch exception [type=circuit_breaking_exception, reason=[parent] Data too large, data for [<http_request>] would be [125643918/119.8mb],

在这里找到了3个数值

Data too large, data for [] would be [125643918/119.8mb] 这个就是上限内存(缺省是它是ES最大内存的95%)
real usage: [125639936/119.8mb], ES已经使用的内存
new bytes reserved: [3982/3.8kb] 本次查询需要的内存

2 方案一:增加es的内存

2.1 增加es的内存

编辑elasticsearch配置路径下的jvm.options文件,修改总堆空间的初始大小和总堆空间的最大大小,重启es应用即可

可以根据剩余内存大小情况增加es内存

注:初始值和最大值应当被设置为相同的值

2.2 方案分析

该方案简单粗暴,但是要考虑服务器性能。增加es内存的同时,要考虑到对其它应用的影响,不能增加太高,比如增加到2~3G。而且随着时间的推进,es数据量的增加,可能还会出现此问题,无法从根本上解决问题,可以考虑与其他方案双管齐下。

3 方案二:删除es数据

3.1 删除所有文档

构建一个匹配所有文档的查询,并使用DELETE BY QUERY API来删除它们。这样,索引的结构会保留,但其中的所有数据都将被删除。

POST /my_index/_delete_by_query
{"query": {"match_all": {}}
}
curl -uelastic:elastic_pwd -H "Content-Type:application/json" -XPOST http://127.0.0.1:6200/my_index/_delete_by_query -d '{"query": {"match_all": {}}
}'

3.2 创建空索引,删除旧索引

创建一个新的具有相同结构但没有任何数据的空索引,然后根据需要删除旧索引,并将新索引重命名为旧索引的名称。

3.2.1 创建具有相同结构的空索引

创建一个新的索引,可以通过发送PUT请求到新索引,并在请求体中包含映射定义来实现。

PUT /new_index
{"mappings": {"properties": {"field1": { "type": "text" },"field2": { "type": "keyword" },// ... 其他字段定义,根据从旧索引获取的映射来填充 ...}}
}
# 创建名为 new-index 的索引
curl -uelastic:elastic_pwd -H "Content-Type:application/json" -XPUT http://127.0.0.1:6200/new_index -d @/data/my-index.txt

以上命令需要知道索引的结构,如果不知道,可以使用以下命令查看旧索引结构

3.2.2 获取旧索引结构

通过发送GET请求到旧索引的_mapping端点来实现: 

GET /old_index/_mapping
curl -uelastic:elastic_pwd -XGET http://127.0.0.1:6200/my_index/_mapping

3.2.3 删除旧索引

使用DELETE请求来删除索引。

DELETE /my_index
curl -uelastic:elastic_pwd -XDELETE http://127.0.0.1:6200/my_index

3.2.4 新索引重命名

为了使应用程序能够无缝地从旧索引切换到新索引,你可以使用Elasticsearch的别名功能。通过为新索引创建一个与旧索引同名的别名,可以让应用程序继续使用相同的索引名称来访问数据,而实际上是在访问新的索引。这样,从应用程序的角度来看,就实现了索引的“重命名”。

POST _aliases
{"actions": [{"add": {"index": "new_index","alias": "my_index"}}]
}
curl -u elastic:elastic_pwd -H "Content-Type:application/json" -XPOST http://127.0.0.1:6200/_aliases  -d '
{"actions": [{"add": {"alias": "my_index","index": "new_index"}}]
}'

3.3 方案分析

删除所有文档中DELETE BY QUERY操作可能会消耗一定的时间和资源,特别是在大型索引上。确保你的Elasticsearch集群能够处理这个操作,并考虑在低峰时段执行它,且无法恢复数据。

创建空索引删除旧索引,相对来说消耗的时间和资源较少,该案例没有提前设置索引别名,如果设置有索引别名,完全可以不用删除旧索引,方案可能会更好(参考方案五)

删除数据,并不会立即释放存储和内存,需要进行es数据的 segment合并操作,而这个操作特别消耗服务器资源(cpu和内存),数据越大消耗越大,数据大的情况下甚至容易造成进程卡死,数据量越大,做起来风险就越大

4 方案三:保留最近一部分es数据

此方案是在方案二的基础上进行的优化,根据客户要求,可以将es数据进行删除操作,但是最好可以保留最近30-60天的数据

4.1 条件删除文档

构建一个匹配60天前文档的查询,并使用DELETE BY QUERY API来删除它们。这样,索引的结构会保留,并且保留近60天的数据。

POST /my_index/_delete_by_query
{"query": {"range": {"@timestamp": {"gte" : "$date_start 00:00:00","lt" : "$date_end 00:00:00","format" : "yyyy-MM-dd HH:mm:ss"}}}
}
curl -uelastic:elastic_pwd -H "Content-Type:application/json" -XPOST http://127.0.0.1:6200/my_index/_delete_by_query -d '{"query": {"range": {"@timestamp": {"gte" : "$date_start 00:00:00","lt" : "$date_end 00:00:00","format" : "yyyy-MM-dd HH:mm:ss"}}}
}'

注:$date_start、$date_end为变量,可以自定义删除这两个日期之间的数据

4.2 创建空索引,同步近两个月的数据,删除旧索引

此方案是在方案二(3.2)的基础上添加步骤:新索引同步近两个月的数据

4.2.1 新索引同步近两个月的数据

注:此方法需要借助logstash应用

  • 创建同步数据使用的logstash配置文件,命名为logstash.conf
input {elasticsearch {hosts => ["127.0.0.1:6200"] index => "my_index" user => "elastic"           password => "elastic_pwd"size => 500scroll => "5m"docinfo => truequery => '{"query":{"range":{"@timestamp":{"gt":"2024-05-01 00:00:00"}}}}'}
}filter {
}output {elasticsearch {hosts => ["127.0.0.1:6200"]index => "new_index"user => "elastic"                password => "elastic_pwd"      }
}
  • 启动一个logstash 进程,使用logstah.conf 配置(logstash目录按实际情况修改,http.port端口需要写一个未被占用的端口 
/data/logstash-7.6.1/bin/logstash -f ./logstash.conf --path.data=./logstash_trans --http.port=6609 

4.3 方案分析

条件删除文档中DELETE BY QUERY操作可能会消耗一定的时间和资源,特别是在大型索引上。确保你的Elasticsearch集群能够处理这个操作,并考虑在低峰时段执行它,且无法恢复数据。

同步数据耗时太长,可能无法实施(经初步估算,测试环境测试同步1.3G数据,耗时40-50分钟,每天数据量大概800M,同步一个月数据耗时太长)

5 方案四:定时删除es数据

5.1 定时删除es数据脚本

脚本文件重命名为del_es_data.sh

#!/bin/bash# 保留数据的天数
DEL_BEF_DAYS=60
# es服务器ip:端口
ES_HOST='127.0.0.1:6200'function main
{typeset date_end=`date +%Y-%m-%d -d "$DEL_BEF_DAYS days ago"`typeset date_start=`date -d "1 days ago $date_end" +%Y-%m-%d`echo "date_start: $date_start 00:00:00"echo "date_end: $date_end 00:00:00"curl -u elastic:elastic_pwd -X POST http://$ES_HOST/my_index/_delete_by_query -H "Content-type: application/json" -d '{"query": {"range": {"@timestamp": {"gte" : "$date_start 00:00:00","lt" : "$date_end 00:00:00","format" : "yyyy-MM-dd HH:mm:ss"}}}}'echo "######################## 删除完成 ########################"
}main "$@"

5.2 设置定时任务

输入以下命令:

crontab -e

在打开的页面输入定时任务(每天凌晨0点0分执行删除es数据脚本): 

0 0 * * * /bin/del_es_data.sh

5.3 方案分析

单纯使用此方案无法解决问题,但可以保证es数据量不再增加,可以考虑与其他方案双管齐下。

6 定稿方案:增加es内存,使用新索引,定时删除es历史数据

通过对以上方案的优劣分析,最终制定定稿方案

6.1 增加es内存

参考2.1

编辑elasticsearch配置路径下的jvm.options文件,修改总堆空间的初始大小和总堆空间的最大大小,重启es应用即可

注:初始值和最大值应当被设置为相同的值

6.2 创建新索引

参考3.2.1

创建一个新的索引,可以通过发送PUT请求到新索引,并在请求体中包含映射定义来实现。

# 创建名为 new-index 的索引
curl -uelastic:elastic_pwd -H "Content-Type:application/json" -XPUT http://127.0.0.1:6200/new_index -d @/data/my-index.txt

以上命令需要知道索引的结构,如果不知道,可以使用以下命令查看旧索引结构(参考3.2.2)

curl -uelastic:elastic_pwd -XGET http://127.0.0.1:6200/my_index/_mapping

查看索引 (确认上面的新索引是否建立成功)

curl -uelastic:elastic_pwd http://127.0.0.1:6200/_cat/indices?v

6.3 删除旧索引别名(如果没有别名可跳过此步骤)

curl -uelastic:elastic_pwd -H "Content-Type:application/json" -XPOST http://127.0.0.1:6200/_aliases -d '
{"actions": [{"remove": {"alias": "my_index","index": "my_index-v1"}}]
}'

确认别名删除成功,确认返回值中 aliases字段的值为空。

curl -uelastic:elastic_pwd -XGET http://127.0.0.1:6200/my_index

6.4 删除旧索引(如果执行了6.3可跳过此步骤,保留历史数据)

参考3.2.3

使用DELETE请求来删除索引。

curl -uelastic:elastic_pwd -XDELETE http://127.0.0.1:6200/my_index

6.5 创建新索引别名

参考3.2.4

​
curl -u elastic:elastic_pwd -H "Content-Type:application/json" -XPOST http://127.0.0.1:6200/_aliases  -d '
{"actions": [{"add": {"alias": "my_index","index": "new_index"}}]
}'

确认别名创建成功,确认返回值中 aliases字段的值为my_index。

curl -u elastic:elastic_pwd -XGET http://127.0.0.1:6200/new_index

6.5 关闭旧索引(未删除旧索引时执行该步骤)

curl -u elastic:elastic_pwd -H "Content-Type:application/json" -XPOST http://127.0.0.1:6200/my_index/_close

注释:即使旧索引不再活跃,它仍然会占用磁盘空间和部分内存。这是因为Elasticsearch为了保持索引的可用性和快速检索能力,会保留索引的元数据和部分索引结构在内存中。此外,打开的文件句柄等资源也会被占用,直到索引被显式删除或关闭。

6.6 定时删除es数据

参考5 方案四

6.6.1 编写删除es数据脚本

脚本文件重命名为del_es_data.sh

#!/bin/bash# 保留数据的天数
DEL_BEF_DAYS=60
# es服务器ip:端口
ES_HOST='127.0.0.1:6200'function main
{typeset date_end=`date +%Y-%m-%d -d "$DEL_BEF_DAYS days ago"`typeset date_start=`date -d "1 days ago $date_end" +%Y-%m-%d`echo "date_start: $date_start 00:00:00"echo "date_end: $date_end 00:00:00"curl -u elastic:elastic_pwd -X POST http://$ES_HOST/my_index/_delete_by_query -H "Content-type: application/json" -d '{"query": {"range": {"@timestamp": {"gte" : "$date_start 00:00:00","lt" : "$date_end 00:00:00","format" : "yyyy-MM-dd HH:mm:ss"}}}}'echo "######################## 删除完成 ########################"
}main "$@"

6.6.2 设置定时任务

输入以下命令:

crontab -e

在打开的页面输入定时任务(每天凌晨0点0分执行删除es数据脚本): 

0 0 * * * /bin/del_es_data.sh

6.7 方案分析

操作简单、无风险,只是变更后无法查看历史数据(回退后即可查看历史数据)

注:回退时需要打开旧索引

curl -u elastic:elastic_pwd -H "Content-Type:application/json" -XPOST http://127.0.0.1:6200/my_index/_open

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript语言ES5版本详解(一)

ES6&#xff08;es2015&#xff09; 添加类和模块 ES7&#xff08;es2016&#xff09; 增加指数运算符 (**) 增加 Array.prototype.includes ECMAScript 的一些机能和其他编程语言的类似&#xff1b;特别是 Java&#xff0c;Self&#xff0c;和 Scheme。 ECMAScript 是在宿主环…

1964springboot VUE小程序在线学习管理系统开发mysql数据库uniapp开发java编程计算机网页源码maven项目

一、源码特点 springboot VUE uniapp 小程序 在线学习管理系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架uniapp和VUE完成本系统&#xff0c;对理解vue java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;…

dockercompose部署redis哨兵模式并集成springboot

第一步 编写compose文件 docker-compose.yml version: 3.8networks:redis-network:driver: bridgeservices:redis-master:image: redis:7.2.4container_name: redis-mastercommand: ["sh", "-c", "redis-server --protected-mode no --slave-announ…

Javascript中的this关键字指向

this关键字介绍 不同情况下的this 1.对象调用方法中的this 2.在全局使用this(单独使用) 3.函数中的this 4.函数严格模式下 5.事件中的this 6.构造函数中的this 7.箭头函数没有this call()、apply()、bind() 的用法 this关键字介绍 面向对象语言中 this 表示当前对象…

Java项目:基于SSM框架实现的电子竞技管理平台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的电子竞技管理平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

【C++庖丁解牛】函数栈帧的创建与销毁

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. 寄存器2. ebp和esp是如…

记一次服务器崩溃事件

今天在安装Jenkins的时候&#xff0c;进行到插件安装这一步&#xff0c;本来一切顺利&#xff0c;结果最后安装完成之后一直进不去网页&#xff0c;显示连接超时&#xff0c;网上搜索了一圈也没发现什么相似的情况&#xff0c;当我疑惑的时候回到Linux控制台&#xff0c;发现命…

天气冷电脑不能启动找不到硬盘

https://diy.zol.com.cn/2004/0611/101994.shtml

java基于ssm+jsp 人才公寓管理系统

1管理员功能模块 管理员登录&#xff0c;通过填写用户名、密码进行登录&#xff0c;如图1所示。 图1管理员登录界面图 管理员登录进入人才公寓管理系统可以查看个人中心、住户管理、小区公告管理、停车位管理、安保人员管理、安保值班管理、房屋信息管理、外来登记管理、物品…

计算机网络 —— 应用层(电子邮件)

计算机网络 —— 应用层&#xff08;电子邮件&#xff09; 电子邮件发送电子邮件的过程SMTP特性工作流程 电子邮件格式MIME关键组件工作方式 POP/IMAPPOP&#xff08;邮局协议&#xff09;IMAP&#xff08;因特网邮件访问协议&#xff09; 基于万维网的电子邮箱特点优势常见的基…

Kafka精要

Apach Kafka 是一款分布式流处理框架&#xff0c;用于实时构建流处理应用。它有一个核心 的功能广为人知&#xff0c;即 作为企业级的消息引擎被广泛使用 kafka设计 Kafka 将消息以 topic 为单位进行归纳 将向 Kafka topic 发布消息的程序成为 producers. 将预订 topics 并消…

RK3568平台(音频篇)音频ALSA框架

一.ALSA框架简介 ALSA表示先进linux声音架构&#xff08;Advanced Linux Sound Archiecture&#xff09;&#xff0c;它由一系列的内核驱动、应用程序编程接口&#xff08;API&#xff09;以及支持linux下声音的应用程序组成、 ALSA项目发起的原有是linux下的声卡驱动&#x…

神经网络 #数据挖掘 #Python

神经网络是一种受生物神经元系统启发的人工计算模型&#xff0c;用于模仿人脑的学习和决策过程。它由大量互相连接的节点&#xff08;称为神经元&#xff09;组成&#xff0c;这些节点处理和传递信息。神经网络通常包含输入层、隐藏层&#xff08;可有多个&#xff09;和输出层…

C语言入门课程学习笔记10:结构体联合体位域

C语言入门课程学习笔记10 第48课 - 自定义数据类型&#xff08;上&#xff09;实验-typedef实验小结 第49课 - 自定义数据类型&#xff08;中&#xff09;实验实验小结 第50课 - 自定义数据类型&#xff08;下&#xff09;实验实验小结 第51课 - 多文件程序设计实验实验实验小结…

XSS跨站攻击漏洞

XSS跨站攻击漏洞 一 概述 1 XSS概述 xss全称为&#xff1a;Cross Site Scripting&#xff0c;指跨站攻击脚本&#xff0c;XSS漏洞发生在前端&#xff0c;攻击的是浏览器的解析引擎&#xff0c;XSS就是让攻击者的JavaScript代码在受害者的浏览器上执行。 XSS攻击者的目的就是…

【云手机】数据安全如何保障?

安全办公&#xff0c;信息安全&#xff0c;这是企业使用云手机的初衷和目的&#xff0c;云手机在数据保密&#xff0c;远程办公等功能上有巨大的优势&#xff0c;也为企业提供了支持 首先就是云手机能够实现数据的集中管理和加密存储。所有办公相关的数据都存储在云端的安全服务…

SX1308 是一款超小封装高效率、直流升压稳压电路。兼容SDB628

一般说明 SX1308是一款恒频6针SOT23电流模式升压变换器&#xff0c;适用于小型、低功耗应用。SX1308开关的频率为1.2MHz&#xff0c;允许使用尺寸小、成本低的电容和2毫米或更小的电感。内部软启动可减少突发电流并延长电池寿命。 该SX1308功能自动切换到轻载脉冲…

HTTP/3 协议学习

前一篇&#xff1a; HTTP/2 协议学习-CSDN博客 HTTP/3 协议介绍 HTTP/3 是互联网上用于传输超文本的协议 HTTP 的第三个主要版本。它是 HTTP/2 的后继者&#xff0c;旨在进一步提高网络性能和安全性。HTTP/3 与前两个版本的主要区别在于它使用了一个完全不同的底层传输协议—…

全行业通用商城小程序源码

一站式购物新体验 一、引言&#xff1a;开启数字化购物新时代 在数字化快速发展的今天&#xff0c;小程序成为了商家们连接消费者的重要桥梁。特别是“全行业通用商城小程序”&#xff0c;以其便捷的购物体验和多样化的功能&#xff0c;成为了越来越多商家和消费者的首选。本…

斯坦福大学 AI 研究部门推出的“7 周人工智能学习计划”

①AI Python 基础&#xff0c;包括计算机原理、语法、判断语句等&#xff1b; ②AI Python 进阶&#xff0c;涉及 Linux 命令、多任务编程等&#xff1b; ③机器学习&#xff0c;涵盖算法、数据结构等&#xff1b; ④计算机视觉与图像处理&#xff0c;包含图像分类、目标检测…