Ceph RBD 备份与恢复

在使用Ceph RBD中,我们需要了解RBD的分层、镜像制作以及如何为我们RBD文件进行全备增量备份。对RBD的回收站机制做一些了解

文章目录

  • 一、RBD回收机制
  • 二、RBD镜像制作快照
  • 三、RBD快照数据恢复
  • 四、RBD镜像克隆
  • 4.1 RBD分层概念
  • 4.2 RBD快照保护
  • 4.3 RBD克隆快照
  • 4.4 RBD取消父级
  • 五、RBD备份与恢复
  • 5.1 RBD全备
  • 5.2 RBD全量数据恢复
  • 5.3 RBD增量备份
  • 5.4 RBD增量数据恢复
  • 相关文章:
  • 一、RBD回收机制

    ceph RBD默认提供回收站机制trash,也就是我们可以把块数据放在回收站,在回收站中保持一定的存储周期,当我们后期还需要使用的时候可以在回收站在拿回来。
    同样,在公有云也有硬盘的回收站,作用和RBD回收站类似,当我们后不确定是否后期还会使用,回收站会为我们保留一定时间的周期

    到期7天后仍未续费的云硬盘,会在回收站中保留7天,这期间您可以续费进行恢复。7天后,这些云硬盘会被彻底释放,不可恢复。

    回收站有两个好处

  • 可以有效的防止误删除操作 (正常情况下数据就会销毁掉了,但是有了回收站,数据是存放在回收站中)
  • 还有一种情况多发生的云存储中,例如我们的服务器忘记续费,过期后默认情况下是直接被释放了,但是有了回收站,数据就会在回收站在为我们保留一段时间
  • Ceph RBD 备份与恢复-每日运维
    接下来我们将rbd文件删除,并演示如何从回收站中删除和恢复rbd文件

    [root@ceph-01 ~]# ceph osd lspools          #首先我们查看一下我们的pool
    1 abcdocker
    2 .rgw.root
    3 default.rgw.control
    4 default.rgw.meta
    5 default.rgw.log
    6 default.rgw.buckets.index
    7 default.rgw.buckets.data
    8 cephfs_data
    9 cephfs_metadata
    
    [root@ceph-01 ~]# rbd -p abcdocker ls               #这里可以找到之前创建的rbd文件
    abcdocker-rbd.img
    
    #这里我们在创建一块rbd文件,为我们rbd创建一个10G的rbd块存储
    [root@ceph-01 ~]# rbd create abcdocker/ceph-trash.img --size 10G        #创建名称为ceph-trash的rbd文件,大小为10G
    [root@ceph-01 ~]# rbd -p abcdocker ls
    abcdocker-rbd.img
    ceph-trash.img
    
    #rbd文件大小
    [root@ceph-01 ~]# rbd info abcdocker/ceph-trash.img
    rbd image 'ceph-trash.img':
        size 10 GiB in 2560 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 32109b54fb476
        block_name_prefix: rbd_data.32109b54fb476
        format: 2
        features: layering
        op_features:
        flags:
        create_timestamp: Wed Mar  9 15:47:10 2022
        access_timestamp: Wed Mar  9 15:47:10 2022
        modify_timestamp: Wed Mar  9 15:47:10 2022

    rbd删除操作
    默认情况下,删除rbd镜像文件是直接删除,没有保留到回收站。在回收站中也没有进行保留

    #第一种: 直接删除,不存放到回收站
    [root@ceph-01 ~]# rbd rm abcdocker/ceph-trash.img
    Removing image: 100% complete...done.
    [root@ceph-01 ~]# rbd -p abcdocker ls
    abcdocker-rbd.img
    
    #第二种: 将RBD文件移动到回收站
    [root@ceph-01 ~]# rbd trash move abcdocker/ceph-trash.img --expires-at 20220310
    #trash 表示存放到回收站
    #move 移动操作
    #abcdocker/ceph-trash.img pool为abcdocker,rbd文件为ceph-trash.img
    #--expires-at 表示释放时间,日期只可以精确到日
    
    #移动到回收站后,在正常的资源池已经看不到。但是在回收站中还可以看到
    [root@ceph-01 ~]# rbd -p abcdocker ls
    abcdocker-rbd.img
    
    [root@ceph-01 ~]# rbd trash -p abcdocker ls
    32142766bcf53 ceph-trash.img

    rbd回收站找回操作
    前面说我们通过trash move将rbd文件移动到回收站,例如后面我们想把rbd文件找回,可以通过下面的方式进行找回操作

    [root@ceph-01 ~]# rbd trash -p abcdocker ls         #查看回收站中的rbd文件
    32142766bcf53 ceph-trash.img
    [root@ceph-01 ~]# rbd trash restore -p abcdocker 32142766bcf53   #恢复到abcdocker pool中
    [root@ceph-01 ~]# rbd trash -p abcdocker ls   #再次查看回收站中的rbd文件
    [root@ceph-01 ~]# rbd -p abcdocker ls  #查看pool中的rbd文件已经恢复
    abcdocker-rbd.img
    ceph-trash.img

    二、RBD镜像制作快照

    和云硬盘一样,RBD也是支持快照的功能,对某个时刻的RBD文件进行保留生成快照。

    RBD是块存储基于文件系统上的,我们在生成快照时需要确保文件系统正常。否则生成的快照也出现损坏

    云硬盘也属于块存储,和RBD一样支持快照。 (同时,公有云还可以定期为云硬盘做快照)Ceph RBD 备份与恢复-每日运维
    我们使用之前创建的rbd文件,将rbd挂载到本地的文件系统中,写入文件并做快照

    [root@ceph-01 ~]# rbd -p abcdocker ls                       #首先查看rbd文件中的设备
    abcdocker-rbd.img
    ceph-trash.img
    
    [root@ceph-01 ~]# rbd device map abcdocker/ceph-trash.img   #将rbd文件挂载到本地
    /dev/rbd0
    
    [root@ceph-01 ~]# mkfs.ext4 /dev/rbd0                   #格式化ceph-trash.img设备
    mke2fs 1.42.9 (28-Dec-2013)
    Discarding device blocks: done
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    Stride=1024 blocks, Stripe width=1024 blocks
    655360 inodes, 2621440 blocks
    131072 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=2151677952
    80 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
    
    Allocating group tables: done
    Writing inode tables: done
    Creating journal (32768 blocks): done
    Writing superblocks and filesystem accounting information:
    done
    
    [root@ceph-01 ~]# mount /dev/rbd0 /mnt/                 #将/dev/rbd0设备挂载到/mnt下
    [root@ceph-01 ~]# echo "i4t.com" >/mnt/abcdocker.txt       #写入测试文件查看
    [root@ceph-01 ~]# cat /mnt/abcdocker.txt
    i4t.com
    
    [root@ceph-01 ~]# df -h                 #df -h已经可以看到挂载点了
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda3              50G  2.3G   48G   5% /
    devtmpfs              1.9G     0  1.9G   0% /dev
    tmpfs                 1.9G     0  1.9G   0% /dev/shm
    tmpfs                 1.9G   33M  1.9G   2% /run
    tmpfs                 1.9G     0  1.9G   0% /sys/fs/cgroup
    tmpfs                 1.9G   24K  1.9G   1% /var/lib/ceph/osd/ceph-0
    tmpfs                 1.9G   24K  1.9G   1% /var/lib/ceph/osd/ceph-3
    192.168.31.20:6789:/  180G   35G  146G  20% /abcdocker
    tmpfs                 380M     0  380M   0% /run/user/1000
    /dev/rbd0             9.8G   37M  9.2G   1% /mnt

    通过device ls可以看到镜像名称和对应的挂载点

    [root@ceph-01 mnt]# rbd device ls
    id pool      namespace image             snap device
    0  abcdocker           ceph-trash.img    -    /dev/rbd0
    1  abcdocker           ceph-test-01.img  -    /dev/rbd1
    2  abcdocker           ceph-temp.img     -    /dev/rbd2
    3  abcdocker           abcdocker-rbd.img -    /dev/rbd3
    4  abcdocker           ceph-trash.img    -    /dev/rbd4

    取消device 映射

    [root@ceph-01 new]# rbd device ls
    id pool      namespace image            snap device
    0  abcdocker           ceph-temp.img    -    /dev/rbd0
    1  abcdocker           ceph-bak.img     -    /dev/rbd1
    2  abcdocker           ceph-bak-new.img -    /dev/rbd2
    [root@ceph-01 new]# rbd device unmap /dev/rbd0   #后面参数为device目录
    [root@ceph-01 new]# rbd device ls
    id pool      namespace image            snap device
    1  abcdocker           ceph-bak.img     -    /dev/rbd1
    2  abcdocker           ceph-bak-new.img -    /dev/rbd2

    接下来我们创建快照,将现在的状态进行保存

    [root@ceph-01 ~]# rbd -p abcdocker ls               #查看pool下的rbd文件
    abcdocker-rbd.img
    ceph-trash.img
    
    [root@ceph-01 ~]# rbd snap create abcdocker/ceph-trash.img@snap_test_2022-03-09             #执行快照备份
    #snap为快照参数
    #abcdocker为pool名称
    #ceph-trash.img 为rbd文件
    #@snap_test_2022-03-09为快照名称
    
    [root@ceph-01 ~]# rbd snap ls abcdocker/ceph-trash.img          #使用ls命令可以查看快照列表,以及创建时间
    SNAPID NAME                 SIZE   PROTECTED TIMESTAMP
         4 snap_test_2022-03-09 10 GiB           Wed Mar  9 16:36:23 2022

    删除快照可以通过下面的命令

    [root@ceph-01 ~]# rbd snap remove abcdocker/ceph-trash.img@snap_test_2022-03-09   #格式和创建的格式相同,命令替换为remove (相当于rm)
    Removing snap: 100% complete...done.
    [root@ceph-01 ~]# rbd snap ls abcdocker/ceph-trash.img
    
    ##如果我们镜像没有在使用了,可以通过purge直接删除所有快照
    [root@ceph-01 ~]# rbd snap purge abcdocker/ceph-trash.img
    Removing all snapshots: 100% complete...done.
    [root@ceph-01 ~]# rbd snap ls abcdocker/ceph-trash.img

    三、RBD快照数据恢复

    当我们做好备份后,后续有需求需要回滚。 可以通过下面的命令进行回滚操作。将rbd文件恢复到之前创建好快照的位置

    #首先我们删除现在rbd挂载中的文件
    [root@ceph-01 ~]# rm /mnt/abcdocker.txt
    rm: remove regular file ‘/mnt/abcdocker.txt’? y
    [root@ceph-01 ~]# ls /mnt/
    lost+found

    使用快照进行恢复

    #首先我们执行rollback命令,进行数据恢复
    [root@ceph-01 ~]# rbd snap rollback abcdocker/ceph-trash.img@snap_test_2022-03-09
    Rolling back to snapshot: 100% complete...done.
    
    #参数解释
    #snap 为快照参数
    #rollback 为恢复快照
    #abcdocker 为pool名称
    #ceph-trash.img 为rbd文件名称
    #@snap_test_2022-03-09 为快照名称(需要恢复的快照名称)

    恢复完成后,文件系统不能马上识别出来,需要我们重新挂载块设备进行恢复

    [root@ceph-01 ~]# umount /mnt/
    [root@ceph-01 ~]# mount /dev/rbd0 /mnt/
    [root@ceph-01 ~]# ls /mnt/
    abcdocker.txt  lost+found
    [root@ceph-01 ~]# cat /mnt/abcdocker.txt
    i4t.com

    四、RBD镜像克隆

    Ceph支持为块设备快照创建许多写时复制COW克隆。快照分层使Ceph块设备客户端能够非常快速的创建映射。例如,我们创建一个块设备镜像,其中写入一个Linux;然后对镜像进行快照、保护快照并创建写时克隆。快照是只读的,写入将写入到新的位置--进行快速克隆

  • 完整克隆
  • 快速克隆 (快速克隆使用的就是写时复制)
  • 每个克隆镜像子级存储对父级镜像为引用作用,子级会读取父级别的数据
    1646892364126.png

    parent代表镜像父级
    Child 代表克隆的子级

    COW克隆和Ceph块设备完全相同,可以进行读取、写入和调整镜像大小。克隆镜像没用特殊限制。但是,写时复制克隆是指快照,因此必须在克隆快照之前对其保护

    Ceph目前只支持format 2镜像的克隆,内核rbd create --image-format 2还不支持。rbd因此必须使用QEMU/KVM或者librbd直接访问版本中的克隆

    4.1 RBD分层概念

    Ceph块设备分层是一个简单的过程,首先我们必须创建镜像的快照,并且需要保护快照,保护完成就可以开始克隆快照
    克隆的镜像有对父快照的引用,包括池ID、镜像ID和快照ID。
    1.镜像模板: 块设备分层的一个常见用例是创建一个主镜像和一个用做克隆模板的快照。2.扩展模板: 提供比基础镜像更多的信息,例如用户可以克隆镜像并按照其他软件,然后对扩展镜像进行快照,该扩展镜像本身可以更新就像基本镜像一样3.模板池: 使用块设备分层的一个方法是创建一个pool,其中包含充当模板的主镜像以及这些模板的快照。然后可以将只读权限扩展到用户,以便可以直接克隆快照,但是无法在池中写入和执行4.镜像迁移/恢复: 使用块设备分层的一个方法是将数据从一个pool迁移或者恢复到另一个pool中
    1646894411164.png

    4.2 RBD快照保护

    如果用户不小心删除了父快照,所有的克隆都会终端。为了防止克隆的镜像丢失,必须保护快照才可以进行克隆

    [root@ceph-01 ~]# rbd create abcdocker/ceph-temp.img --size 10G   #为了掩饰数据,我们创建一个新的镜像,大小为10G
    [root@ceph-01 ~]# rbd -p abcdocker ls
    abcdocker-rbd.img
    ceph-temp.img
    ceph-trash.img

    下面为镜像制作一个快照

    [root@ceph-01 ~]# rbd snap create abcdocker/ceph-temp.img@temp   #创建名称为temp的快照
    [root@ceph-01 ~]# rbd snap ls abcdocker/ceph-temp.img    #查看一下快照
    SNAPID NAME SIZE   PROTECTED TIMESTAMP
         8 temp 10 GiB           Thu Mar 10 15:03:39 2022

    制作完快照后,我们将快照保护起来

    [root@ceph-01 ~]# rbd snap protect abcdocker/ceph-temp.img@temp   #通过protect保护
    
    [root@ceph-01 ~]# rbd snap rm abcdocker/ceph-temp.img@temp      #这里我们就可以看到,已经无法删除了
    Removing snap: 0% complete...failed.
    rbd: snapshot 'temp' is protected from removal.
    2022-03-10 15:06:10.564 7f39f6a09c80 -1 librbd::Operations: snapshot is protected

    取消保护,如果我们想取消保护,可以通过unproject参数

    [root@ceph-01 ~]# rbd snap unprotect abcdocker/ceph-temp.img@temp

    4.3 RBD克隆快照

    这会我们的父镜像已经制作好了,开始克隆子镜像

    克隆可以选择pool,可以和父镜像不在一个pool中

    [root@ceph-01 ~]# rbd clone abcdocker/ceph-temp.img@temp abcdocker/ceph-test-01.img   #使用clone克隆参数
    [root@ceph-01 ~]# rbd clone abcdocker/ceph-temp.img@temp abcdocker/ceph-test-02.img
    [root@ceph-01 ~]# rbd clone abcdocker/ceph-temp.img@temp abcdocker/ceph-test-03.img
    [root@ceph-01 ~]# rbd -p abcdocker ls   #查看克隆后的镜像
    abcdocker-rbd.img
    ceph-temp.img
    ceph-test-01.img            #这里就是我们刚刚克隆完毕的
    ceph-test-02.img
    ceph-test-03.img
    ceph-trash.img
    [root@ceph-01 ~]#

    挂载测试,因为里面没有数据实际上挂载的都一样

    [root@ceph-01 ~]# rbd -p abcdocker ls    #查看当前rbd文件
    abcdocker-rbd.img
    ceph-temp.img
    ceph-test-01.img
    ceph-test-02.img
    ceph-test-03.img
    ceph-trash.img
    [root@ceph-01 ~]# rbd device map abcdocker/ceph-test-01.img  #将rbd文件映射到本地
    /dev/rbd1
    [root@ceph-01 ~]# mkdir /mnnt   #创建挂载目录
    [root@ceph-01 ~]# mkfs.ext4 /dev/rbd1   #因为我们是新建的镜像,需要做格式化操作,我们可以将格式化后的状态在做一个快照,在重新保护起来使用
    
    [root@ceph-01 ~]# mount /dev/rbd1 /mnnt
    [root@ceph-01 ~]# ls /mnnt/
    lost+found

    4.4 RBD取消父级

    使用flatten取消依赖关系,此时我们在删除temp模板镜像,下面的ceph-test-03就不受影响

    [root@ceph-01 ~]# rbd children abcdocker/ceph-temp.img@temp   #使用children查看当前快照下面创建的镜像
    abcdocker/ceph-test-01.img
    abcdocker/ceph-test-02.img
    abcdocker/ceph-test-03.img
    
    [root@ceph-01 ~]# rbd flatten abcdocker/ceph-test-03.img    #执行flatten取消父级依赖,默认就会修改为完整克隆
    Image flatten: 100% complete...done.

    五、RBD备份与恢复

    5.1 RBD全备

    RBD备份分为两种,一种是全备,另外一个是增量备份
    全备操作 export
    这里我创建一个快照,并且将快照导出成一个单独的镜像。然后我们在挂载上去使用

    [root@ceph-01 mnt]# rbd -p abcdocker ls   #查看我们所有的镜像
    abcdocker-rbd.img
    ceph-temp.img
    ceph-test-01.img
    ceph-test-02.img
    ceph-test-03.img
    ceph-trash.img
    [root@ceph-01 mnt]# rbd snap ls abcdocker/ceph-temp.img    #查看当前快照列表
    SNAPID NAME SIZE   PROTECTED TIMESTAMP
         8 temp 10 GiB yes       Thu Mar 10 15:03:39 2022
    
    [root@ceph-01 mnt]# rbd snap create abcdocker/ceph-temp.img@bak_2022-03-10      #创建快照
    [root@ceph-01 mnt]# rbd export abcdocker/ceph-temp.img@bak_2022-03-10 /root/ceph-bak.img    #执行export导出
    Exporting image: 100% complete...done.

    此时我们数据已经备份完毕

    5.2 RBD全量数据恢复

    首先我们需要将原来的挂载点进行卸载

    [root@ceph-01 mnt]# umount /mnnt   #卸载点

    恢复RBD备份 import

    [root@ceph-01 mnt]# rbd import /root/ceph-bak.img abcdocker/ceph-bak.img
    Importing image: 100% complete...done.
    [root@ceph-01 mnt]# rbd -p abcdocker ls
    abcdocker-rbd.img
    ceph-bak.img

    刚刚已经在rbd中可以看到对应的ceph-bak.img文件,我们在进行挂载即可

    [root@ceph-01 mnt]# rbd device map abcdocker/ceph-bak.img
    /dev/rbd5
    [root@ceph-01 mnt]# mount /dev/rbd5 /mnnt

    针对挂载提示rbd: map failed: (6) No such device or address 解决方案可以参考下面文章https://www.cnblogs.com/zphj1987/p/13575352.html
    或者临时解决 rbd feature disable abcdocker/ceph-bak.img object-map fast-diff deep-flatten

    5.3 RBD增量备份

    对于增量备份,常用于ceph异地备份,或者kvm、OpenStack相关备份。可以减少空间占用大小
    可以写成定时脚本,定时基于全备添加增量的备份
    增量备份
    增量备份使用的参数为export-diff

    #首先我们先创建增量的快照
    [root@ceph-01 ~]# rbd device map abcdocker/ceph-bak.img  #添加镜像映射
    /dev/rbd1
    [root@ceph-01 ~]# mount /dev/rbd1 /mnnt   #挂载
    [root@ceph-01 ~]# cd /mnnt/
    [root@ceph-01 mnnt]# ls
    1    110  122  134  146  158  17   181  193  24  36  48  6   71  83  95
    10   111  123  135  147  159  170  182  194  25  37  49  60  72  84  96
    100  112  124  136  148  16   171  183  195  26  38  5   61  73  85  97
    101  113  125  137  149  160  172  184  196  27  39  50  62  74  86  98
    102  114  126  138  15   161  173  185  197  28  4   51  63  75  87  99
    103  115  127  139  150  162  174  186  198  29  40  52  64  76  88  lost+found
    104  116  128  14   151  163  175  187  199  3   41  53  65  77  89  seq
    105  117  129  140  152  164  176  188  2    30  42  54  66  78  9
    106  118  13   141  153  165  177  189  20   31  43  55  67  79  90
    107  119  130  142  154  166  178  19   200  32  44  56  68  8   91
    108  12   131  143  155  167  179  190  21   33  45  57  69  80  92
    109  120  132  144  156  168  18   191  22   34  46  58  7   81  93
    11   121  133  145  157  169  180  192  23   35  47  59  70  82  94

    接下来为rbd文件添加全量备份

    [root@ceph-01 mnnt]# rbd snap create abcdocker/ceph-bak.img@all_bak_2022-03-10   #创建名称为all_bak_2022-03-10的快照
    [root@ceph-01 mnnt]# rbd snap ls abcdocker/ceph-bak.img   #查看快照
    SNAPID NAME               SIZE   PROTECTED TIMESTAMP
        10 all_bak_2022-03-10 10 GiB           Mon Mar 14 14:04:33 2022
    [root@ceph-01 mnnt]# rbd export abcdocker/ceph-bak.img@all_bak_2022-03-10 /root/ceph-bak_all_bak_2022-03-10.img   #导出快照
    Exporting image: 100% complete...done.
    
    [root@ceph-01 mnnt]# ll /root/ceph-bak_all_bak_2022-03-10.img -h  #查看快照大小,目前快照大写10个G
    -rw-r--r-- 1 root root 10G Mar 14 14:05 /root/ceph-bak_all_bak_2022-03-10.img

    全量备份添加完毕后,我们在创建新数据,充当增量备份

    #上面是我们之前的数据,现在我们在创建200个文件
    [root@ceph-01 mnnt]# for i in `seq 200`;do touch $i.log;done

    接下来做增量的备份 (增量备份恢复的时候也是要基于全量做备份)

    #增量备份也是要添加快照,我们在创建一个快照
    [root@ceph-01 mnnt]# rbd snap ls abcdocker/ceph-bak.img
    SNAPID NAME               SIZE   PROTECTED TIMESTAMP
        10 all_bak_2022-03-10 10 GiB           Mon Mar 14 14:04:33 2022
    [root@ceph-01 mnnt]# rbd snap create abcdocker/ceph-bak.img@new_v1   #新new_v1快照
    [root@ceph-01 mnnt]# rbd snap ls abcdocker/ceph-bak.img   #查看所有快照
    SNAPID NAME               SIZE   PROTECTED TIMESTAMP
        10 all_bak_2022-03-10 10 GiB           Mon Mar 14 14:04:33 2022
        11 new_v1             10 GiB           Mon Mar 14 14:09:20 2022

    目前all_bak_2022-03-10为全量的快照,new_v1为增量备份的快照
    接下来导出快照

    [root@ceph-01 mnnt]# rbd export-diff abcdocker/ceph-bak.img@new_v1 /root/ceph_new_v1.img   #导出增量备份文件
    Exporting image: 100% complete...done.
    [root@ceph-01 mnnt]# ls -lh /root/ceph_new_v1.img   #查看增量备份文件
    -rw-r--r-- 1 root root 44M Mar 14 14:10 /root/ceph_new_v1.img

    目前可以看到增量备份文件只有大概44M,全量备份文件为10G

    对于增量备份,常用于ceph异地备份,或者kvm、OpenStack相关备份。可以减少空间占用大小

    5.4 RBD增量数据恢复

    前面已经说了RBD的增量备份,增量备份完成我们就需要考虑如何进行增量恢复数据

    首先RBD增量数据恢复需要安装顺序进行恢复,即v1,v2,v3,v4 按照顺序进行恢复
    即如果全量数据有影响,首先恢复全量数据
    在恢复增量v1、增量v2、增量v3 以此类推

    数据恢复可以恢复新的镜像中,也可以在原有的镜像恢复
    下面我们将6.3 RBD增量备份 生成的.log文件删除,然后使用import-diff命令实现增量恢复
    我这里演示的是在全量数据没有受影响的情况下,只删除增量备份前的数据进行恢复

    #前往挂载点,删除*.log文件
    
    [root@ceph-01 mnnt]# rm -rf *.log

    执行增量恢复

    [root@ceph-01 ~]# rbd -p abcdocker ls   #确认需要恢复镜像
    abcdocker-rbd.img
    ceph-bak.img
    ceph-temp.img
    ceph-test-01.img
    ceph-test-02.img
    ceph-test-03.img
    ceph-trash.img
    [root@ceph-01 ~]# rbd snap ls abcdocker/ceph-bak.img   #查看镜像快照
    SNAPID NAME               SIZE   PROTECTED TIMESTAMP
        10 all_bak_2022-03-10 10 GiB           Mon Mar 14 14:04:33 2022
        11 new_v1             10 GiB           Mon Mar 14 14:09:20 2022
    
    #我刚刚已经把new_v1备份前的数据删除,也就是目前是缺少new_v1的快照数据

    使用import-diff恢复到abcdocker/ceph-bak.img镜像中
    目前的文件夹Ceph RBD 备份与恢复-每日运维
    恢复的时候我们需要把快照名称删除

    [root@ceph-01 mnnt]# rbd snap rm abcdocker/ceph-bak.img@new_v1
    Removing snap: 100% complete...done.
    [root@ceph-01 mnnt]# rbd snap ls abcdocker/ceph-bak.img
    SNAPID NAME               SIZE   PROTECTED TIMESTAMP
        10 all_bak_2022-03-10 10 GiB           Mon Mar 14 14:04:33 2022
    
    #如果不删除快照名称,会提示我们恢复的快照已经存在
    [root@ceph-01 mnnt]# rbd import-diff /root/ceph_new_v1.img abcdocker/ceph-bak.img   #执行恢复
    Importing image diff: 100% complete...done.
    [root@ceph-01 mnnt]# rbd snap ls abcdocker/ceph-bak.img
    SNAPID NAME               SIZE   PROTECTED TIMESTAMP
        10 all_bak_2022-03-10 10 GiB           Mon Mar 14 14:04:33 2022
        13 new_v1             10 GiB           Mon Mar 14 14:36:36 2022
    
    #接下来我们重新mount
    [root@ceph-01 ~]# umount -lf /mnnt/
    [root@ceph-01 ~]# mount /dev/rbd1 /mnnt
    [root@ceph-01 ~]# cd /mnnt/

    数据如下图Ceph RBD 备份与恢复-每日运维
    下面说一下如何恢复到新的镜像名称中
    目前我们将ceph-bak.img镜像做了全备和增量备份,我们现在需要将这块镜像恢复到一个名为ceph-bak-new.img中

    [root@ceph-01 mnnt]# rbd snap ls abcdocker/ceph-bak.img
    SNAPID NAME               SIZE   PROTECTED TIMESTAMP
        10 all_bak_2022-03-10 10 GiB           Mon Mar 14 14:04:33 2022
        13 new_v1             10 GiB           Mon Mar 14 14:36:36 2022
    
    #导出文件我们依旧采用之前的
    [root@ceph-01 mnnt]# ll -h /root/ceph-bak_all_bak_2022-03-10.img
    -rw-r--r-- 1 root root 10G Mar 14 14:05 /root/ceph-bak_all_bak_2022-03-10.img
    [root@ceph-01 mnnt]# ll -h /root/ceph_new_v1.img
    -rw-r--r-- 1 root root 44M Mar 14 14:10 /root/ceph_new_v1.img

    开始恢复数据,需要先恢复全量数据

    [root@ceph-01 mnnt]# rbd import /root/ceph-bak_all_bak_2022-03-10.img abcdocker/ceph-bak-new.img   #恢复全备文件
    Importing image: 100% complete...done.
    
    #接下来开始恢复增量备份
    [root@ceph-01 mnnt]# rbd import-diff /root/ceph_new_v1.img abcdocker/ceph-bak-new.img
    Importing image diff: 100% complete...done.

    此时我们可以看一下新镜像的快照

    [root@ceph-01 mnnt]# rbd snap ls abcdocker/ceph-bak-new.img
    SNAPID NAME   SIZE   PROTECTED TIMESTAMP
        14 new_v1 10 GiB           Mon Mar 14 14:43:31 2022
    
    #这里只包含一个增量的备份,因为这个系统是基于全量备份,所以看不到全量的镜像

    接下来我们进行映射挂载

    [root@ceph-01 mnnt]# rbd device map abcdocker/ceph-bak-new.img
    /dev/rbd2
    [root@ceph-01 mnnt]#
    [root@ceph-01 mnnt]# mkdir /new
    [root@ceph-01 mnnt]# mount /dev/rbd2 /new

    数据如下
    Ceph RBD 备份与恢复-每日运维
    我们可以看一下挂载点,数据是一模一样的

    [root@ceph-01 new]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda3        50G  2.6G   48G   6% /
    devtmpfs        1.9G     0  1.9G   0% /dev
    tmpfs           1.9G     0  1.9G   0% /dev/shm
    tmpfs           1.9G  8.6M  1.9G   1% /run
    tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
    tmpfs           1.9G   24K  1.9G   1% /var/lib/ceph/osd/ceph-0
    tmpfs           1.9G   24K  1.9G   1% /var/lib/ceph/osd/ceph-3
    tmpfs           380M     0  380M   0% /run/user/1000
    /dev/rbd1       9.8G   37M  9.2G   1% /mnnt    #旧镜像
    /dev/rbd2       9.8G   37M  9.2G   1% /new    #新镜像
    
    [root@ceph-01 new]# rbd device ls
    id pool      namespace image            snap device
    1  abcdocker           ceph-bak.img     -    /dev/rbd1     #旧
    2  abcdocker           ceph-bak-new.img -    /dev/rbd2   #新

    相关文章:

    1. Ceph-deploy 快速部署Ceph集群
    2. Ceph OSD扩容与缩容
    3. Ceph集群日常使用命令
    4. Golang基础知识笔记