如何重试 Elasticsearch 分片分配、未分配分片

Roy*_*evy 4 database logging sharding elasticsearch

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

我有 5 个常规分片用于示例索引logs-2021.08,因此当我运行_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
Run Code Online (Sandbox Code Playgroud)

问题是我也在 cat 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
Run Code Online (Sandbox Code Playgroud)

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

有什么方法可以从根本上解决这些问题(而不是直接删除它们)?

Jin*_*alu 17

简单的

\n

由于后续分配失败次数过多,重试 Elasticsearch 分片分配被阻止。

\n
curl -X POST http://127.0.0.1:9200/_cluster/reroute?retry_failed=true\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

Elasticsearch 分配 API将尝试连续cluster分配一个分片最多次数(默认为 5 次),然后放弃并让分片保持未分配状态。index.allocation.max_retries这种情况可能是由于最多尝试 5 次造成的,我们可以增加此次数以再次尝试分配初始化,但问题可能会重复。

\n
curl --silent --request PUT --header \'Content-Type: application/json\' 127.0.0.1:9200/my_index_name/_settings?pretty=true --data-ascii \'{\n  "index": {\n    "allocation": {\n       "max_retries": 15\n    }\n  }                         \n}\'\n
Run Code Online (Sandbox Code Playgroud)\n

但是这可能会因为不同的原因再次失败,所以要查明原因,配合集群分配。可能的问题可能是

\n
    \n
  • 由于硬盘空间问题导致水印问题
  • \n
  • 索引错误。当您将索引从一个文件夹移动到另一个文件夹或从一台服务器移动到另一台服务器时,就会发生这种情况。
  • \n
  • 结构问题,例如分析器引用所有节点上不存在\xe2\x80\x99t 的停用词文件。
  • \n
\n

获取未分配的碎片

\n
curl -s "http://127.0.0.1:9200/_cat/shards?v" | awk \'NR==1 {print}; $4 == "UNASSIGNED" {print}\'\n
Run Code Online (Sandbox Code Playgroud)\n

要了解原因,请运行以下命令

\n
GET /_cluster/allocation/explain\n\n# OR\n\ncurl -XGET "location:9200/_cluster/allocation/explain"\n\n# OR\n\ncurl 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}\'\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
curl -X POST http://127.0.0.1:9200/_cluster/reroute?retry_failed=true\n
Run Code Online (Sandbox Code Playgroud)\n