elasticsearch unassigned shard

时间:2022-07-24
本文章向大家介绍elasticsearch unassigned shard,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

故障回顾

Zabbix 报警 Elasticsearch 集群状态 yellow。查看发现 Elasticsearch 集群出现 unassigned shard。定位发现是由于集群节点磁盘使用率过高超过85% 触发 Elasticsearch 集群对副本分片停止自动分配。

– green

  所有分片均已分配。

  – yellow

  所有主分片均已分配,但未分配一个或多个副本分片。

  – red

主分片不可用,可能已经丢失数据。

查看 unassigned shard 原因

Kibana DEV Tools

GET  /_cluster/allocation/explain

日志错误提示

"cannot allocate because allocation is not permitted to any of the nodes"

查看日志初步怀疑是由于前几天 Elasticsearch 节点磁盘使用率过高超过 85% 后对 Elasticsearch index 进行手动删除导致。

查看未分配的分片信息

curl -u elastic:****** -XGET http://localhost:9200/_cat/shards |grep UNASSIGNED

解决方案

POST /_cluster/reroute?retry_failed=true

Elasticsearch 节点磁盘使用率超过 85% 将不允许在分配新的副本分片,分片自动分配达到最大重试次数5次后,触发集群停止副本自动分配,手动执行恢复自动分配即可(故障后无法自动恢复需要手动恢复)。

Elasticsearch 磁盘的分片分配机制

Elasticsearch 在决定是向该节点分配新的碎片还是主动将碎片从该节点移开之前,先考虑节点上的可用磁盘空间。

cluster.routing.allocation.disk.threshold_enabled

默认为true。设置为false禁用磁盘分配决定器。

cluster.routing.allocation.disk.watermark.low

控制磁盘使用的低水位。默认为85%,意味着如果节点磁盘使用率超过85%,则Elasticsearch 不允许在分配新的分片。当配置具体的大小如500MB时,表示如果磁盘空间小于500MB不允许分配分片。此设置对新创建的索引的主分片没有影响,但是会阻止分配它们的副本。

cluster.routing.allocation.disk.watermark.high

控制磁盘使用的高水位。默认为90%,表示Elasticsearch将尝试将分片从磁盘使用率超过90%的节点移开。如果分片少于指定的可用空间量,也可以将其设置为绝对字节值(控制磁盘使用的低水位)以将碎片重新放置到远离节点的位置。此设置影响所有分片的分配,无论之前是否分配。

cluster.routing.allocation.disk.watermark.flood_stage

控制洪水阶段水位,默认为95%。触发后索引会被强制修改为只读权限。此设置是防止节点用完磁盘空间的最后手段。当磁盘利用率低于高水位线时,索引块将自动释放(低版本无法自动释放,需要通过 index.blocks.read_only_allow_delete 参数释放)。

index.blocks.read_only_allow_delete

Kibana DEV Tools

PUT _settings
    {
    "index": {
    "blocks": {
    "read_only_allow_delete": "false"
    }
    }
    }

API

curl -XPUT localhost:9200/_cluster/settings -d '{
"index.blocks.read_only_allow_delete": null
}'

cluster.info.update.interval

Elasticsearch 应该多久检查一次集群中每个节点的磁盘使用情况。默认为30s。

Kibana DEV Tools

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "90%",
    "cluster.routing.allocation.disk.watermark.high": "90%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "95%",
    "cluster.info.update.interval": "1m"
  }
}

API

curl -XPUT localhost:9200/_cluster/settings -d '{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "90%",
    "cluster.routing.allocation.disk.watermark.high": "90%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "95%",
    "cluster.info.update.interval": "1m"
    }
}'

persistent 表示为永久修改,transient 表示临时修改。

官方文档

https://www.elastic.co/guide/en/elasticsearch/reference/7.9/modules-cluster.html#disk-based-shard-allocation