ceph RBD的导出导入和数据恢复

2024-01-21 18:40

本文主要是介绍ceph RBD的导出导入和数据恢复,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

K8S的pod使用pvc挂载ceph RBD块(不映射到目录)

ceph RBD数据恢复思路:

方法一:快照做文件备份,导入导出
1、为RBD image创建快照:rbd snap create
2、将快照导出成文件备份
(1)全量导出:rbd export
(2)增量导出:rbd export-diff
3、将备份文件导入为新的RBD image
(1)全量导入:rbd import(与 “全量导出” 相对应)
(2)增量导入:rbd import-diff(与 “增量导出” 相对应)
4、利用new RBD image替换old RBD image,实现数据的恢复
方法二:用rbd rollback方式恢复
(1)为RBD image创建快照:rbd snap create
(2)使用rbd rollback将快照恢复
执行完rbd rollback后,检查pod中的目录,数据并没有恢复。
猜想可能需要重新挂载image,于是将pv删除,再重建,但是pv重建报错数据丢失,无法重建。
疑问:rbd rollback应该怎么使用呢?

方法二 并未走通,本文介绍方法一的操作步骤

1、 创建快照

1、查看pod使用的哪个RBD image:pod → pvc → pv → RBD image

Source.VolumeAttributes.pool 是pool的名字
Source.VolumeAttributes.imageName是image的名字

bglab@node4:~/csz/rook/cluster/examples/kubernetes$ kubectl describe pv pvc-f761d767-a658-40a6-b841-b6f43256f904
Name:            pvc-f761d767-a658-40a6-b841-b6f43256f904
Labels:          <none>
Annotations:     pv.kubernetes.io/provisioned-by: rook-ceph.rbd.csi.ceph.com
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    rook-ceph-block
Status:          Bound
Claim:           default/busybox-pvc
Reclaim Policy:  Delete
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        2Gi
Node Affinity:   <none>
Message:
Source:Type:              CSI (a Container Storage Interface (CSI) volume source)Driver:            rook-ceph.rbd.csi.ceph.comVolumeHandle:      0001-0009-rook-ceph-0000000000000002-387b2608-61f7-11eb-b9c5-0e28ddb26a3cReadOnly:          falseVolumeAttributes:      clusterID=rook-cephimageFeatures=layeringimageFormat=2imageName=csi-vol-387b2608-61f7-11eb-b9c5-0e28ddb26a3cjournalPool=replicapoolpool=replicapoolradosNamespace=storage.kubernetes.io/csiProvisionerIdentity=1611017763643-8081-rook-ceph.rbd.csi.ceph.com
Events:                <none>
2、 创建快照V1

(1)进入pod,在pod挂载对应RBD image的目录中,新增文件csz_ceph.txt

kubectl -n default exec -it deploy/csz-busybox-deployment sh
echo 'test' >> csz_ceph.txt

结果如下:
![]https://g-rGbog.csdnWg.cn/2027710129094201572.3)(d)]

(2)创建快照v1

