分片恢复是什么
分片恢复指把一份分片数据复制到另一个节点:副本首次分配、节点重启后数据补齐、快照恢复后重新分配都会触发,属于磁盘与网络密集型操作。恢复期间该分片仍可搜索,但集群整体 IO 与带宽会被分走,_cat/recovery 就是观察这一过程的窗口。
为什么恢复会拖慢集群
恢复要读源分片的段文件、经网络传到目标节点并写入磁盘,单节点上并发恢复数过多时这些操作会互相争抢 IO,表现就是集群整体响应变慢。控制手段有两个:每节点并发恢复数(cluster.routing.allocation.node_concurrent_recoveries)与恢复带宽上限(indices.recovery.max_bytes_per_sec),两者都是集群级动态设置,调大前先确认宿主机磁盘还有余量。
基本信息
| 接口 | GET /_cat/recovery?v 或 /_cat/recovery/<index>?v |
|---|---|
| 常用列 | stage、source/target、files、bytes_recovered、bytes_percent、time |
| 参数 | active_only=true 只看进行中的恢复;h= 指定列 |
| 相关设置 | indices.recovery.max_bytes_per_sec、node_concurrent_recoveries |
| 适用版本 | Elasticsearch 5.x 起接口与列名稳定 |
示例
示例
# 只看进行中的恢复
GET /_cat/recovery?v&active_only=true
# 指定列,便于脚本采集
GET /_cat/recovery/logs-2024.01?v&h=index,shard,stage,files_percent,bytes_percent,time
# 临时限制恢复带宽,避免把磁盘 IO 打满
PUT /_cluster/settings
{ "persistent": { "indices.recovery.max_bytes_per_sec": "80mb" } }
# 恢复结束后确认分片状态
GET /_cat/shards?v&s=state典型使用场景
- 扩容后确认新节点上的分片是否在正常恢复
- 节点重启回归:判断数据补齐还要多久,能否进入维护窗口
- 快照恢复后跟踪分片分配与恢复进度
- 集群变慢时确认是否有大量恢复在抢占磁盘与带宽
- 采集恢复耗时数据,作为恢复目标与容量规划的依据
输出逐列读法
| 列 | 含义 | 正常与异常 |
|---|---|---|
| stage | 恢复阶段 | 依次经过 index、translog、finalize,长期停在某一步要排查 |
| source / target | 源节点与目标节点 | 正常情况下两者不会是同一节点 |
| files_percent | 文件数完成百分比 | 文件多而数据小,涨得快,容易高估进度 |
| bytes_recovered | 已恢复字节数 | 结合 bytes_percent 看真实进度 |
| bytes_percent | 字节完成百分比 | 长时间不动说明卡住或带宽被挤占 |
| time | 已耗时 | 与数据量一起看,判断是否需要限速 |
恢复速度上限由 indices.recovery.max_bytes_per_sec 控制,宿主机磁盘 IO 已经吃紧时不宜再调大,否则恢复与在线查询会互相拖慢。
两个百分比列要一起看:files_percent 先涨、bytes_percent 后涨是正常现象,只盯文件数会严重高估恢复进度。