配置项作用 #
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:恢复速度慢
可能原因:
- 速率限制设置过低
- 网络带宽不足
- 磁盘 I/O 瓶颈
解决方案:
- 提高速率限制
PUT /_cluster/settings
{
"transient": {
"indices.recovery.max_bytes_per_sec": "100mb"
}
}
- 增加并发数
PUT /_cluster/settings
{
"transient": {
"indices.recovery.max_concurrent_file_chunks": 4
}
}
- 选择业务低峰期
# 在业务低峰期提高限制
PUT /_cluster/settings
{
"transient": {
"indices.recovery.max_bytes_per_sec": "500mb"
}
}
问题 2:恢复影响业务性能
症状:
- 查询响应变慢
- 读写延迟增加
解决方案:
- 降低恢复速度
PUT /_cluster/settings
{
"transient": {
"indices.recovery.max_bytes_per_sec": "20mb"
}
}
- 限制并发恢复数
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.node_concurrent_recoveries": 2
}
}
- 使用分片 allocation 过滤
# 控制恢复分片的节点
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.exclude._name": "recovering_node"
}
}
问题 3:恢复超时
RecoveryFailedException[recovery failed on ...]
解决方案:
- 增加超时时间
PUT /_cluster/settings
{
"transient": {
"indices.recovery.internal_action_timeout": "30m"
}
}
- 提高速率限制
PUT /_cluster/settings
{
"transient": {
"indices.recovery.max_bytes_per_sec": "100mb"
}
}
相关配置项 #
| 配置项 | 默认值 | 说明 |
|---|---|---|
indices.recovery.max_concurrent_file_chunks | 2 | 并发文件块数 |
indices.recovery.max_concurrent_operations | 1 | 并发操作数 |
indices.recovery.internal_action_timeout | 15m | 内部操作超时 |
indices.recovery.retry_delay_network | 5s | 网络重试延迟 |
cluster.routing.allocation.node_concurrent_recoveries | 2 | 节点并发恢复数 |
性能优化建议 #
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% |
| 恢复时间 | < 30min | 30-60min | > 60min |
注意事项 #
- 动态更新:此配置为动态配置,可在线修改
- 网络影响:高恢复速率可能影响正常业务
- 磁盘 I/O:恢复过程也消耗磁盘 I/O 资源
- 并发控制:需配合并发恢复数配置
- 时段选择:建议在业务低峰期进行大规模恢复





