Elasticsearch实例磁盘占用率高排查及解决

开源 ES 实例健康状态

首先,先介绍下开源 Elasticsearch 的三种健康状态:绿色、黄色和红色。


在分片层面,

绿色:所有的主分片和副本分片都已分配。你的集群是 100% 可用的。

黄色:所有主分片都已经分配,但至少有一个副本分片未被分配。此时,搜索结果是正确、完整的,不会有数据丢失。但高可用性已经被弱化,有丢失数据的风险。应尽快介入处理。

红色:集群中至少有一个主分片(以及它的所有副本)未被分配,意味着搜索时将缺少数据,至返回部分数据;同时,要写入该分片的请求会返回异常。


这时候您可能会问:“如果集群中有的索引是绿色,有的是黄色,这时候该怎么决定集群的健康度呢?”

集群的健康状态由最差的索引决定,索引的健康状态由最差的分片决定。


阿里云 ES 实例的健康状态

本文主要从磁盘占用达到高水位问题来谈谈 ES 集群健康状态。

大家都知道,阿里云 ES 在一定前提下,重启时是可以持续提供服务的。

前提是:

1. 阿里云ES实例健康度必须确保是绿色状态

2. 至少包含1个副本

注意:不排除节点在重启期间,对应CPU和内存使用率会存在临时突增,服务可能会出现抖动,正常情况下过一段时间后会恢复正常。


但是!阿里云 ES 实例在磁盘率使用超过 85% 以上后,阿里云 ES 实例的状态可能会出现黄色或红色,将不支持重启操作,需要做强制重启操作。

如果 ES 实例处于非健康状态(Yello/Red),此时不建议对阿里云 ES 实例进行节点扩容、磁盘扩容、重启、修改密码、变更配置等操作,请务必保证集群状态变为Green后再进行对应操作。存在的主要风险有:重启期间服务不可用、重启时间较长等。


那么问题来了?如果某时某刻,您发现集群状态不健康了,变为了黄色或红色。那么该怎么处理呢?

下面先介绍下,最大的磁盘占用元凶——监控日志!


监控日志

阿里云 Elasticsearch 提供开源 Elasticsearch 5.5.3和6.3.2版本,及商业版 x-pack 插件服务,在开源 Elasticsearch 基础上提供企业级权限管控、安全监控告警、自动报表生成等功能。

默认情况下 x-pack 监控客户端,会每隔10s采集集群的监控信息,目前主要有 .monitoring-es-*、.monitoring-kibana-* 这两种索引,以天为单位滚动创建,默认保留最近7天日志。采集完的信息会保存在以 .monitoring- 为前缀,加当前日期为后缀的索引中。(例如:.monitoring-es-6-2019.01.20

其中.monitoring-es-*索引相对占用磁盘空间较大,主要存放了集群状态、集群统计、节点统计、索引统计等信息。


排查及解决办法:

注:本文主要介绍使用 curl 工具调用 ES 相关 API 来操作集群,以达到清理磁盘空间的目的。

出于安全考虑,阿里云 ES 强制执行 elasticsearch-http-basic 鉴权。所以 curl 脚本语句基本格式如下:

curl -X [HTTP 方法:GET, PUT, POST, DELETE等] -u username:password 实例地址:9200/[ES 相关 API]

1. GET _cluster/health: 查询集群健康度

Elasticsearch实例磁盘占用率高排查及解决


2. GET _cat/indices: 查询所有索引信息

Elasticsearch实例磁盘占用率高排查及解决

观察到,.monitoring-es-* 占用大量磁盘空间,谨慎选择可以删除的监控日志索引,执行第三步。


3. DELETE /索引名称: 删除指定名称的索引

Elasticsearch实例磁盘占用率高排查及解决


注意:为了保障数据的安全,阿里云 ES 实例,DELETE API 不允许使用通配符“*”或“_all”进行批量或全量删除。


日志保留设置

阿里云 ES 服务,默认保留最近7天的监控索引,此类 .monitoring-es-* 索引会占用 ES 实例存储空间。索引的大小跟集群中索引个数(包含系统索引)节点个数有关系。为了避免 ES 实例大部分空间被监控索引所占用,可通过以下两种方案优化。

1. 可通过以下 API 设置监控索引保留天数。

PUT _cluster/settings
{"persistent": {"xpack.monitoring.history.duration":"1d"}}
# 需要保留的天数按照您的需求而定,最少保留一天。
2. 设置需要采集监控的索引。

可以通过 API 设置,哪些索引需要监控及哪些索引不需要监控。以减少.monitoring-es-6-*索引占用磁盘空间,本文以禁掉采集系统索引为例。

PUT _cluster/settings
{"persistent": {"xpack.monitoring.collection.indices": "*,-.*"}}
# 禁掉的索引监控信息将不会在Kibana页面中Montioring模块中看到,比如在索引列表及索引监控信息页面,都看不到禁掉的索引信息。就会出现_cat/indices获取的索引列表,跟在Kibana页面中Montioring模块中看到的索引列表不同的情况。

备注:实际使用中,您可以参考以上2种方案结合使用,以节省您购买的磁盘空间。

上一篇:Elasticsearch Node.js


下一篇:EMR学习笔记(1)HDFS