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.mzph.cn/pingmian/34277.shtml

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

相关文章

Java--Data类

1.Data类 java.util.Date.表示指定的时间信息&#xff0c;不支持国际化 构造方法 new Date()&#xff1a;当前系统日期和时间 new Date(long)&#xff1a;给定日期和时间 主要方法&#xff1a; after(Date):判断当前日期对象是否在给定日期对象之后 before(Date):判断当前日期…

(上位机APP开发)调用华为云属性修改API接口修改设备属性

一、功能说明 通过调用华为云IOT提供的属性修改API接口,给设备下发属性修改消息。 API接口地址:https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html 此接口支持在线调试:https://console.huaweicloud.com/apiexplorer/#/openapi/IoTDA/doc?api=UpdatePrope…

(一)、配置服务器的多个网卡路由,访问多个不同网络段

一、现场网络关系说明 有这么一个需要&#xff0c;服务器有三个网口&#xff0c;网口一需要访问外网&#xff0c;网口二需要访问内网1&#xff0c;网口2需要访问内网2。需要配置路由来满足该网络访问需要。 图1 现场网络关系 二、配置教程 步骤1&#xff1a; a、命令行输入…

文本批量高效编辑神器:空格秒变分隔符,提升工作效率

在信息爆炸的时代&#xff0c;文本处理已成为我们日常工作中不可或缺的一部分。然而&#xff0c;面对海量的文本数据&#xff0c;如何高效、准确地进行编辑和整理&#xff0c;成为了我们面临的难题。今天&#xff0c;我要向大家介绍一款文本批量高效编辑神器——首助编辑高手&a…

Springboot整合Mongodb(含使用案例)

基础语法 插入 插入单条 // 插入一条数据到 "Books" 集合 db.Books.insertOne({title: "如何使用MongoDB",author: "IT小辉同学",year: 2023 })插入多条数据 // 插入十条数据到 "Books" 集合 db.Books.insertMany([{ title: "…

期末考试的成绩怎么发?

随着学期末的临近&#xff0c;我们又迎来了向家长通报学生成绩的关键时刻。下面是一份成绩群发的全新指南&#xff0c;让我们一起高效而温馨地完成这项任务&#xff01; 1.选择沟通渠道&#xff1a; - 邮件与短信各有优势。邮件更适合提供详尽的成绩分析和评语&#xff0c;而短…

【Nginx】Nginx安装及简单使用

https://www.bilibili.com/video/BV1F5411J7vK https://www.kuangstudy.com/bbs/1353634800149213186 https://stonecoding.net/system/nginx/nginx.html https://blog.csdn.net/qq_40492693/article/details/124453090 Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器。其特…

vim操作小诀窍:快速多行添加注释

在使用vim编译python代码的时候&#xff0c;经常碰到需要将一段代码注释的情况&#xff0c;每次都要按“向下” “向左”按钮&#xff0c;将光标移到句首&#xff0c;然后再键入#井号键。如果行数较多&#xff0c;则操作相当繁琐。 vim里面有将一段文字前面加#注释的方法&#…

LLVM——安装多版本LLVM和Clang并切换使用(Ubuntu)

1、描述 本机&#xff08;Ubuntu22&#xff09;已经安装了LLVM-14&#xff0c;但是需要使用LLVM-12。安装LLVM-12和Clang-12并切换使用。 2、过程 安装LLVM-12和Clang-12。 sudo apt-get install llvm-12 sudo apt-get install clang-12 【注】运行 sudo apt-get install ll…

【备考指南】数据分析备考资料

很多考生朋友在报名前后&#xff0c;一直不知道需要怎么备考&#xff0c;这里给大家盘点一下资料&#xff0c;希望对你有用&#xff1a; 1、cda数据分析师的硬技能与软技能&#xff1a;https://edu.cda.cn/goods/show/3604 2、机器学习驱动的金融风控&#xff1a;https://edu.…

windowns server2016服务器配置php调用powerpoint COM组件

