[关闭]
@dyj2017 2017-11-02T10:00:20.000000Z 字数 3098 阅读 1226

组装恢复rbd

ceph ceph实验 rbd


cluster相关环境:

  1. # cat /etc/redhat-release
  2. CentOS Linux release 7.3.1611 (Core)
  3. # ceph -v
  4. ceph version 12.2.1 (3e7492b9ada8bdc9a5cd0feafd42fbca27f9c38e) luminous (stable)

比如需要恢复所有前缀为 rbd_data.1041643c9869 的块设备,该块设备名为foo,文件系统类型为xfs,大小1G,挂载到了/root/foo/目录下,并有三个文件:

  1. [root@node3 ~]# ls foo/
  2. file1.txt file2.txt file3.txt
  3. [root@node3 ~]# cat foo/file2.txt
  4. Ceph
  5. 2222222222222222222222222222222222222

恢复该foo块设备需要进行下面的操作

1. 从集群下载前缀相同的所有对象到本地:

查看rbd存储池中的对象:

  1. [root@node3 ~]# rados -p rbd ls|sort
  2. rbd_data.1041643c9869.0000000000000000
  3. rbd_data.1041643c9869.0000000000000001
  4. rbd_data.1041643c9869.000000000000001f
  5. rbd_data.1041643c9869.000000000000003e
  6. rbd_data.1041643c9869.000000000000005d
  7. rbd_data.1041643c9869.000000000000007c
  8. rbd_data.1041643c9869.000000000000007d
  9. rbd_data.1041643c9869.000000000000007e
  10. rbd_data.1041643c9869.000000000000009b
  11. rbd_data.1041643c9869.00000000000000ba
  12. rbd_data.1041643c9869.00000000000000d9
  13. rbd_data.1041643c9869.00000000000000f8
  14. rbd_data.1041643c9869.00000000000000ff
  15. rbd_directory
  16. rbd_header.1041643c9869
  17. rbd_id.foo
  18. rbd_info

从集群获取前缀为 rbd_data.1041643c9869 的所有对象到本地:

如:

  1. [root@node3 ~]# rados -p rbd get rbd_data.1041643c9869.0000000000000000 rbd_data.1041643c9869.0000000000000000

2. 创建脚本组装该rbd:

2.1 创建 mkrbd.sh 脚本:

  1. [root@node3 ~]# touch mkrbd.sh
  2. [root@node3 ~]# chmod +x mkrbd.sh

2.2 编辑脚本:

  1. [root@node3 ~]# vi mkrbd.sh

输入以下内容:

  1. #!/bin/sh
  2. # Rados object size 这是刚刚的4M的大小
  3. obj_size=4194304
  4. # DD bs value
  5. rebuild_block_size=512
  6. #rbd="${1}"
  7. rbd="foo1" #生成的块名
  8. #base="${2}" #prefix
  9. base="rbd_data.1041643c9869"
  10. #rbd_size="${3}" #1G
  11. rbd_size="1073741824"
  12. base_files=$(ls -1 ${base}.* 2>/dev/null | wc -l | awk '{print $1}')
  13. if [ ${base_files} -lt 1 ]; then
  14. echo "COULD NOT FIND FILES FOR ${base} IN $(pwd)"
  15. exit
  16. fi
  17. # Create full size sparse image. Could use truncate, but wanted
  18. # as few required files and dd what a must.
  19. dd if=/dev/zero of=${rbd} bs=1 count=0 seek=${rbd_size} 2>/dev/null
  20. for file_name in $(ls -1 ${base}.* 2>/dev/null); do
  21. seek_loc=$(echo ${file_name} | awk -v os=${obj_size} -v rs=${rebuild_block_size} -F. '{print os*strtonum("0x" $NF)/rs}')
  22. dd conv=notrunc if=${file_name} of=${rbd} seek=${seek_loc} bs=${rebuild_block_size} 2>/dev/null
  23. done

执行该脚本后在本地生成了一个foo1的文件

2.3 查看挂载组装后的foo1:

  1. [root@node3 ~]# file foo1
  2. foo1: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
  3. [root@node3 ~]# du -sh foo1
  4. 11M foo1
  5. [root@node3 ~]# ll -h foo1
  6. -rw-r--r-- 1 root root 1.0G 10 17 16:04 foo1

可以看出foo1是xfs文件,使用了11M,大小为1G

  1. [root@node3 ~]# mount foo1 /mnt
  2. mount: 文件系统类型错误、选项错误、/dev/loop0 上有坏超级块、
  3. 缺少代码页或助手程序,或其他错误
  4. 有些情况下在 syslog 中可以找到一些有用信息- 请尝试
  5. dmesg | tail 这样的命令看看。
  6. [root@node3 ~]# dmesg|tail
  7. [88818.307314] XFS (rbd0): Mounting V5 Filesystem
  8. [88818.865978] XFS (rbd0): Ending clean mount
  9. [91099.845834] bash (6208): drop_caches: 1
  10. [91492.345582] bash (6208): drop_caches: 1
  11. [93485.275727] libceph: osd2 down
  12. [93485.275739] libceph: osd5 down
  13. [93495.518099] libceph: osd2 up
  14. [93495.518165] libceph: osd5 up
  15. [95288.897917] loop: module loaded
  16. [98449.535689] XFS (loop0): Filesystem has duplicate UUID 313b2d89-f4bc-4ee6-a1d8-a996190222fd - can't mount

挂载foo1时出现了上面的错误提示,这是因为原来的foo块是/dev/rbd0的克隆,所以foo的UUID是和/dev/rbd0的是一样的,这时候我们umount /foo即可:

  1. [root@node3 ~]# umount foo/
  2. [root@node3 ~]# mount foo1 /mnt
  3. [root@node3 ~]# ls /mnt/
  4. file1.txt file2.txt file3.txt
  5. [root@node3 ~]# cat /mnt/file2.txt
  6. Ceph
  7. 2222222222222222222222222222222222222

可以看到已将完全恢复出了原来的foo块设备的内容,当然也可以给恢复的rbd名字称为foo

参考文献:

大话Ceph--RBD那点事儿

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注