Step1:避免集群內再次發生不可控的映射變化和數據遷移。
當發(fa)現(xian)有PG處于incomplete狀態之后,首先依次(ci)執行下述(shu)操作,避(bi)免集群內再次(ci)發(fa)生不可控的映射(she)變化和數據遷移。
1. 執行(xing)以(yi)下命令(ling),使集群內(nei)數據處于靜止(zhi)狀態,不能遷移
ceph osd set noout, ceph osd set nobackfill, ceph osd set norecover
2. 關閉所有OSD節點的(de)agent,避免OSD自(zi)動拉起(qi)
systemctl stop csp-agent.target
3. 記錄下來(lai)當時PG的詳細信息,如果有多(duo)個PG,每個PG都先query一(yi)次(ci)到文件
ceph pg query > pgxxx.query
Step2:將incomplete PG所屬pool的min_size降到K值。
檢查incomplete PG所屬pool,如果是(shi)EC的pool,先嘗試將(jiang)pool的min_size降低到(dao)K值,比如K:M為4:2,則(ze)降低到(dao)4,但不能(neng)小于4。若pool是(shi)多副(fu)本pool,則(ze)跳過此步驟(zou)。
ceph osd pool set min_size
ceph osd unset nobackfill
ceph osd unset norecover
Step3: EC pool有數據不能恢復的情況處理
經過Step2的(de)修復后(hou),EC pool可能存在(zai)(zai)(zai)有(you)數據(ju)(ju)不(bu)能恢復的(de)情況,原(yuan)因可能是剩余的(de)incomplete PG無法找(zhao)夠K個數據(ju)(ju)片,這些丟失的(de)數據(ju)(ju)片很可能在(zai)(zai)(zai)以前的(de)映射中落在(zai)(zai)(zai)別的(de)OSD上,此(ci)時(shi)需要用下述命令來查找(zhao)數據(ju)(ju)片所在(zai)(zai)(zai)OSD。多(duo)副本pool跳過此(ci)步(bu)驟。
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
例(li)如PG映射是[5,12,24,32,42,55],其(qi)中本應(ying)在(zai)osd24的數據片落(luo)在(zai)了osd26上,對(dui)應(ying)pg及shard為2.1s2 (EC的pg會分為多個shard,2.1s0 - 2.1s5,分別順(shun)序對(dui)應(ying)[5,12,24,32,42,55]),則需要將osd26上對(dui)應(ying)的分片先(xian)導出,然后再導入osd24。操作如下(xia):
1. 首先停止osd.24和(he)osd.26,進行osd bluestore操作(zuo)時,需要先停止OSD,
2. 導出pg分片
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-26/ --type bluestore --pgid 2.1s2 --op export --file 2.1s2export
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-24/ --type bluestore --op import --file 2.1s2export
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-24/ --type bluestore --pgid 2.1s2 --op mark-complete
5. 按照上述步驟(zou)將(jiang)盡量(liang)多的pg分片找到并搬(ban)到對應的OSD
6. 最(zui)后啟動osd.24和osd.26,PG即可自動完成(cheng)peering,進入recovery_wait狀態
step4 : 多副本pool的incomplete修復
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-26/ --type bluestore --pgid 2.5 --op list|wc -l
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-26/ --type bluestore --pgid 2.5 --op log > pg2.5-osd26.log
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-24/ --type bluestore --pgid 2.5 --op export --file 2.5export
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
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-24/ --type bluestore --pgid 2.5 --op mark-complete
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
Step5 : 所有incomplete PG都消除掉incomplete狀態之后,打開recovery
ceph osd unset nobackfill
ceph osd unset norecover