从已死的集群中恢复RBD镜像

本文由 Ceph中国社区-Thomas翻译,校稿:半天河

英文出处:Sébastien Han 欢迎加入 翻译组

很多年前,我看到了由Catawba大学的Shawn Moore和Rodney Rymer写的一个脚本。该脚本用来重建RBD镜像。想象一下,你的Ceph集群挂了,所有的Monitor都已经被移除并且没有备份数据,但是所有的Object都保存完整。

我一直想写篇关于这个工具的博客,简单的宣传下以便其他人能够使用它。希望这会给该工具带来一个好的宣传效果 🙂 。

备份RBD镜像

在深入恢复过程之前。我打算多费几句口舌描述下哪些重要信息需要备份以及如何备份。

  • 跟踪存储池中所有的镜像
  • 保存所有镜像的属性信息(命令 rbd info <pool>/<image> 显示的信息)
  • 保存RBD headers

 

恢复

在这个练习中,我简单的:

  • 创建一个RBD镜像
  • 将RBD映射到一台主机
  • 用XFS文件系统格式化
  • 创建一个文件

$ 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

在服务器上准备一个目录用来恢复你的RBD镜像:

$ mkdir recover_leseb

$ wget -O rbd_restore https://raw.githubusercontent.com/smmoore/ceph/master/rbd_restore.sh

$ chmox +x rbd_restore

然后你需要收集RBD镜像的所有Object文件,我的测试环境只有一个OSD服务器,因而这个收集操作非常简单:

$ 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

看起来这里有些有趣的事情。让我们一起看看它是否能工作:

~/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

  • HELL YEAH!

Leave a Comment

电子邮件地址不会被公开。