📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

indices.recovery.max_bytes_per_sec 配置项限制分片恢复(Recovery)过程中的网络传输速率,用于控制节点间数据恢复的带宽使用,防止恢复过程占用过多网络资源影响正常业务。

配置项类型 #

该配置项为动态配置,可以在运行时通过集群设置 API 进行修改。

默认值 #

40mb

是否必需 #

可选配置项(有默认值)

取值范围 #

0b(无限制)~ 无最大值

工作原理 #

恢复速率限制器控制分片恢复时的数据传输速度:

┌─────────────────────────────────────────────────────────┐
│                   分片恢复请求                             │
│         (节点故障、新节点加入、副本分配)                    │
└─────────────────────────────────────────────────────────┘
                        │
                        ▼
                ┌───────┴────────┐
                │                 │
            启用限速          禁用限速
        max_bytes_per_sec > 0   max_bytes_per_sec = 0b
                │                 │
                ▼                 ▼
        按配置速率传输        无限制传输
        (受控恢复)          (可能影响业务)

速率限制机制:

每秒传输量
    │
    ├─→ 未达限制 → 继续传输
    │
    └─→ 达到限制 → 等待下一秒

配置格式 #

# 默认配置
indices.recovery.max_bytes_per_sec: 40mb

# 提高恢复速度
indices.recovery.max_bytes_per_sec: 100mb

# 降低恢复速度
indices.recovery.max_bytes_per_sec: 20mb

# 禁用限制(不推荐)
indices.recovery.max_bytes_per_sec: 0b

# 无限速(业务低峰期)
indices.recovery.max_bytes_per_sec: 500mb

使用场景 #

1. 节点故障恢复

主节点故障 → 副本提升为主节点 → 新副本分配 → 数据恢复

2. 新节点加入

新节点加入集群 → 分片重新平衡 → 数据恢复

3. 副本数调整

增加副本 → 新副本分配 → 数据恢复

4. 集群重启

节点重启 → 分片恢复 → 数据恢复

推荐设置建议 #

生产环境建议:根据网络带宽和业务特点设置

场景推荐配置说明
默认40mb通用场景
千兆网络100-200mb充分利用带宽
万兆网络500mb-1gb高速恢复
网络敏感10-20mb保护业务
业务低峰无限制加快恢复
业务高峰20-40mb保证业务

网络带宽计算 #

带宽占用估算:

网络带宽: 1Gbps = 125MB/s
恢复限速: 40MB/s
实际占用: 40MB/s / 125MB/s = 32%

建议: 保留 30-50% 带宽给业务
恢复限速: 60-80MB/s

示例配置:

# 1Gbps 网络,保留 50% 给业务
indices.recovery.max_bytes_per_sec: 60mb

# 10Gbps 网络,保留 30% 给业务
indices.recovery.max_bytes_per_sec: 800mb

动态修改 #

# 业务低峰期,提高恢复速度
PUT /_cluster/settings
{
  "transient": {
    "indices.recovery.max_bytes_per_sec": "200mb"
  }
}

# 业务高峰期,降低恢复速度
PUT /_cluster/settings
{
  "transient": {
    "indices.recovery.max_bytes_per_sec": "20mb"
  }
}

# 节点维护完成后,恢复正常
PUT /_cluster/settings
{
  "transient": {
    "indices.recovery.max_bytes_per_sec": "40mb"
  }
}

查看恢复状态 #

# 查看正在进行的恢复
GET /_cat/recovery?v

# 查看特定索引的恢复
GET /_cat/recovery/my_index?v

# 查看恢复详细统计
GET /_nodes/stats/indices/recovery?pretty

# 查看恢复速率
GET /_cat/recovery?v&h=index,shard,stage,bytes_recovered,bytes_recovered_per_sec

输出字段说明:

字段说明
index索引名称
shard分片编号
stage恢复阶段
bytes_recovered已恢复字节数
bytes_recovered_per_sec恢复速率

常见问题 #

问题 1:恢复速度慢

可能原因:

  1. 速率限制设置过低
  2. 网络带宽不足
  3. 磁盘 I/O 瓶颈

解决方案:

  1. 提高速率限制
