如何重试 Elasticsearch 分片分配,未分配的分片

How to retry Elasticsearch shard allocation, UNASSIGNED Shards

我在集群中的一些弹性搜索索引有问题:

示例索引 logs-2021.08 我有 5 个常规分片,所以当我 运行 _cat/shards 弹性 API 我得到了很好的结果(示例) :

logs-2021.08                        2     r      STARTED    25008173   11.9gb 0.0.0.0  instance-0000000128
logs-2021.08                        2     p      STARTED    25008173   11.8gb 0.0.0.0  instance-0000000119
logs-2021.08                        4     p      STARTED    25012332   11.8gb 0.0.0.0 instance-0000000129
logs-2021.08                        4     r      STARTED    25012332   11.9gb 0.0.0.0  instance-0000000119
logs-2021.08                        1     p      STARTED    25003649   11.8gb 0.0.0.0 instance-0000000121
logs-2021.08                        1     r      STARTED    25003649   11.8gb 0.0.0.0  instance-0000000115
logs-2021.08                        3     p      STARTED    25006085   11.8gb 0.0.0.0 instance-0000000121
logs-2021.08                        3     r      STARTED    25006085   11.8gb 0.0.0.0   instance-0000000135
logs-2021.08                        0     p      STARTED    25007160   11.9gb 0.0.0.0  instance-0000000128
logs-2021.08                        0     r      STARTED    25007160   11.9gb 0.0.0.0  instance-0000000118

问题是我也在猫的结果中得到了这些 API:

partial-logs-2021.08                2     p      UNASSIGNED                                 
partial-logs-2021.08                4     p      UNASSIGNED                                 
partial-logs-2021.08                1     p      UNASSIGNED                                 
partial-logs-2021.08                3     p      UNASSIGNED                                 
partial-logs-2021.08                0     p      UNASSIGNED

我找不到问题所在或为什么我有这些部分索引,但集群似乎对这些未分配的碎片不健康。

有没有办法从根本上解决这些问题(而不是明显地删除它们)?

简单

重试 Elasticsearch 分片分配由于后续分配失败太多而被阻止。

curl -X POST http://127.0.0.1:9200/_cluster/reroute?retry_failed=true

但了解背后的原因和分配API

Elasticsearch 分配 API、cluster 将尝试连续最多 index.allocation.max_retries 次分配分片(默认为 5 次),然后放弃并保持分片未分配.这种情况可能是最多尝试 5 次导致的,我们可以增加此次数以重试赋值初始化,但问题可能会重复。

curl --silent --request PUT --header 'Content-Type: application/json' 127.0.0.1:9200/my_index_name/_settings?pretty=true --data-ascii '{
  "index": {
    "allocation": {
       "max_retries": 15
    }
  }                         
}'

但是由于不同的原因,这个可能会再次失败,所以查明原因,配合集群配置。可能的问题可能是

  • 水印问题因为硬盘space
  • 索引错误。当您将索引从一个文件夹移动到另一个文件夹或从一台服务器移动到另一台服务器时,就会发生这种情况。
  • 结构性问题,例如分析器引用了并非所有节点上都存在的停用词文件。

获取未分配的碎片

curl -s "http://127.0.0.1:9200/_cat/shards?v" | awk 'NR==1 {print};  == "UNASSIGNED" {print}'

明白原因运行下面命令

GET /_cluster/allocation/explain

# OR

curl -XGET "location:9200/_cluster/allocation/explain"

# OR

curl http://127.0.0.1:9200/_cluster/state | jq '.routing_table.indices | .[].shards[][] | select(.state=="UNASSIGNED") | {index: .index, shard: .shard, primary: .primary, unassigned_info: .unassigned_info}'

问题得到纠正后,可以通过使用 ?retry_failed URI 查询参数调用重新路由 API 来手动重试分配,这将为这些分片尝试单轮重试。使用以下 API.

重新启动分配 API 的命令
curl -X POST http://127.0.0.1:9200/_cluster/reroute?retry_failed=true