RBD备份与恢复

半兽人 发表于: 2023-12-29   最后更新时间: 2024-01-17 16:40:52  
{{totalSubscript}} 订阅, 1,163 游览

RBD备份分为两种:

  • 一种是全备
  • 另外一种是增量备份

RBD全备

全备操作 export 命令。

这里我创建一个快照,并且将快照导出成一个单独的镜像。然后我们挂载上去使用。

查看我们所有的镜像

# rbd -p kubernetes ls
ceph-temp.img
...

查看当前快照列表

# rbd snap ls kubernetes/ceph-temp.img
SNAPID  NAME  SIZE    PROTECTED  TIMESTAMP               
    13  temp  10 GiB             Wed Jan 17 10:50:23 2024

创建快照

# rbd snap create kubernetes/ceph-temp.img@bak_2024-01-17

执行export导出

# rbd export kubernetes/ceph-temp.img@bak_2024-01-17 /root/ceph-bak.img
Exporting image: 100% complete...done.

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

RBD全量数据恢复

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

# umount /mnnt

恢复RBD备份 import

# rbd import /root/ceph-bak.img kubernetes/ceph-bak.img
Importing image: 100% complete...done.

# rbd -p kubernetes ls
ceph-bak.img

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

# rbd device map kubernetes/ceph-bak.img
/dev/rbd5
# mount /dev/rbd5 /mnnt

RBD增量备份

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

RBD增量备份

增量备份使用的参数为export-diff

首先我们先创建增量的快照

[root@ceph-01 ~]# rbd device map kubernetes/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文件添加全量备份

# rbd snap create kubernetes/ceph-bak.img@all_bak_2024-01-17   # 创建快照
# rbd snap ls kubernetes/ceph-bak.img   #查看快照
SNAPID  NAME                SIZE    PROTECTED  TIMESTAMP               
    15  all_bak_2024-01-17  10 GiB             Wed Jan 17 15:20:08 2024
# rbd export kubernetes/ceph-bak.img@all_bak_2024-01-17 /root/ceph-bak_all_bak_2024-01-17.img   #导出快照
Exporting image: 100% complete...done.
# ll /root/ceph-bak_all_bak_2024-01-17.img -h  #查看快照大小,目前快照大写10个G
-rw-r--r-- 1 root root 10G Jan 17 15:21 /root/ceph-bak_all_bak_2024-01-17.img

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

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

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

# 增量备份也是要添加快照,我们在创建一个快照
# rbd snap ls kubernetes/ceph-bak.img
SNAPID  NAME                SIZE    PROTECTED  TIMESTAMP               
    17  all_bak_2024-01-17  10 GiB             Wed Jan 17 15:24:04 2024
# rbd snap create kubernetes/ceph-bak.img@new_v1   #新new_v1快照
# rbd snap ls kubernetes/ceph-bak.img   #查看所有快照
SNAPID  NAME                SIZE    PROTECTED  TIMESTAMP               
    17  all_bak_2024-01-17  10 GiB             Wed Jan 17 15:24:04 2024
    18  new_v1              10 GiB             Wed Jan 17 15:25:54 2024

目前all_bak_2024-01-17为全量的快照,new_v1为增量备份的快照。

接下来导出快照:

# rbd export-diff kubernetes/ceph-bak.img@new_v1 /root/ceph_new_v1.img   #导出增量备份文件
Exporting image: 100% complete...done.
# ls -lh /root/ceph_new_v1.img   #查看增量备份文件
-rw-r--r-- 1 root root 18M Jan 17 15:26 /root/ceph_new_v1.img

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

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

RBD增量数据恢复

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

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

数据恢复可以恢复新的镜像中,也可以在原有的镜像恢复

恢复到老的镜像名称中

下面我们将RBD增量备份生成的.log文件删除,然后使用import-diff命令实现增量恢复。

我这里演示的是在全量数据没有受影响的情况下,只删除增量备份前的数据进行恢复

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

执行增量恢复

# rbd -p kubernetes ls   #确认需要恢复镜像
kubernetes-rbd.img
ceph-bak.img
ceph-temp.img
ceph-test-01.img
ceph-test-02.img
ceph-test-03.img
ceph-trash.img

# rbd snap ls kubernetes/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恢复到kubernetes/ceph-bak.img镜像中

目前的文件夹:

# ls /mnnt/
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 snap rm kubernetes/ceph-bak.img@new_v1
Removing snap: 100% complete...done.
# rbd snap ls kubernetes/ceph-bak.img
SNAPID  NAME                SIZE    PROTECTED  TIMESTAMP               
    17  all_bak_2024-01-17  10 GiB             Wed Jan 17 15:24:04 2024