[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd snap create replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c@v1
[root@rook-ceph-tools-6f5694c655-hzpj5 /]#
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd snap ls replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c
SNAPID  NAME  SIZE   PROTECTED  TIMESTAMP4  v1    2 GiB             Fri Jan 29 01:13:33 2021
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd showmapped
id  pool         namespace  image                                         snap  device
0   replicapool             csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c  -     /dev/rbd0
3、 创建快照V2

(1)进入pod,在pod挂载对应RBD image的目录中,新增文件aaa.txt

kubectl -n default exec -it deploy/csz-busybox-deployment sh
echo 'pretty girl' >> aaa.txt

结果如下:
在这里插入图片描述
(2)创建快照v2

[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd snap create replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c@v2
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd snap ls replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c
SNAPID  NAME  SIZE   PROTECTED  TIMESTAMP4  v1    2 GiB             Fri Jan 29 01:13:33 20215  v2    2 GiB             Fri Jan 29 01:21:32 2021
[root@rook-ceph-tools-6f5694c655-hzpj5 /]#
4、创建快照V3

(1)进入pod,在pod挂载对应RBD image的目录中,新增文件aaa.txt

kubectl -n default exec -it deploy/csz-busybox-deployment sh
echo 'handsome boy' >> boy

结果如下:
在这里插入图片描述
(2)创建快照v3

[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd snap create replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c@v3
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd snap ls replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c
SNAPID  NAME  SIZE   PROTECTED  TIMESTAMP4  v1    2 GiB             Fri Jan 29 01:13:33 20215  v2    2 GiB             Fri Jan 29 01:21:32 20216  v3    2 GiB             Fri Jan 29 01:22:31 2021

2、 将RBD image的快照导出成文件

2.1增量导出:rbd export-diff

#这个命令是导出了从开始创建image到快照v1那个时间点的差异数据,导出成本地文件csz-busybox-v1
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd export-diff replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c@v1 csz-busybox-v1
Exporting image: 100% complete...done.
#这个命令是导出了从快照v1那个时间点到快照v3那个时间点的差异数据,导出成本地文件csz-busybox-v1-v3
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd export-diff replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c@v3 --from-snap v1 csz-busybox-v1-v3
Exporting image: 100% complete...done.
#导出了从image创建到当前的时间点的差异数据,导出成本地文件csz-busybox-now(相当于 全量导出)
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd export-diff replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c csz-busybox-now
Exporting image: 100% complete...done.
从image创建到当前的时间点的差异数据。

2.2 全量导出:rbd export

(1)进入pod,在pod挂载对应RBD image的目录中,新增文件aaa.txt

kubectl -n default exec -it deploy/csz-busybox-deployment sh
echo 'handsome boy1' >> boy1

结果如下:
在这里插入图片描述
(2)全量导出

[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd export replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c csz-busybox-full
Exporting image: 100% complete...done.

3、 快照导出的文件导入为新的RBD image

快照的恢复过程使用的是刚刚上面提到的备份到本地的那些文件.
现在假如想恢复到v3那个快照的时间点,那么可以用两个方法
方法1:直接基于v3的时间点的快照做恢复
方法2:直接基于v1的时间点的数据,和后面的增量的v1-v3数据(要按顺序导入)

3.1增量导入:rbd import-diff

#方法1:直接基于v3的时间点的快照做恢复
#首先随便创建一个image,名称大小都不限制,因为后面恢复的时候会覆盖掉大小的信息
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd create replicapool/resume-v1 --size 1    
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd import-diff csz-busybox-v3 replicapool/resume-v1                                          Importing image diff: 100% complete...done.
[root@rook-ceph-tools-6f5694c655-hzpj5 /]#
#方法2: 基于v1+ v1_v3数据恢复
#首先随便创建一个image,名称大小都不限制,因为后面恢复的时候会覆盖掉大小的信息
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd create replicapool/resume-v3 --size 1
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd import-diff csz-busybox-v1 replicapool/resume-v3
Importing image diff: 100% complete...done.
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd import-diff csz-busybox-v1-v3 replicapool/resume-v3

​ 实际项目当中就是,定期做快照,然后导出某个时间点快照的数据,然后导出增量的快照的数据,就可以了

3.2全量导入:rbd import

:不用提前创建目标image,否则rbd import会报错

[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd create replicapool/resume-full --size 1
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd import-diff csz-busybox-full replicapool/resume-full
rbd: invalid or unexpected diff banner
rbd: import-diff failed: (22) Invalid argument
[root@rook-ceph-tools-6f5694c655-hzpj5 /]#
[root@rook-ceph-tools-6f5694c655-hzpj5 /]#
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd import csz-busybox-full replicapool/resume-full
rbd: image creation failed
Importing image: 0% complete...failed.
rbd: import failed: 2021-01-29T02:11:56.790+0000 7fdfdcb4b500 -1 librbd: rbd image resume-full already exists
(17) File exists
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd import csz-busybox-full replicapool/resume-full1
Importing image: 100% complete...done.
[root@rook-ceph-tools-6f5694c655-hzpj5 /]#

在这里插入图片描述
四、如何利用这个
实际项目当中就是,定期做快照,然后导出某个时间点快照的数据,然后导出增量的快照的数据,就可以了,例如:
今天对所有的rbd的image做一个基础快照,然后导出这个快照的数据,然后从今天开始,每天晚上做一个快照,然后导出快照时间点之间的数据,这样每天导出来的就是一个增量的数据了,在做恢复的时候,就从第一个快照导入,然后按顺序导入增量的快照即可,也可以定期做一个快照,导出完整的快照数据,以防中间的增量快照漏了,然后就是要注意可以定期清理快照,如果是做备份的模式,在导入了快照数据后,也可以清理一些本地的数据,本地数据做异地机房复制的时候也可以做一下数据的压缩,来减少数据量的传输

客户端验证:将RBD image恢复到pod

思路:将新的image name重命名rename成原来的image name

删除旧的image
# Step1:停掉pod对image的使用
修改pod的yaml文件,将spec: replicas: 副本数改为0
# Step2:清空旧image的snapshots
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd snap purge replicapool/csi-vol-387b2608-61f7-11eb-b9c5-0e28ddb26a3c
Removing all snapshots: 100% complete...done.
# Step3:删除旧的image
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd rm replicapool/csi-vol-387b2608-61f7-11eb-b9c5-0e28ddb26a3c
Removing image: 100% complete...done.
将new image name重命名为old image name
[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd rename replicapool/test-v3 replicapool/csi-vol-387b2608-61f7-11eb-b9c5-0e28ddb26a3c
启动pod
修改pod的yaml文件,将spec: replicas: 副本数由0改回原值

FAQ:

rbd 删除image时,报错“rbd: image has snapshots - these must be deleted with ‘rbd snap purge’ before the image can be removed”

[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd rm replicapool/csi-vol-387b2608-61f7-11eb-b9c5-0e28ddb26a3c
Removing image: 0% complete...failed.
rbd: image has snapshots - these must be deleted with 'rbd snap purge' before the image can be removed.

解决方法:执行’rbd snap purge’删掉image相关snapshots

rbd 删除image时,报错“rbd: error: image still has watchers”

[root@rook-ceph-tools-6f5694c655-hzpj5 /]# rbd rm replicapool/csi-vol-6ee1b63a-6060-11eb-b9c5-0e28ddb26a3c
2021-01-29T06:22:09.698+0000 7fe4677fe700 -1 librbd::image::PreRemoveRequest: 0x55a645137470 check_image_watchers: image has watchers - not removing
Removing image: 0% complete...failed.
rbd: error: image still has watchers
This means the image is still open or the client using it crashed. Try again after closing/unmapping it or waiting 30s for the crashed client to timeout.

解决方法:删除使用image的pod(修改pod的yaml文件,将spec: replicas: 副本数改为0)

这篇关于ceph RBD的导出导入和数据恢复的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/630485

相关文章

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

Java实现TXT文件导入功能的详细步骤

《Java实现TXT文件导入功能的详细步骤》在实际开发中,很多应用场景需要将用户上传的TXT文件进行解析,并将文件中的数据导入到数据库或其他存储系统中,本文将演示如何用Java实现一个基本的TXT文件... 目录前言1. 项目需求分析2. 示例文件格式3. 实现步骤3.1. 准备数据库(假设使用 mysql

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南

《SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南》本文将基于开源项目springboot-easyexcel-batch进行解析与扩展,手把手教大家如何在SpringBo... 目录项目结构概览核心依赖百万级导出实战场景核心代码效果百万级导入实战场景监听器和Service(核心