恢复与回填的分工
集群里的数据重建分成两类。恢复是在数据分布不变的前提下,把某个设备上丢失的一份数据在其余设备上重新算出来;回填则是分布已经变化,把整个归置组的内容复制到新加入或新接管该归置组的设备上。设备突然掉线触发前者,新增设备、调整权重、修改分布规则触发后者。两者都会让部分归置组在完成前处于非最优状态,也都需要读写其余设备上的数据。
基本信息
| 适用平台 | 分布式存储集群的存储设备层 |
|---|---|
| 作用对象 | 对象池与纠删码池中的归置组 |
| 典型触发 | 设备掉线、新增设备、权重或分布规则变化 |
| 并发参数 | 每设备并发回填数与并发恢复请求数 |
| 观察命令 | 集群状态、归置组统计、设备容量分布 |
| 临时手段 | 可挂起回填,避免与前端业务争抢资源 |
典型使用场景
- 设备重启或短暂掉线后:确认重建是否启动以及剩余进度
- 扩容或下线设备:跟踪回填何时结束,再执行下一步动作
- 业务高峰期:临时降低并发,把带宽与磁盘队列让给前端
- 评估冗余水位:用未达标对象数判断还能承受几次同时故障
- 判断集群是否真正空闲:还有未完成的数量时,容量与分布都不是最终值
进度观察与限流
进度观察与限流
ceph -s # 查看降级与未迁移对象数量
ceph pg stat # 归置组整体状态统计
ceph osd df # 各设备使用率,确认是否出现热点
ceph config get osd osd_max_backfills # 查看每设备并发回填上限
ceph config set osd osd_max_backfills 1 # 降速,给前端让出资源
ceph osd pool stats # 对比各池的恢复量与客户端流量状态判读
| 状态 | 含义 | 处置方向 |
|---|---|---|
| active+clean | 归置组已达目标分布 | 无需干预 |
| degraded | 存在缺失的副本 | 等待重建,关注剩余冗余 |
| recovering 或 backfilling | 正在重建或迁移 | 视业务压力决定是否限流 |
| recovery_wait 或 backfill_wait | 排队等待资源 | 检查限流参数与设备负载 |
| undersized | 可用副本低于要求 | 风险最高,优先安排处理 |
| misplaced | 对象不在期望位置 | 扩容或规则变更后的正常回填 |
未迁移对象数量是个很好用的指标:它表示已写入但位置不符合当前分布规则的对象数。扩容之后该数字上升属于预期现象,回填完成会回落到零;长期不归零通常说明回填被限流或被挂起。
重建期间集群冗余处于下降状态:此时再损失一份数据就可能造成不可恢复的缺口。重建未完成前不要发起因另一块设备下线的维护动作,也不要因为读写正常就认为数据是安全的。
限流取值如何取舍
限流不是固定值,而是随业务敏感度动态调整。前端延迟敏感的系统倾向压低并发,让重建拉长但业务稳定;冗余风险高的系统倾向放开并发,尽快补回副本,代价是短时间内的响应抖动。判断依据是当前降级程度、剩余冗余以及可以接受的业务波动窗口,而不是照搬他人的参数。
较新版本引入了基于调度器的资源控制方式,用于在客户端负载与后台重建之间分配配额,与旧的并发参数并存。可用的配置项与默认值随版本变化,调整前以官方文档为准。