配置失败分片自动重试
随着业务运行,Elasticsearch集群中的分片可能因节点负载高、集群触发熔断等原因分配失败。分片分配失败后系统会自动重试,但重试次数达到上限后,分片将永久保持未分配状态,不再尝试分配,导致相关索引的查询和写入请求无法正常执行。此后只能通过手动调用Reroute API(“/_cluster/reroute?retry_failed=true”)重试,这种方式不仅增加运维负担,且从故障发生到人工介入可能经历数小时甚至数天,导致临时性故障无法自愈。CSS服务提供失败分片自动重试功能,在分片分配失败次数超过上限后,自动按照指数退避策略周期性重试分配,无需人工干预即可实现故障自愈。
功能介绍
开启失败分片自动重试后,分片分配失败次数达到重试上限(该上限由“index.allocation.max_retries”控制,默认值为5)的分片将由系统自动重试。重试行为如下:
- 以基础间隔开始自动重试。
- 重试成功则清理该分片的跟踪状态;重试失败则退避时间翻倍,等待下次重试。
- 退避时间增长到设定的最大间隔后,不再继续增大,后续按最大间隔重试。
- 系统按轮询间隔周期检查是否存在需要重试的失败分片,存在则触发一次重试。
| 重试次数 | 退避时间 | 说明 |
|---|---|---|
| 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为例介绍配置指导。
- 登录云搜索服务管理控制台。
- 在左侧导航栏,选择“集群管理 > Elasticsearch”。
- 在集群列表,选择目标集群,单击操作列的“Kibana”,登录Kibana。
- 在Kibana左侧导航栏选择“Dev Tools”,进入操作页面。
控制台左侧是命令输入框,其右侧的三角形图标为执行按钮,右侧区域则显示执行结果。
配置失败分片自动重试参数
动态配置失败分片自动重试的相关参数,配置完成后立即生效。
- 开启或关闭失败分片自动重试功能。
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重试,可能导致业务长时间中断。建议仅在确认集群无需自动恢复时关闭此功能。
- 配置自动重试的退避策略参数,控制重试的时间间隔和频率。
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(天)。
建议保持默认值。如果将参数值调小,会增加轮询频率,可能对集群性能产生轻微影响;如果将参数值调大,可能延迟发现需要重试的分片。
- (可选)验证配置是否生效,查询当前集群的失败分片自动重试配置。
GET _cluster/settings?filter_path=**.retry_failed.auto_*
返回结果中包含已配置的参数值,且参数值与配置值一致,则表示配置已生效。
常见问题
- 问题1:关闭失败分片自动重试后,如何手动重试失败的分片?
关闭自动重试功能后,可通过调用Reroute API手动重试失败的分片,命令如下:
POST /_cluster/reroute?retry_failed=true
- 问题2:失败分片自动重试是否会影响正在运行的分片分配?
不会。自动重试仅对分配失败次数超过“index.allocation.max_retries”且处于未分配状态的分片执行分配,不会触发Move和Balance操作,对正在运行的分片分配无影响。