PUT /_cluster/settings
{
  "transient": {
    "indices.recovery.max_bytes_per_sec": "100mb"
  }
}
  1. 增加并发数
PUT /_cluster/settings
{
  "transient": {
    "indices.recovery.max_concurrent_file_chunks": 4
  }
}
  1. 选择业务低峰期
# 在业务低峰期提高限制
PUT /_cluster/settings
{
  "transient": {
    "indices.recovery.max_bytes_per_sec": "500mb"
  }
}

问题 2:恢复影响业务性能

症状:

  • 查询响应变慢
  • 读写延迟增加

解决方案:

  1. 降低恢复速度
PUT /_cluster/settings
{
  "transient": {
    "indices.recovery.max_bytes_per_sec": "20mb"
  }
}
  1. 限制并发恢复数
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.node_concurrent_recoveries": 2
  }
}
  1. 使用分片 allocation 过滤
# 控制恢复分片的节点
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._name": "recovering_node"
  }
}

问题 3:恢复超时

RecoveryFailedException[recovery failed on ...]

解决方案:

  1. 增加超时时间
PUT /_cluster/settings
{
  "transient": {
    "indices.recovery.internal_action_timeout": "30m"
  }
}
  1. 提高速率限制
PUT /_cluster/settings
{
  "transient": {
    "indices.recovery.max_bytes_per_sec": "100mb"
  }
}

相关配置项 #

配置项默认值说明
indices.recovery.max_concurrent_file_chunks2并发文件块数
indices.recovery.max_concurrent_operations1并发操作数
indices.recovery.internal_action_timeout15m内部操作超时
indices.recovery.retry_delay_network5s网络重试延迟
cluster.routing.allocation.node_concurrent_recoveries2节点并发恢复数

性能优化建议 #

1. 根据时间段动态调整

# 业务低峰期(凌晨)
0 2 * * * curl -XPUT 'localhost:9200/_cluster/settings' -d '{
  "transient": {
    "indices.recovery.max_bytes_per_sec": "500mb"
  }
}'

# 业务高峰期(早上)
0 8 * * * curl -XPUT 'localhost:9200/_cluster/settings' -d '{
  "transient": {
    "indices.recovery.max_bytes_per_sec": "20mb"
  }
}'

2. 配合并发恢复数

# 平衡速率和并发
indices.recovery.max_bytes_per_sec: 100mb
cluster.routing.allocation.node_concurrent_recoveries: 4

3. 监控恢复进度

# 持续监控恢复状态
watch -n 5 'curl -s localhost:9200/_cat/recovery?v'

# 设置告警
# 当恢复时间过长时告警

不同场景的配置策略 #

场景 1:节点故障快速恢复

# 最大化恢复速度
indices.recovery.max_bytes_per_sec: 500mb
indices.recovery.max_concurrent_file_chunks: 4
cluster.routing.allocation.node_concurrent_recoveries: 4

场景 2:新节点加入

# 中等恢复速度,平衡业务
indices.recovery.max_bytes_per_sec: 100mb
cluster.routing.allocation.node_concurrent_recoveries: 2

场景 3:计划维护

# 业务低峰期加快恢复
indices.recovery.max_bytes_per_sec: 200mb
# 维护完成后恢复
indices.recovery.max_bytes_per_sec: 40mb

场景 4:网络敏感环境

# 低速恢复
indices.recovery.max_bytes_per_sec: 20mb
cluster.routing.allocation.node_concurrent_recoveries: 1

监控建议 #

# 持续监控恢复速率
GET /_cat/recovery?v&h=index,bytes_recovered_per_sec

# 计算预计完成时间
预计时间 = 剩余字节数 / 当前速率

健康阈值:

指标健康警告严重
恢复速率> 配置的 50%10-50%< 10%
恢复时间< 30min30-60min> 60min

注意事项 #

  1. 动态更新:此配置为动态配置,可在线修改
  2. 网络影响:高恢复速率可能影响正常业务
  3. 磁盘 I/O:恢复过程也消耗磁盘 I/O 资源
  4. 并发控制:需配合并发恢复数配置
  5. 时段选择:建议在业务低峰期进行大规模恢复