# 如果不删除快照名称,会提示我们恢复的快照已经存在
# rbd import-diff /root/ceph_new_v1.img kubernetes/ceph-bak.img   #执行恢复
Importing image diff: 100% complete...done.

# rbd snap ls kubernetes/ceph-bak.img
SNAPID  NAME                SIZE    PROTECTED  TIMESTAMP               
    17  all_bak_2024-01-17  10 GiB             Wed Jan 17 15:24:04 2024
    22  new_v1              10 GiB             Wed Jan 17 15:40:13 2024

# 接下来我们重新mount
[root@ceph-01 ~]# umount -lf /mnnt/
[root@ceph-01 ~]# mount /dev/rbd6 /mnnt
[root@ceph-01 ~]# cd /mnnt/

可以看到,删除的.log都回来啦:

# ls /mnnt
1.log    11.log   120.log  131.log  142.log  153.log  164.log  175.log  186.log  197.log  27.log  38.log  49.log  6.log   70.log  81.log  92.log
10.log   110.log  121.log  132.log  143.log  154.log  165.log  176.log  187.log  198.log  28.log  39.log  5.log   60.log  71.log  82.log  93.log
100.log  111.log  122.log  133.log  144.log  155.log  166.log  177.log  188.log  199.log  29.log  4.log   50.log  61.log  72.log  83.log  94.log
101.log  112.log  123.log  134.log  145.log  156.log  167.log  178.log  189.log  2.log    3.log   40.log  51.log  62.log  73.log  84.log  95.log
...

恢复到新的镜像名称中

目前我们将ceph-bak.img镜像做了全备和增量备份,我们现在需要将这块镜像恢复到一个名为ceph-bak-new.img中

# rbd snap ls kubernetes/ceph-bak.img
SNAPID  NAME                SIZE    PROTECTED  TIMESTAMP               
    17  all_bak_2024-01-17  10 GiB             Wed Jan 17 15:24:04 2024
    26  new_v1              10 GiB             Wed Jan 17 15:44:44 2024

# 导出文件我们依旧采用之前的
# ll -h /root/ceph-bak_all_bak_2024-01-17.img
-rw-r--r-- 1 root root 10G Mar 14 14:05 /root/ceph-bak_all_bak_2022-03-10.img
# ll -h /root/ceph_new_v1.img
-rw-r--r-- 1 root root 18M Jan 17 15:43 /root/ceph_new_v1.img

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

# rbd import /root/ceph-bak_all_bak_2024-01-17.img kubernetes/ceph-bak-new.img   #恢复全备文件
Importing image: 100% complete...done.

# 接下来开始恢复增量备份
# rbd import-diff /root/ceph_new_v1.img kubernetes/ceph-bak-new.img
Importing image diff: 100% complete...done.

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

# rbd snap ls kubernetes/ceph-bak-new.img
SNAPID  NAME    SIZE    PROTECTED  TIMESTAMP               
    27  new_v1  10 GiB             Wed Jan 17 16:20:19 2024
# 这里只包含一个增量的备份,因为这个系统是基于全量备份,所以看不到全量的镜像

接下来我们进行映射挂载

# rbd device map kubernetes/ceph-bak-new.img
/dev/rbd2

# mkdir /new
# mount /dev/rbd2 /new

数据如下

# ls /new
1.log    11.log   120.log  131.log  142.log  153.log  164.log  175.log  186.log  197.log  27.log  38.log  49.log  6.log   70.log  81.log  92.log
10.log   110.log  121.log  132.log  143.log  154.log  165.log  176.log  187.log  198.log  28.log  39.log  5.log   60.log  71.log  82.log  93.log
100.log  111.log  122.log  133.log  144.log  155.log  166.log  177.log  188.log  199.log  29.log  4.log   50.log  61.log  72.log  83.log  94.log
101.log  112.log  123.log  134.log  145.log  156.log  167.log  178.log  189.log  2.log    3.log   40.log  51.log  62.log  73.log  84.log  95.log
...

我们可以看一下挂载点,数据是一模一样的:

# df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/rbd1       9.8G   37M  9.2G   1% /mnnt    # 旧镜像
/dev/rbd2       9.8G   37M  9.2G   1% /new     # 新镜像

# rbd device ls
id pool      namespace image            snap device
1  kubernetes           ceph-bak.img     -    /dev/rbd1     #旧
2  kubernetes           ceph-bak-new.img -    /dev/rbd2     #新
更新于 2024-01-17
在线,25分钟前登录

查看ceph更多相关的文章或提一个关于ceph的问题,也可以与我们一起分享文章