集群健康值的含义
通过集群健康值的状态,可以反映出集群当前索引分片的情况。
0:绿色,表示集群所有主分片和副本分片都可用,集群处于最健康的状态。
1:黄色,表示所有的主分片均可用,但存在不可用副本分片。此时,搜索结果仍然是完整的,但集群的高可用性在一定程度上受到影响,一般会自动恢复。
2:红色,表示至少一个主分片以及它的全部副本分片均不可用。集群处于红色状态意味着已有部分数据不可用,搜索只能返回部分数据,而分配到丢失分片上的请求会返回异常。
集群yellow问题常见场景
导致集群yellow的状况比较多,可以合理运用API排查集群健康状态异常原因进行分析处理
1、查看集群索引分片分配情况和健康状态
GET /_cluster/health
2、查看索引情况,并根据返回找到状态异常的索引
GET /_cat/indices
3、【☆重点】查看索引副本分片未分的详细异常信息
GET /_cluster/allocation/explain
4、重新触发集群索引副本分片分配
POST _cluster/reroute?retry_failed=true
磁盘利用率到达水位
问题描述:
ES 集群节点的磁盘利用率超过85%(可配)时会导致新的分片无法分配
问题现象及诊断:
1.日志可能出现如下报错:
代码语言:javascript复制在进行索引请求时,返回类似 {[FORBIDDEN/12/index read-only/allow delete(api)];","type":"cluster_block_exception"} 的报错。
在对集群进行操作时,返回类似 [FORBIDDEN/13/cluster read-only / allow delete (api)] 的报错。
集群处于 Red 状态,严重情况下存在节点未加入集群的情况(可通过 GET _cat/allocation?v 命令查看),并且存在未分配的分片(可通过 GET _cat/allocation?v 命令查看)。
通过 Elasticsearch 控制台的节点监控页面,集群节点磁盘使用率曾达到或者接近100%。
2.执行命令GET /_cluster/allocation/explain可能出现如下反馈
代码语言:javascript复制the node is above the low watermark cluster setting [cluster.routing.allocation.disk.watermark.low=85%], using more disk space than the maximum allowed [85.0%], actual free: [6.210757516951154%]"
参数参考:
此阈值可通过参数cluster.routing.allocation.disk.watermark.low=85% 进行调整。
通过GET _cluster/settings?include_defaults&flat_settings可以查看当前参数配置,如下图:
参数配置影响说明:
- 当集群磁盘使用率超过85%(watermark.low):会导致新的分片无法分配(副本分片无法分配则yellow)
- 当集群磁盘使用率超过90%(watermark.high):Elasticsearch 会尝试将对应节点中的分片迁移到其他磁盘使用率比较低的数据节点中(迁移过程中会yellow)。
- 当集群磁盘使用率超过95%(watermark.flood_stage):系统会对 Elasticsearch 集群中对应节点里每个索引强制设置 read_only_allow_delete 属性,此时该节点上的所有索引将无法写入数据,只能读取和删除对应索引。
解决方案:
清理集群过期数据
用户可以通过访问【Kibana】>【Dev Tools】删除过期索引释放磁盘空间。步骤如下:警告: 数据删除后将无法恢复,请谨慎操作。您也可以选择保留数据,但需进行磁盘扩容。
代码语言:javascript复制第一步:开启集群索引批量操作权限。
PUT _cluster/settings { "persistent": { "action.destructive_requires_name": "false" } }
第二步:删除数据,例如 DELETE NginxLog-12*。
DELETE index-name-*
执行完上述步骤后,如果用户腾讯云 Elasticsearch 的版本是7.5.1以前的版本,还需要在 Kibana 界面的【Dev Tools】中执行如下命令,查看集群索引是否依然为read_only状态,索引写入是否恢复正常。
代码语言:javascript复制关闭索引只读状态,执行如下命令:
PUT _all/_settings { "index.blocks.read_only_allow_delete": null }
关闭集群只读状态,执行如下命令:
PUT _cluster/settings { "persistent": { "cluster.blocks.read_only_allow_delete": null } }
若集群是否依然为 Red 状态,执行以下命令,查看集群中是否存在未分配的分片。 GET /_cluster/allocation/explain
扩容磁盘
如果是云上实例,可以通过云提供的磁盘垂直扩容能力进行扩容。
如果是本地实例,建议迁移上云^_^。
PS:
如果用户腾讯云 Elasticsearch 的版本是7.5.1以前的版本,还需要在 Kibana 界面的【Dev Tools】中执行如下命令:
代码语言:javascript复制关闭索引只读状态,执行如下命令:
PUT _all/_settings { "index.blocks.read_only_allow_delete": null }
关闭集群只读状态,执行如下命令:
PUT _cluster/settings { "persistent": { "cluster.blocks.read_only_allow_delete": null } }
未完待续