如何重试 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
我在集群中的一些弹性搜索索引有问题:
示例索引 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