Step1:避免集群内再次发生不可控的映射变化和数据迁移。
当发现有PG处于incomplete状态之后,首先依次执行下述操作,避免集群内再次发生不可控的映射变化和数据迁移。
1. 执行以下命令,使集群内数据处于静止状态,不能迁移
ceph osd set noout, ceph osd set nobackfill, ceph osd set norecover
2. 关闭所有OSD节点的agent,避免OSD自动拉起
systemctl stop csp-agent.target
3. 记录下来当时PG的详细信息,如果有多个PG,每个PG都先query一次到文件
ceph pg query > pgxxx.query
Step2:将incomplete PG所属pool的min_size降到K值。
检查incomplete PG所属pool,如果是EC的pool,先尝试将pool的min_size降低到K值,比如K:M为4:2,则降低到4,但不能小于4。若pool是多副本pool,则跳过此步骤。
ceph osd pool set min_size
ceph osd unset nobackfill
ceph osd unset norecover
等待数据修复,直至恢复正常,或者没有数据可恢复为止
Step3: EC pool有数据不能恢复的情况处理
经过Step2的修复后,EC pool可能存在有数据不能恢复的情况,原因可能是剩余的incomplete PG无法找够K个数据片,这些丢失的数据片很可能在以前的映射中落在别的OSD上,此时需要用下述命令来查找数据片所在OSD。多副本pool跳过此步骤。
for dir in `ll /var/lib/ceph/osd/|awk '{print $9}'`;
do echo $dir;
ceph-objectstore-tool --data-path /var/lib/ceph/osd/$dir --type bluestore --op list-pgs|grep ;
done
例如PG映射是[5,12,24,32,42,55],其中本应在osd24的数据片落在了osd26上,对应pg及shard为2.1s2 (EC的pg会分为多个shard,2.1s0 - 2.1s5,分别顺序对应[5,12,24,32,42,55]),则需要将osd26上对应的分片先导出,然后再导入osd24。操作如下:
1. 首先停止osd.24和osd.26,进行osd bluestore操作时,需要先停止OSD,
2. 导出pg分片
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-26/ --type bluestore --pgid 2.1s2 --op export --file 2.1s2export
3. 步骤2中导出的pg分片导入osd.24
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-24/ --type bluestore --op import --file 2.1s2export
4. 标记osd.24的数据片已修复完成
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-24/ --type bluestore --pgid 2.1s2 --op mark-complete
5. 按照上述步骤将尽量多的pg分片找到并搬到对应的OSD
6. 最后启动osd.24和osd.26,PG即可自动完成peering,进入recovery_wait状态
step4 : 多副本pool的incomplete修复
与EC不同之处在于,PG不会分片,但pg可能有多份数据在多个OSD,这些OSD可能是pg映射到的OSD,也可能是其它的OSD。
这种情况下,需要人工确定权威副本,可以通过比较object个数和pg log的方式来确定。
1. 查看object个数
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-26/ --type bluestore --pgid 2.5 --op list|wc -l
2. 导出pg log
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-26/ --type bluestore --pgid 2.5 --op log > pg2.5-osd26.log
3. 比如确定权威副本在OSD.24上,而pg映射在[14, 25, 66],则需要从osd.24上导出pg数据
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-24/ --type bluestore --pgid 2.5 --op export --file 2.5export
4. 将此文件scp到osd.14所在主机,导入到osd.14中
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-14/ --type bluestore --pgid 2.5 --op remove --force
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-14/ --type bluestore --op import --file 2.5export
5. 标记osd.14的数据片已修复完成
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-24/ --type bluestore --pgid 2.5 --op mark-complete
6. 删除osd.25和osd.66的PG
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-25/ --type bluestore --pgid 2.5 --op remove --force
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-66/ --type bluestore --pgid 2.5 --op remove --force
7. 启动OSD,等待PG进入recovery_wait状态
Step5 : 所有incomplete PG都消除掉incomplete状态之后,打开recovery
ceph osd unset nobackfill
ceph osd unset norecover
等待PG recovery完成,修复过程结束。