Ceph的PG(Placement Group)是数据分布和复制的核心单元,其状态反映了数据存储的健康情况。以下是PG的常见状态及异常处理指南:
一、PG的常见状态
1. 基础状态
-
active
PG可正常处理读写请求。 -
clean
数据已完全复制到所有OSD,无副本丢失。 -
peering
PG正在与相关OSD同步元数据,暂不可用(短暂状态)。 -
degraded
部分数据副本丢失(如OSD故障),但数据仍可读写。 -
undersized
当前副本数低于配置的副本数(如size=3
但只有2个副本在线)。 -
stale
PG的主OSD未按时向Monitor报告状态(可能OSD宕机或网络问题)。 -
remapped
PG的主OSD变更,数据正在迁移到新主OSD。 -
scrubbing
/deep
正在进行数据一致性校验(deep
为深度校验)。
2. 恢复相关状态
-
recovering
数据正在从其他副本恢复。 -
backfilling
数据正在重新分布到新OSD(如扩容后)。 -
incomplete
PG无法完成恢复(如副本不足,无法重建数据)。
3. 异常状态
-
inconsistent
数据副本不一致(需手动修复)。 -
down
PG无法访问(可能OSD全挂)。 -
stuck inactive
PG长时间卡在inactive
状态(需人工干预)。 -
stuck unclean
PG无法达到clean
状态。
二、PG异常处理步骤
1. 检查集群状态
# 查看整体健康状态 ceph health detail # 列出所有异常PG ceph pg stat
2. 定位具体PG问题
# 查看指定PG的详细信息(替换<pg_id>) ceph pg <pg_id> query
3. 处理常见异常场景
场景1:degraded
或undersized
-
原因:OSD下线或故障。
-
解决:
-
检查OSD状态:
ceph osd stat ceph osd tree
-
启动故障OSD(若硬件正常):
systemctl start ceph-osd@<osd_id>
-
若OSD无法恢复,标记为
out
并等待数据重平衡:ceph osd out <osd_id>
-
场景2:stale
-
原因:主OSD未上报状态。
-
解决:
-
检查主OSD是否宕机:
ceph osd find <osd_id>
-
重启主OSD或修复网络问题。
-
场景3:inconsistent
-
原因:数据副本不一致。
-
解决:
-
触发修复:
ceph pg repair <pg_id>
-
若修复失败,手动选择正确副本:
ceph pg <pg_id> mark_unfound_lost revert
-
场景4:stuck inactive
或stuck unclean
-
原因:PG无法自动恢复。
-
解决:
-
重启相关OSD:
systemctl restart ceph-osd@<osd_id>
-
调整恢复参数(临时调高并发):
ceph tell osd.* injectargs '--osd-max-backfills=4'
-
4. 强制重置PG(谨慎操作)
# 重置PG状态(仅在极端情况下使用) ceph pg force_create_pg <pg_id>
5. 检查数据完整性
# 触发手动Scrub ceph pg scrub <pg_id>
三、关键命令速查
命令 | 用途 |
---|---|
ceph -s | 查看集群摘要 |
ceph pg dump --format json | 导出所有PG详细状态(JSON格式) |
ceph osd blocked-by | 查看阻塞恢复的OSD |
ceph osd reweight <osd_id> <weight> | 调整OSD权重以平衡数据 |
四、预防措施
-
监控告警 部署Prometheus + Grafana监控,重点关注
active+clean
比例和OSD状态。 -
定期维护 每月执行一次
deep-scrub
,检查数据一致性。 -
容量规划 避免单个OSD负载过高,保持剩余空间>20%。
-
避免过载 调整参数限制恢复速度,防止影响业务:
ceph tell osd.* injectargs '--osd-recovery-max-active=3'
通过以上方法,可快速定位并修复PG异常,确保Ceph集群稳定运行。复杂场景建议参考Ceph官方文档或社区支持。