更新时间:2026-08-20 GMT+08:00
分享

配置失败分片自动重试

随着业务运行,OpenSearch集群中的分片可能因节点负载高、集群触发熔断等原因分配失败。分片分配失败后系统会自动重试,但重试次数达到上限后,分片将永久保持未分配状态,不再尝试分配,导致相关索引的查询和写入请求无法正常执行。此后只能通过手动调用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

达到最大间隔上限,持续以最大间隔重试。

约束限制

仅当OpenSearch集群版本号为2.19.0或3.4.0,且镜像版本号不低于x.x.x_26.6.0_xxx时,才支持失败分片自动重试功能。满足条件的集群默认启用该功能。

登录OpenSearch Dashboards

登录OpenSearch Dashboards进入命令执行页面。OpenSearch集群支持多种客户端访问,本文仅以CSS服务集成的OpenSearch Dashboards为例介绍配置指导。

  1. 登录云搜索服务管理控制台
  2. 在左侧导航栏,选择“集群管理 > OpenSearch”
  3. 在集群列表,选择目标集群,单击操作列的“Dashboards”,登录OpenSearch Dashboards。
  4. 在OpenSearch Dashboards左侧导航栏选择“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操作,对正在运行的分片分配无影响。

相关文档