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

news2024/12/25 8:54:12

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

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 => 500
		scroll => "5m"
		docinfo => true
		query => '{"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.coloradmin.cn/o/1857909.html

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

相关文章

揭秘红酒酿造魔法:看葡萄如何华丽变身酿成

红酒&#xff0c;这一液体中的诗篇&#xff0c;从葡萄园中的翠绿到酒窖里的深沉&#xff0c;每一滴都蕴含着大自然的恩赐与酿酒师的智慧。今天&#xff0c;就让我们一起揭开红酒酿造的神秘面纱&#xff0c;探寻从葡萄到佳酿的魔法之旅&#xff0c;并特别聚焦在备受赞誉的雷盛红…

2024年数据、自动化与智能计算国际学术会议(ICDAIC 2024)

全称&#xff1a;2024年数据、自动化与智能计算国际学术会议&#xff08;ICDAIC 2024&#xff09; 会议网址:http://www.icdaic.com 会议地点: 厦门 投稿邮箱&#xff1a;icdaicsub-conf.com投稿标题&#xff1a;ArticleTEL。投稿时请在邮件正文备注&#xff1a;学生投稿&#…

第二届“讯方杯”全国大学生信息技术应用及创新大赛圆满落幕!

6月21日-23日&#xff0c;2023-2024“讯方杯”全国大学生信息技术应用及创新大赛全国总决赛在广东科技学院松山湖校区圆满举办。本届全国总决赛由深圳市讯方技术股份有限公司主办&#xff0c;广东科技学院承办&#xff0c;深圳市职前通教育有限责任公司协办。 广东科技学院副校…

【干货】客户裂变实战:策略与案例分享

在当今竞争激烈的市场环境中&#xff0c;客户裂变成为了许多企业快速增长的关键策略。客户裂变&#xff0c;即利用现有客户的社交网络和影响力&#xff0c;吸引更多潜在客户&#xff0c;从而实现客户数量的快速增长。本文将分享一些客户裂变的实战策略及成功案例。 一、客户裂…

【权威发布】2024年文化、设计与社会科学国际会议(ICCDSS 2024)

2024年文化、设计与社会科学国际会议 2024 International Conference on Culture, Design, and Social Sciences 会议简介 2024年文化、设计与社会科学国际会议旨在为全球范围内的专家学者提供一个交流文化、设计与社会科学研究成果的平台。会议将围绕文化、设计与社会科学的前…

使用Python进行数据分析和自动化

组织严重依赖数据分析和自动化来提高运营效率。在本文中&#xff0c;我们将使用 Python&#xff08;一种用于通用编程的高级编程语言&#xff09;的示例来研究数据分析和自动化的基础知识。 什么是数据分析&#xff1f; 数据分析是指检查、清理、转换和建模数据的过程&#xf…

ONLYOFFICE 桌面编辑器8.1最新版本强势来袭!

文章目录 软件介绍一、安装与界面安装过程用户界面 二、性能与稳定性启动速度与响应时间稳定性 三、兼容性与集成文件格式兼容性第三方集成 四、可支持多人协作五、功能齐全的PDF编辑器六、PDF表单七、文档编辑器中的新增功能八、总结九、自己的建议 软件介绍 在现代办公环境中…

【Oracle安装】Linux安装Oracle内存不够怎么都装不上,卡在46%、60%、36%;内存不足解决办法,疑难杂症

一、问题描述 1.oracle 安装不报错&#xff0c;但就是无法安装成功&#xff0c;卡住 总是中途卡住&#xff0c;不一定卡在哪儿&#xff0c;也许是36%、46%、60%等等 它也不报错&#xff0c;什么都不说&#xff0c;或者过一会儿服务器自己把oracle的安装进程给杀了&#xff08…

从广州到上海|荣载光的智慧 与SSHT共同探索智能照明更多想象空间

随着生活水平的提高&#xff0c;大众对高品质生活的追求脚步逐步加快&#xff0c;人们对智能照明的需求日益多样化&#xff0c;不再仅仅满足于传统的照明功能&#xff0c;而是转向智能照明系统&#xff0c;提出更高的需求。 展望未来&#xff0c;中国智能照明市场预计将迎来全…

SpringMVC系列十: 中文乱码处理与JSON处理

