一,遇到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的总内存使用也可能超过这个值。文章来源:https://www.toymoban.com/news/detail-853615.html
另外建议不要修改yml文件里的bootstrap.memory_lock: true
,保持默认true的状态。它可以将JVM的物理内存地址锁定,防止操作系统交换出去,从而提高查询速度。文章来源地址https://www.toymoban.com/news/detail-853615.html
到了这里,关于清理Elasticsearch占用的内存和磁盘空间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!