首先先贴一下pg的几种常见的状态,更多见官网
Creating (创建中):PG正在被创建。
Activ (活跃):PG是活跃的,这个时候后可以对这个PG进行读写操作。
Clean (清洁):PG已经按设置的副本数目复制了足够的副本。
Down(掉线):PG掉线。
Inconsistent (不一致的):PG的副本之间数据不一致, 比如对象大小和对象丢失会出现这种情况。
Backfill (回填):PG在新的OSD加入后根据CRUSH进行数据迁移 的状态,迁移的目的是达到负载均衡。
Stale (陈旧):PG是未知的, 因为PG已经很久没有更新了。
Peering (对等互联):PG的主OSD发起的就从的OSD就PG的所有对象和元数据状态达成一致的过程。
刷新PG:ceph pg scrub {pg-id}
修复PG:ceph pg repair {pgid}
第一步:先ceph -w或者ceph health detail 来看一下集群大概的错误,看是有mon掉线了还是osd掉线,或者是哪个pg出错了。本文只介绍pg出错的处理方式,其他出错处理方式后续补充。
第二步:根据ceph pg dum | grep {pgid}来看具体的现在pg状态 (ceph pg {pgid} query能看到更详细的pg的各个参数)
(以下步骤因具体错误而异)
第三步:这里就看集体的错误来做具体的操作了,比如是active+clean+inconsistent的话,先尝试ceph pg repair {pgid}来进行修复。
第四步:如果错误还在就ceph osd repair {osd.id}来修复该PG对应的那几个OSD磁盘。
第五步:继续报错,那就吧改PG的主OSD去除,然后等待CRUSH规则从新分配一个主的OSD,然后ceph pg repair {pgid}。
第六步:还不行的话,我选择删集群辞职。(开玩笑,不行的 话可以留言,大家一起讨论)