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 => 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

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

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

相关文章

Qt项目天气预报(5) - 根据JSON刷新天气信息+城市匹配

刷新当天天气 我们使用如下api接入&#xff0c;当然需要自己去 易客云天气API免费天气API接口|天气预报接口|全球天气API接口|气象预警|空气质量 (tianqiapi.com)注册后生成自己的对应id才可以使用 //专业天气v61 http://v1.yiketianqi.com/api?unescape1&versionv61&…

力扣爆刷第153天之TOP100五连刷26-30(接雨水、环形链表、最长上升子序列)

力扣爆刷第153天之TOP100五连刷26-30&#xff08;接雨水、环形链表、最长上升子序列&#xff09; 文章目录 力扣爆刷第153天之TOP100五连刷26-30&#xff08;接雨水、环形链表、最长上升子序列&#xff09;一、300. 最长递增子序列二、415. 字符串相加三、143. 重排链表四、42.…

docker技术的说明

根据学习网站整理&#xff1a;Docker 10分钟快速入门_哔哩哔哩_bilibili 小白也能看懂的容器科普说明_哔哩哔哩_bilibili 1.虚拟机&#xff0c;需要模拟硬件系统、运行整个操作系统&#xff0c;但体积臃肿&#xff0c;内存占用较高&#xff0c;程序的性能也会受到影响。 2.…

哪里找好用的商城系统源码?

很多企业在挑选商城系统时&#xff0c;由于不懂源码&#xff0c;很难选择到高质量源码的商城系统&#xff0c;那么哪里找好用的商城系统源码?如何选择?接下来就跟着启山智软小编一起来看看吧&#xff0c;以下为选择源码时的四看&#xff1a; 1.一看源码公司行业动态 可以查…

git上传本地项目及更新项目

1、注册GitHub账号和下载git 2、在GitHub上新建一个仓库&#xff0c;点击号——>New repository&#xff0c;给仓库起一个名字&#xff0c;点击Create repository 3、进入要上传的项目中&#xff0c;右键点击git back here&#xff0c;命令行输入git init初始化&#xff0c…

13个行业数据分析指标体系如何建设100问

提供针对13个行业的数据分析指标体系的全面指南&#xff0c;涵盖各行业的关键指标和分析维度&#xff0c;帮助读者深入了解和构建有效的指标体系。以下是文章的主要内容&#xff1a; 电商行业数据指标体系&#xff1a;包括客户价值、商品、网站流量、整体运营、市场营销活动、市…

什么是响应式编程

我们知道&#xff0c;当系统面对大流量、高并发的访问请求时&#xff0c;就可能会出现一系列性能问题&#xff0c;导致服务丧失了即时的响应性。如何时刻确保系统具有应对请求压力的能力&#xff0c;是架构设计的核心问题之一。 经典的服务隔离、限流、降级以及熔断等机制能够在…

基于Istio服务网格的熔断限流实现

在微服务架构的宏大图景中&#xff0c;Istio服务网格如同一位精巧的交通指挥官&#xff0c;它不仅确保了服务间通信的顺畅无阻&#xff0c;还通过先进的熔断与限流机制&#xff0c;为系统的稳定性筑起了一道坚固的防线。接下来&#xff0c;让我们一窥Istio如何在不改动服务代码…

YTM32的flash存储器boot-swap功能详解

YTM32的flash存储器boot-swap功能详解 文章目录 YTM32的flash存储器boot-swap功能详解IntroductionPricinple & MachenisimApplication基本的boot swap用例不更新bootloader的情况更新bootloader的情况 Conclusion Introduction 客户在开发量产型的ECU软件时&#xff0c;大…

并发编程理论基础——管程(并发编程的万能钥匙)(七)

什么是管程 Java采用了管程技术&#xff0c;synchronized关键字及wait()、notify()、notifyAll()三个方法都是管程的组成部分管程和信号量是等价的&#xff0c;管程和信号量之间可以互相实现英文名&#xff1a;Monitor 直译为监视器管程指的是管理共享变量以及对共享变量的操作…

