Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • OpenClaw
  • Hermes Agent
  • Claude Code
  • MySQL8-SOP手册
  • MySQL实战45讲学习笔记
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • OpenClaw
  • Hermes Agent
  • Claude Code
  • MySQL8-SOP手册
  • MySQL实战45讲学习笔记
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL

  • Redis

  • Keydb

  • TiDB

  • MongoDB

  • Elasticsearch

    • Elasticsearch 运维知识地图:从安装配置到排障加速恢复
    • Elasticsearch 安装配置
    • 给Elasticsearch集群添加用户密码
    • Elasticsearch 分片和副本:容量怎么规划,改分片数为什么这么麻烦
    • 单节点分片达到默认上限解决办法
    • Elasticsearch集群节点磁盘使用分配不均解决办法
    • Elasticsearch的模板template和映射mapping
    • Elasticsearch 分页查询三种方案:from/size、search_after、scroll 怎么选
    • Elasticsearch字符串搜索方式
    • Elasticsearch使用wildcard字段模糊匹配
    • ES数据迁移工具esm
    • Nginx Mirror 模块实现三套ES写入网关
    • ES单机多节点集群docker-compose一键安装
    • ElasticSearch 动态模板 使用方法
    • ES排障两件套:慢查询日志阈值配置 + tcpdump 抓包看真实请求
    • ES 集群恢复太慢?三个参数加速节点/分片恢复
      • 1. 为什么恢复会慢
      • 2. node_concurrent_recoveries:单节点并发恢复的分片数
      • 3. cluster_concurrent_rebalance:集群级并发再均衡分片数
      • 4. indices.recovery.max_bytes_per_sec:单次恢复的限速带宽
      • 5. 验证
      • 6. 坑
      • 7. 可复用要点
    • Elasticsearch 常用 DSL 语句
    • Logstash迁移ES数据
  • Kafka

  • victoriametrics

  • BigData

  • Sqlserver

  • 数据库
  • Elasticsearch
Carry の Blog
2024-03-30
目录

ES 集群恢复太慢?三个参数加速节点/分片恢复

版本说明

以下参数在 Elasticsearch 7.x/8.x 均有效,均为集群级 persistent 设置。

# 1. 为什么恢复会慢

节点重启、新节点加入、副本重新分配这些场景下,ES 需要把分片数据从一个节点搬到另一个节点(recovery)。默认配置是偏保守的——ES 假设你的集群网络/磁盘 I/O 资源紧张,宁可恢复慢一点也不要抢占正常读写请求的资源。但如果你的集群硬件本身有富余(比如内网万兆网络、SSD),保守的默认值反而会让一次节点重启后的恢复过程拖上几个小时,期间集群处于 yellow/red 状态,风险窗口被人为拉长。

三个参数分别控制恢复过程的并发度和限速,需要配合调整才有效。

# 2. node_concurrent_recoveries:单节点并发恢复的分片数

PUT _cluster/settings
{
  "persistent": {
    "cluster": {
      "routing": {
        "allocation.node_concurrent_recoveries": 8
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10

控制每个节点同时能作为源或目标参与恢复的分片数量,默认值通常是 2。调大它可以让一个节点同时并行搬运更多分片,但要注意:并发恢复的分片越多,该节点在恢复期间要分担的磁盘 I/O 和网络带宽也越多——调得过大反而会因为资源争抢导致每个分片恢复得更慢,得配合硬件实际吞吐能力调整,不是越大越好。

# 3. cluster_concurrent_rebalance:集群级并发再均衡分片数

PUT _cluster/settings
{
  "persistent": {
    "cluster": {
      "routing": {
        "allocation.cluster_concurrent_rebalance": 8
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10

控制整个集群同时进行 rebalance(数据在节点间重新分布,不同于故障恢复但机制类似)的分片数量上限。这个是全局限制,node_concurrent_recoveries 是单节点限制,两者需要一起放大才能让恢复真正提速——只调其中一个,另一个会成为新的瓶颈。

# 4. indices.recovery.max_bytes_per_sec:单次恢复的限速带宽

PUT _cluster/settings
{
  "persistent": {
    "indices.recovery.max_bytes_per_sec": "500mb"
  }
}
1
2
3
4
5
6

限制恢复过程占用的带宽上限,默认值通常只有 40MB/s(非常保守,专为避免抢占业务流量设计)。如果集群网络是内网万兆且当前业务压力不大,可以放大到几百 MB/s 大幅缩短恢复时间;但这个值调得越大,恢复期间业务查询/写入争抢到的带宽就越少,需要在"尽快恢复绿色状态"和"不影响当前业务"之间权衡。

# 5. 验证

调整后,观察恢复进度和速度是否明显提升:

GET _cat/recovery?v&active_only=true
1

关注 bytes_percent(已恢复字节的百分比)随时间的增长速度,以及集群整体状态:

GET _cluster/health
1

status 从 red/yellow 变为 green 且 relocating_shards/initializing_shards 归零,说明恢复已完成。

# 6. 坑

  • 这三个参数是"加速旋钮"而非"免费午餐"——恢复期间集群会消耗更多 CPU/内存/磁盘 I/O/网络带宽,如果此时业务查询压力也很大,调得过猛可能导致恢复没结束、正常查询先超时了。建议在业务低峰期做这类临时调优,恢复完成后视情况改回默认值,而不是把加速参数当成永久配置。
  • 三个参数必须配合调整:只调 max_bytes_per_sec 不调并发数,或者只调并发数不放开带宽限速,实际提速效果都有限,因为总有一个维度会先成为瓶颈。

# 7. 可复用要点

  1. ES 恢复慢的默认值是刻意保守的,硬件有富余时可以主动调优,而不是被动等待。
  2. 并发度(node/cluster 两级)和带宽限速要一起调,单独调一个容易被另一个卡住。
  3. 加速配置是临时手段,恢复完成后应视业务压力决定是否改回默认值,避免长期占用过多资源。
#Elasticsearch#搜索引擎
上次更新: 8/7/2026

← ES排障两件套:慢查询日志阈值配置 + tcpdump 抓包看真实请求 Elasticsearch 常用 DSL 语句→

最近更新
01
Browserless 使用笔记:把 Chrome 变成一个可以被并发调用的网络服务
08-07
02
ORDER BY 配合 LIMIT 触发的索引选择陷阱 原创
08-07
03
Nginx 运维知识地图:从配置基础到反向代理实战 原创
07-29
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式