移除OSD后修复Ceph集群active+undersized+degraded状态
集群恢复健康方案及正确OSD移除步骤
一、当前HEALTH_WARN状态恢复操作
1. 先排查核心问题
执行以下命令确认关键信息:
- 查看存储池副本配置:
ceph osd pool get <pool-name> size - 查看OSD拓扑与状态:
ceph osd tree - 查看PG整体状态:
ceph pg stat
2. 针对性修复操作
情况1:数据未完成迁移就移除OSD
- 强制将osd.2权重设为0,排除其参与数据调度:
ceph osd reweight osd.2 0 - 触发PG重新扫描映射:
ceph osd pg-scan - 用
ceph -w监控数据迁移进度,等待所有PG状态变为active+clean
情况2:存储池副本数超过可用OSD承载能力
- 下调存储池副本数至当前可用OSD能支撑的数值(比如剩余3个OSD则设为3):
ceph osd pool set <pool-name> size 3 - 同步调整min_size参数(需小于等于size):
ceph osd pool set <pool-name> min_size 2
情况3:CRUSH规则与当前集群拓扑不匹配
- 导出当前CRUSH规则:
ceph osd crush rule dump - 修改规则适配剩余节点拓扑(比如将原4节点故障域调整为3节点)
- 更新存储池使用的CRUSH规则:
ceph osd pool set <pool-name> crush_rule <new-rule-name>
情况4:残留健康警告
当所有PG状态正常后,清除警告:ceph health reset
二、Rook集群正确的OSD移除步骤
标记OSD为Out并等待数据迁移
- 查看目标OSD状态:
kubectl -n rook-ceph get osd - 标记osd.2为out:
ceph osd out osd.2 - 执行
ceph -w监控,直到osd.2的used数据完全迁移至其他OSD
- 查看目标OSD状态:
从CRUSH Map中移除OSD
- 删除osd.2的CRUSH权重:
ceph osd crush remove osd.2
- 删除osd.2的CRUSH权重:
清理OSD认证与实例
- 删除osd.2的认证密钥:
ceph auth del osd.2 - 删除osd.2实例:
ceph osd rm osd.2
- 删除osd.2的认证密钥:
清理Kubernetes层面资源
- 找到osd.2对应的PVC:
kubectl -n rook-ceph get pvc | grep osd-2 - 删除该PVC:
kubectl -n rook-ceph delete pvc <osd-2-pvc-name> - 确认OSD Pod已被清理:
kubectl -n rook-ceph get pods | grep osd-2
- 找到osd.2对应的PVC:
验证集群健康
- 执行
ceph -s确认集群状态为HEALTH_OK,所有PG处于active+clean
- 执行
内容的提问来源于stack exchange,提问作者JDev
相关产品推荐
相关产品推荐

