一,遇到OutOfMemoryError问题

打开Kibana,发现连不上Elasticsearch了,提示Cannot connect to the Elasticsearch cluster,检查:

systemctl status elasticsearch

发现是Elasticsearch service dead挂了。

继续检查错误日志/var/log/elasticsearch/elasticsearch.log

[ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [laolitou] fatal error in thread [elasticsearch[laolitou][write][T#1]], exiting

java.lang.OutOfMemoryError: Java heap space...

疑似Elasticsearch内存溢出。

通过

free -h

确实发现系统内存几乎100% ;

进一步的对各程序的资源使用做使用排序

ps aux --sort=-%mem | head

发现 Elasticsearch内存超出了jvm.options里的设定:

vim /etc/elasticsearch/jvm.options

理论上,其中的-Xms(初始堆大小)和-Xmx(最大堆大小)参数适当调大就可以解决问题。可是我资源升级服务器,只能进一步压缩Elasticsearch的内存。也就是删除历史久远的索引文件,以到达清理内存和磁盘空间的作用。

 二,查询历史索引文件

首先,你需要登录到Kibana界面。在Kibana中,通常有一个名为“Dev Tools”的部分,它提供了一个用于执行Elasticsearch请求和响应的交互式界面。在Console中输入查询语句

GET /_cat/indices/your_old_indexname_*?v

//支持*模糊查询

也可以通过Kibana下的“Management”下,查看Elasticsearch中的Index management查看索引清单,支持通过索引名称模糊查询。

三,删除数据

1,使用Delete By Query API

在Dev Tools中,你可以编写并执行Elasticsearch的Delete By Query API请求来删除特定条件下的数据。这个API允许你基于查询条件删除文档。例如,你可以编写一个查询来删除某个索引中特定日期之前的所有文档。

POST /your_index/_delete_by_query

{

"query": {

"range": {

"date_field": {

"lt": "2023-01-01"

}

}

}

}

这个请求会删除your_index索引中date_field字段值小于"2023-01-01"的所有文档。

2,删除具体索引

除了删除特定数据外,你还可以直接删除整个不再需要的索引。在Dev Tools中,你可以使用Delete Index API来删除索引。

DELETE /your_old_index

DELETE /your_old_index1,your_old_index2,your_xyz_*

// 根据实际情况修改索引名称模式

四,优化索引以释放磁盘空间

删除数据后,Elasticsearch并不会立即释放磁盘空间,因为删除操作只是标记文档为已删除,并不会立即清理底层文件。为了释放磁盘空间,你可以使用Force Merge API来合并段并清理删除标记。

POST /your_index/_forcemerge?max_num_segments=1&only_expunge_deletes=true

POST /_forcemerge?max_num_segments=1&only_expunge_deletes=true

执行完删除和清理操作后,使用Kibana的Monitoring功能或其他监控工具来检查Elasticsearch集群的状态和磁盘使用情况,确保一切正常。同时,也可以再次列出索引来确认已删除的索引不再出现在列表中。

五,其他:堆外内存和内存锁定

在以上操作后,可能部分环境下磁盘是明显降低了,但是内存还不降低的原因1是因为内存占用不会低于jvm.options的-Xms(初始堆大小),2是因为Elasticsearch除了使用JVM堆内存外,还会使用一部分堆外内存。堆外内存主要用于缓存文件系统数据、网络缓冲区等。因此,即使JVM堆内存被限制为1G,Elasticsearch的总内存使用也可能超过这个值。

另外建议不要修改yml文件里的bootstrap.memory_lock: true,保持默认true的状态。它可以将JVM的物理内存地址锁定,防止操作系统交换出去,从而提高查询速度。

推荐文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。