项目性能优化之给dist文件夹中chunk-vendors.js做splitChunks分包,从而减少首屏加载时间

问题描述 我们项目做完,验收通过以后,就需要打包发布上线啦。于是我们执行命令:npm run build打dist包,打包完以后截图如下: 直接打包的chunk-vendors.js太大了 chunk-vendors.js文件太大了,所以我们需要将其优化一下,拆分一下 chunk-vendors.js是啥 chunk-vendors.j…

一种自定义SPI通信协议

本文介绍一种自定义SPI通信协议。 项目开发过程中&#xff0c;有时候会涉及到主处理器或FPGA和MCU之间的SPI通信&#xff0c;涉及到通信就需要考虑通信协议&#xff0c;本文给出一种简单的通信协议。 1.协议格式 协议格式如下图。 其中&#xff0c;将40 bit划分为2大部分&am…

代码随想录训练营Day 69|并查集理论基础、卡码网107.寻找存在的路径

1.并查集理论基础 并查集理论基础 | 代码随想录 并查集可以解决什么问题呢&#xff1f; 主要就是集合问题&#xff0c;两个节点在不在一个集合&#xff0c;也可以将两个节点添加到一个集合中。 注意&#xff1a;求根是求箭头出发的数 路径压缩&#xff1a;求根的根。把根的根的…

【C语言】数据的存储

目录 Ⅰ、数据类型介绍 1.类型的基本归类&#xff1a; Ⅱ、整形在内存中的存储 1 .原码、反码、补码 2. 大小端介绍 3 练习&#xff1a; Ⅲ、浮点型在内存中的存储 1 .浮点数存储规则 本章重点 1. 数据类型详细介绍 2. 整形在内存中的存储&#xff1a;原码、反码、补码 3. …

测试卡无法仪表注册问题分析

1、问题描述 00101测试卡无法注册LTE网络&#xff0c;modemlog中发现终端未发起Attach请求&#xff0c;对比正常注册非正常注册的版本&#xff0c;发现正常的多出了ims apn。可以通过ATCGDCONT?来查询modem APN参数。 2、问题分析 目前Modem是一套&#xff0c;没有相关修改。因…

SpringBoot使用滑动窗口限流防止用户重复提交(自定义注解实现)

在你的项目中&#xff0c;有没有遇到用户重复提交的场景&#xff0c;即当用户因为网络延迟等情况把已经提交过一次的东西再次进行了提价&#xff0c;本篇文章将向各位介绍使用滑动窗口限流的方式来防止用户重复提交&#xff0c;并通过我们的自定义注解来进行封装功能。 首先&a…

vue3 element-plus 实现 table表格合并单元格 和 多级表头

多级表头 数据结构比较复杂的时候&#xff0c;可使用多级表头来展现数据的层次关系。 只需要将el-table-column 放置于el-table-column 中&#xff0c;你可以实现组头。 一般可以直接用官网提供的写法&#xff0c;但是有可能数据会比较多的时候&#xff0c;就需要我们稍微改造…

江门电子行业实施MES系统前后对比

在江门电子行业实施MES系统之前和之后的对比可以涉及以下几个方面&#xff1a; 生产效率提升&#xff1a;实施MES系统后&#xff0c;江门电子行业可以实现生产过程的实时监控和优化&#xff0c;减少生产中的浪费和停机时间&#xff0c;提高生产效率。 质量控制改善&#xff1a;…

【稀疏三维重建】Flash3D:单张图像重建场景的GaussianSplitting

项目主页&#xff1a;https://www.robots.ox.ac.uk/~vgg/research/flash3d/ 来源&#xff1a;牛津、澳大利亚国立 文章目录 摘要1.引言2.相关工作3.方法3.1 背景&#xff1a;从单个图像中重建场景3.2 单目前向的多个高斯 4.实验4.14.2 跨域新视角合成4.3 域内新视图合成 摘要 F…

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

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