文章目录 中文乱码处理自定义中文乱码过滤器Spring提供的过滤器处理中文 处理json和HttpMessageConverter<T>处理JSON-ResponseBody处理JSON-RequestBody处理JSON-注意事项和细节HttpMessageConverter<T\>文件下载-ResponseEntity<T\>作业布置 上一讲, 我们学…

区块链学习03-空投篇

Hybrid 是与 以太坊 兼容的第 2 层区块链&#xff0c;集成了混合专家 (MoE) 框架&#xff0c;支持以即插即用的方式轻松创建和货币化 AI 代理。该平台旨在提高区块链应用程序中数据的完整性和可用性&#xff0c;支持跨各个行业开发和部署 AI 驱动的解决方案。 Hybrid 正在为其…

JINGWHALE WH 迭代思维法:科学优化问题解析、任务策略规划与高效工作汇报的赋能艺术

JINGWHALE 对此论文相关未知以及已知概念、定理、公式、图片等内容的感悟、分析、创新、创造等拥有作品著作权。未经 JINGWHALE 授权&#xff0c;禁止转载与商业使用。

【网络安全的神秘世界】搭建dvwa靶场

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 下载DVWA https://github.com/digininja/DVWA/blob/master/README.zh.md 安装DVWA 安装phpstudy https://editor.csdn.net…

黄仁勋口中“生物工程化”的美好愿景,正在被这家公司努力变成现实

6月20日&#xff0c;一家为人类细胞编码新疗法的公司&#xff0c;也是合成生物学领域的先驱英国合成生物公司bit.bio宣布推出ioAstrocytes&#xff0c;这是一种功能性人类iPSC&#xff08;诱导多能干细胞&#xff09;衍生的星形胶质细胞&#xff0c;科学家表示该产品为中枢神经…

深入理解Qt属性系统[Q_PROPERTY]

Qt 属性系统是 Qt 框架中一个非常核心和强大的部分&#xff0c;它提供了一种标准化的方法来访问对象的属性。这一系统不仅使得开发者能够以一致的方式处理各种数据类型&#xff0c;还为动态属性的管理提供了支持&#xff0c;并与 Qt 的元对象系统紧密集成。在这篇文章中&#x…

每日AI资讯-20240622

1. 可灵AI全新功能上线&#xff01; 可灵AI全新功能上线&#xff01;图生视频和视频续写来啦&#xff01; 图生视频&#xff1a;上传任意图片&#xff0c;生成5秒精彩视频。支持添加提示词控制图像运动视频续写&#xff1a;对生成视频一键续写4&#xff5e;5秒&#xff0c;支持…

App推广新突破!Xinstall无注册码方案,一键解决您的获客难题

在互联网的浪潮中&#xff0c;App推广与运营面临着前所未有的挑战。随着流量红利的衰退&#xff0c;如何高效、精准地触达用户&#xff0c;提升用户留存和转化率&#xff0c;成为每个企业都必须面对的问题。在这个关键时刻&#xff0c;Xinstall以其无注册码的解决方案&#xff…

深入测评:ONLYOFFICE 8.1 桌面编辑器究竟有多强大?

ONLYOFFICE 8.1桌面编辑器 文章目录 ONLYOFFICE 8.1桌面编辑器一、ONLYOFFICE的简介二、ONLYOFFICE 8.1新功能和改进2.1 轻松编辑器 PDF 文件2.2 用幻灯片版式快速修改幻灯片2.3 无缝切换文档编辑、审阅和查看模式2.4 改进从右至左语言的支持 & 新的本地化选项2.5 隐藏“连…

《精通嵌入式Linux编程》——解锁嵌入式Linux开发的无限可能

文章目录 &#x1f4d1;前言一、书籍概览与作者风采二、内容详解与特色亮点2.1 嵌入式Linux基础与入门2.2 系统编程与内核探索2.3 驱动开发与实战演练2.4 内存管理与性能优化2.5 系统调试与性能提升2.6 综合项目实践与案例分析 三、书籍价值与应用展望 &#x1f4d1;前言 在当今…

软件测试计划审核表、试运行审核、试运行申请表、开工申请表

1、系统测试计划审核表 2、系统试运行审核表 3、系统试运行申请表 4、开工申请表 5、开工令 6、项目经理授权书 软件全套资料获取&#xff1a;本文末个人名片直接获取或者进主页。 系统测试计划审核表 系统试运行审核表 系统试运行申请表 开工申请表 开工令 项目经理授权书