从死集群恢复 RBD 镜像

多年前,我遇到了一段由 Catawba 大学 Shawn Moore 和 Rodney Rymer 编写的脚本。该工具的目的是重建 RBD 镜像。想象一下你的集群已经崩溃,所有的监控器都被擦除,并且你没有备份(我知道可能发生什么?)。但是,你的所有对象仍然完好无损。
我一直想写一篇关于这个工具的博客文章,只是为了宣传它并确保人们可以使用它。希望这对这个工具是一个好的宣传 :-)。
备份 RBD 镜像 ¶
在深入恢复过程之前,我想花几行字来描述备份什么以及如何备份它。
- 跟踪所有池中的所有镜像
- 存储它们的属性(由
rbd info <pool>/<image>显示) - 存储 RBD 头
恢复 ¶
在此练习中,我将简单地
- 创建一个 RBD 镜像
- 将其映射到一台机器上
- 在它上面放置一个 XFS 文件系统
- 触摸一个简单的文件
```bash $ rbd create -s 10240 leseb $ rbd info leseb rbd image 'leseb': size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rb.0.1066.74b0dc51 format: 1
$ sudo rbd -p rbd map leseb /dev/rbd0
$ sudo rbd showmapped id pool image snap device 0 rbd leseb - /dev/rbd0
$ sudo mkfs.xfs /dev/rbd0 log stripe unit (4194304 bytes) is too large (maximum is 256KiB) log stripe unit adjusted to 32KiB meta-data=/dev/rbd0 isize=256 agcount=17, agsize=162816 blks
= sectsz=512 attr=2, projid32bit=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=1024 swidth=1024 blks
naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
$ sudo mount /dev/rbd0 /mnt $ echo "foo" > /mnt/bar $ sudo umount /mnt $ sudo rbd unmap /dev/rbd0 ```
准备一个目录在服务器上恢复你的镜像
bash $ mkdir recover_leseb $ wget -O rbd_restore https://raw.githubusercontent.com/smmoore/ceph/master/rbd_restore.sh $ chmox +x rbd_restore
然后我需要收集所有的 RBD 对象文件,在我的设置中,我只有一个 OSD 服务器,这使得收集操作更容易
bash $ cd recover_leseb ~/recover_leseb$ for block in $(find /var/lib/ceph/osd/ -type f -name rb.0.1066.74b0dc51.*); do cp $block . ; done ~/recover_leseb$ bash recover.sh leseb rb.0.1066.74b0dc51 10737418240 ~/recover_leseb$ file leseb leseb: SGI XFS filesystem data (blksz 4096, inosz 256, v2 dirs) ~/recover_leseb$ du -h leseb 11M leseb
嗯,看起来我们这里有一些有趣的东西 :) 让我们看看它是否真的有效
```bash ~/recover_leseb$ losetup -f /dev/loop0
~/recover_leseb$ losetup /dev/loop0 leseb ~/recover_leseb$ mount /dev/loop0 /mnt/ ~/recover_leseb$ df -h /mnt Filesystem Size Used Avail Use% Mounted on /dev/loop0 10G 33M 10G 1% /mnt
~/recover_leseb$ ls /mnt/ bar ~/recover_leseb$ cat /mnt/bar foo ```
太棒了!