
# 配置失败分片自动重试
随着业务运行，Elasticsearch集群中的分片可能因节点负载高、集群触发熔断等原因分配失败。分片分配失败后系统会自动重试，但重试次数达到上限后，分片将永久保持未分配状态，不再尝试分配，导致相关索引的查询和写入请求无法正常执行。此后只能通过手动调用Reroute API（"/_cluster/reroute?retry_failed=true"）重试，这种方式不仅增加运维负担，且从故障发生到人工介入可能经历数小时甚至数天，导致临时性故障无法自愈。CSS服务提供失败分片自动重试功能，在分片分配失败次数超过上限后，自动按照指数退避策略周期性重试分配，无需人工干预即可实现故障自愈。
#### 功能介绍
开启失败分片自动重试后，分片分配失败次数达到重试上限（该上限由"index.allocation.max_retries"控制，默认值为5）的分片将由系统自动重试。重试行为如下：
1. 以基础间隔开始自动重试。
2. 重试成功则清理该分片的跟踪状态；重试失败则退避时间翻倍，等待下次重试。
3. 退避时间增长到设定的最大间隔后，不再继续增大，后续按最大间隔重试。
4. 系统按轮询间隔周期检查是否存在需要重试的失败分片，存在则触发一次重试。
表1指数退避策略示例（基础间隔为1m，最大间隔为120m） 
| 重试次数 | 退避时间 | 说明                  |
|:---|:---|:---|
| 0    | 1m   | 首次发现，等待基础间隔后放行。     |
| 1    | 2m   | 第1次重试失败，退避翻倍。       |
| 2    | 4m   | 第2次重试失败。            |
| 3    | 8m   | 第3次重试失败。            |
| 4    | 16m  | 第4次重试失败。            |
| ...  | ...  | 持续翻倍，直到达到最大间隔。      |
| N    | 120m | 达到最大间隔上限，持续以最大间隔重试。 |
   
#### 约束限制
仅当Elasticsearch集群版本号为7.10.2，且镜像版本号不低于7.10.2_26.6.0_xxx时，才支持失败分片自动重试功能。满足条件的集群**默认启用**该功能。
#### 登录Kibana
登录Kibana进入命令执行页面。Elasticsearch集群支持多种客户端访问，本文仅以CSS服务集成的Kibana为例介绍配置指导。
1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
2. 在左侧导航栏，选择"集群管理 \> Elasticsearch"。
3. 在集群列表，选择目标集群，单击操作列的"Kibana"，登录Kibana。
4. 在Kibana左侧导航栏选择"Dev Tools"，进入操作页面。 控制台左侧是命令输入框，其右侧的三角形图标为执行按钮，右侧区域则显示执行结果。
   
 
#### 配置失败分片自动重试参数
动态配置失败分片自动重试的相关参数，配置完成后立即生效。
1. 开启或关闭失败分片自动重试功能。
   ```
   PUT _cluster/settings
   {
     "persistent": {
       "cluster.routing.allocation.retry_failed.auto_enabled": true
     }
   }
   ```
   表2自动重试开关的参数说明 
   | 参数                                                   | 类型      | 默认值  | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   |:---|:---|:---|:---|
   | cluster.routing.allocation.retry_failed.auto_enabled | Boolean | true | 失败分片自动重试功能开关。 取值范围： - true：开启自动重试功能。  - false：关闭自动重试功能。关闭后，分配失败次数超过上限的分片将永久保持未分配状态，需要手动调用Reroute API重试，可能导致业务长时间中断。建议仅在确认集群无需自动恢复时关闭此功能。   |
      
   
2. 配置自动重试的退避策略参数，控制重试的时间间隔和频率。
   ```
   PUT _cluster/settings
   {
     "persistent": {
       "cluster.routing.allocation.retry_failed.auto_base_delay": "1m",
       "cluster.routing.allocation.retry_failed.auto_max_delay": "120m",
       "cluster.routing.allocation.retry_failed.auto_poll_interval": "5m"
     }
   }
   ```
   表3退避策略的参数说明 
   | 参数                                                         | 类型        | 默认值  | 说明                                                                                                                                                                                                                                                                                                                                                                                                   |
   |:---|:---|:---|:---|
   | cluster.routing.allocation.retry_failed.auto_base_delay    | TimeValue | 1m   | 退避策略的基础间隔。首次重试的等待时间，之后每次重试失败退避时间翻倍。 取值范围：1m\~1440m 取值格式：数字+单位，单位支持ms（毫秒）、s（秒）、m（分钟）、h（小时）、d（天）。                                                                                                                                              |
   | cluster.routing.allocation.retry_failed.auto_max_delay     | TimeValue | 120m | 退避策略的最大间隔。重试间隔增长到此值后不再增大，防止退避时间无限增长。 取值范围：1m\~1440m 取值格式：数字+单位，单位支持ms（毫秒）、s（秒）、m（分钟）、h（小时）、d（天）。                                                                                                                                            |
   | cluster.routing.allocation.retry_failed.auto_poll_interval | TimeValue | 5m   | 周期轮询间隔。兜底检测超过重试上限的分片，避免集群状态稳定时遗漏。 取值范围：1m\~1440m 取值格式：数字+单位，单位支持ms（毫秒）、s（秒）、m（分钟）、h（小时）、d（天）。 建议保持默认值。如果将参数值调小，会增加轮询频率，可能对集群性能产生轻微影响；如果将参数值调大，可能延迟发现需要重试的分片。 |
      
   
3. （可选）验证配置是否生效，查询当前集群的失败分片自动重试配置。
   ```
   GET _cluster/settings?filter_path=**.retry_failed.auto_*
   ```
   返回结果中包含已配置的参数值，且参数值与配置值一致，则表示配置已生效。
   
 
#### 常见问题
- **问题1：关闭失败分片自动重试后，如何手动重试失败的分片？**
  关闭自动重试功能后，可通过调用Reroute API手动重试失败的分片，命令如下：
  ```
  POST /_cluster/reroute?retry_failed=true
  ```
  
- **问题2：失败分片自动重试是否会影响正在运行的分片分配？**
  不会。自动重试仅对分配失败次数超过"index.allocation.max_retries"且处于未分配状态的分片执行分配，不会触发Move和Balance操作，对正在运行的分片分配无影响。
  
 
