从死集群恢复 RBD 镜像

shan

多年前,我遇到了一段由 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 ```

太棒了!