解决问题&#xff1a;windowns server2016服务器配置php调用powerpoint COM组件 环境&#xff1a; windows server2016 宝塔&#xff08;nginxmysqlphp7.2&#xff09; IIS 搭建宝塔&#xff1a; 下载地址&#xff1a;https://www.bt.cn/download/windows.html ​ 安装使用&…

春招面试面经总结篇

目录 前言一&#xff0c;算法篇1.1 平拍数组1.2 括号匹配1.3 打家劫舍1.4 删除最少使字符串平衡1.5 爬楼梯 二&#xff0c;数据结构篇2.1 二叉树2.2 链表 三&#xff0c;HTML篇3.1 H5新的语义标签3.2 href和src 四&#xff0c;CSS篇4.1 居中4.2 父元素塌陷解决4.3 外边距塌陷4.…

藏在十九页PPT里的“海合安之道”

6月6日&#xff0c;成立仅仅两年多的海合安集团亮相2024中国主题公园战略营销峰会&#xff0c;作为本届峰会最年轻的主题公园企业&#xff0c;备受行业关注。 海合安集团成立于2021年&#xff0c;为亚洲最大私募投资基金之一的安博凯投资基金&#xff08;MBK Partners&#xf…

开发一个python工具,pdf转图片,并且截成单个图片,然后修整没用的白边及循环遍历文件夹全量压缩图片

今天推荐一键款本人开发的pdf转单张图片并截取没有用的白边工具 一、开发背景&#xff1a; 业务需要将一个pdf文件展示在前端显示&#xff0c;但是基于各种原因&#xff0c;放弃了h5使用插件展示 原因有多个&#xff0c;文件资源太大加载太慢、pdf展示兼容性问题、pdf展示效果…

Git 常用命令,一文全搞懂

注意&#xff1a;每一次切换分支的时候&#xff0c;本地代码都会自动跟随改变&#xff0c;不需要重新pull,除非有人更新了代码 git remote add origin 地址 连接远程仓库 git clone 地址 克隆项目到本地 git init 更新本地隐藏文件初始化仓库 git add . 代…

周记-2024第25周

2024.6.12-2024.6.23 本周有什么新的收获和进步&#xff0c;总结一下。 记忆力下降的很快&#xff0c;即便是本周的日记&#xff0c;我在回看时&#xff0c;也发现很多都已经忘了。时间也是一样&#xff0c;如果时间日志上没有记录某个时间段做了什么&#xff0c;我发现第二天…

PayPal账号冻结原因及应对

在跨境领域&#xff0c;PayPal这种收款方式&#xff0c;可以说是如影随形&#xff0c;是很多跨境卖家和外贸B2B商户首选的收款方式&#xff0c;就和我们在国内使用某宝、某信一样常见。但使用PayPal收款&#xff0c;最头疼的就是遇到账户冻结以及各种审核&#xff0c;那出现这个…

python例子:翻译器(简单)

作品介绍 作品名称&#xff1a;翻译器 开发环境&#xff1a;PyCharm 2023.3.4 python3.7 用到的库&#xff1a;PyQt5、translate、sys 作品简介&#xff1a;“输入内容”输入要翻译的中文内容&#xff0c;“选择语言”选择要翻译的语种&#xff0c;最后点击“开始翻译”&a…

大模型中的Lang chain是什么意思

LangChain 是一个开源框架&#xff0c;旨在简化构建和操作由大型语言模型 (LLMs) 驱动的应用程序。它提供了一套工具和抽象&#xff0c;帮助开发者将多个语言模型集成到应用程序中&#xff0c;并简化了模型的管理、交互和扩展。 LangChain 的核心概念 Chain&#xff08;链&…

基于轨迹加权的混合离线强化学习数据集

写在前面&#xff1a; 这篇论文阅读已经同步到我的博客网站&#xff0c;若需更优的阅读体验&#xff0c;请前往https://mainjaylai.github.io/Blog/blog/paper/trajectory-dataset进行浏览 摘要 大多数离线强化学习&#xff08;RL&#xff09;算法通过最大化目标策略的期望性…