1. 程式人生 > 其它 >ceph RBD的匯出匯入和資料恢復

ceph RBD的匯出匯入和資料恢復

技術標籤:ceph儲存K8S

背景

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的名字

[email protected]:~/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.com VolumeHandle: 0001-0009-rook-ceph-0000000000000002-387b2608-61f7-11eb-b9c5-0e28ddb26a3c ReadOnly: false VolumeAttributes: clusterID=rook-ceph imageFeatures=layering imageFormat=2 imageName=csi-vol-387b2608-61f7-11eb-b9c5-0e28ddb26a3c journalPool=replicapool pool=replicapool radosNamespace= 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

[[email protected] /]# rbd snap create replicapool/[email protected]
[[email protected] /]#
[[email protected] /]# rbd snap ls replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c
SNAPID  NAME  SIZE   PROTECTED  TIMESTAMP
     4  v1    2 GiB             Fri Jan 29 01:13:33 2021
[[email protected] /]# 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

[[email protected] /]# rbd snap create replicapool/[email protected]
[[email protected] /]# rbd snap ls replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c
SNAPID  NAME  SIZE   PROTECTED  TIMESTAMP
     4  v1    2 GiB             Fri Jan 29 01:13:33 2021
     5  v2    2 GiB             Fri Jan 29 01:21:32 2021
[[email protected] /]#

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

[[email protected] /]# rbd snap create replicapool/[email protected]
[[email protected] /]# rbd snap ls replicapool/csi-vol-e31e16b6-6069-11eb-b9c5-0e28ddb26a3c
SNAPID  NAME  SIZE   PROTECTED  TIMESTAMP
     4  v1    2 GiB             Fri Jan 29 01:13:33 2021
     5  v2    2 GiB             Fri Jan 29 01:21:32 2021
     6  v3    2 GiB             Fri Jan 29 01:22:31 2021

2、 將RBD image的快照匯出成檔案

2.1增量匯出:rbd export-diff

#這個命令是匯出了從開始建立image到快照v1那個時間點的差異資料,匯出成本地檔案csz-busybox-v1
[[email protected] /]# rbd export-diff replicapool/[email protected] csz-busybox-v1
Exporting image: 100% complete...done.
#這個命令是匯出了從快照v1那個時間點到快照v3那個時間點的差異資料,匯出成本地檔案csz-busybox-v1-v3
[[email protected] /]# rbd export-diff replicapool/[email protected] --from-snap v1 csz-busybox-v1-v3
Exporting image: 100% complete...done.
#匯出了從image建立到當前的時間點的差異資料,匯出成本地檔案csz-busybox-now(相當於 全量匯出)
[[email protected] /]# 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)全量匯出

[[email protected] /]# 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,名稱大小都不限制,因為後面恢復的時候會覆蓋掉大小的資訊
[[email protected] /]# rbd create replicapool/resume-v1 --size 1    
[[email protected] /]# rbd import-diff csz-busybox-v3 replicapool/resume-v1                                          Importing image diff: 100% complete...done.
[[email protected] /]#
#方法2: 基於v1+ v1_v3資料恢復
#首先隨便建立一個image,名稱大小都不限制,因為後面恢復的時候會覆蓋掉大小的資訊
[[email protected] /]# rbd create replicapool/resume-v3 --size 1
[[email protected] /]# rbd import-diff csz-busybox-v1 replicapool/resume-v3
Importing image diff: 100% complete...done.
[[email protected] /]# rbd import-diff csz-busybox-v1-v3 replicapool/resume-v3

​ 實際專案當中就是,定期做快照,然後匯出某個時間點快照的資料,然後匯出增量的快照的資料,就可以了

3.2全量匯入:rbd import

:不用提前建立目標image,否則rbd import會報錯

[[email protected] /]# rbd create replicapool/resume-full --size 1
[[email protected] /]# rbd import-diff csz-busybox-full replicapool/resume-full
rbd: invalid or unexpected diff banner
rbd: import-diff failed: (22) Invalid argument
[[email protected] /]#
[[email protected] /]#
[[email protected] /]# 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
[[email protected] /]# rbd import csz-busybox-full replicapool/resume-full1
Importing image: 100% complete...done.
[[email protected] /]#

在這裡插入圖片描述
四、如何利用這個
實際專案當中就是,定期做快照,然後匯出某個時間點快照的資料,然後匯出增量的快照的資料,就可以了,例如:
今天對所有的rbd的image做一個基礎快照,然後匯出這個快照的資料,然後從今天開始,每天晚上做一個快照,然後匯出快照時間點之間的資料,這樣每天匯出來的就是一個增量的資料了,在做恢復的時候,就從第一個快照匯入,然後按順序匯入增量的快照即可,也可以定期做一個快照,匯出完整的快照資料,以防中間的增量快照漏了,然後就是要注意可以定期清理快照,如果是做備份的模式,在匯入了快照資料後,也可以清理一些本地的資料,本地資料做異地機房複製的時候也可以做一下資料的壓縮,來減少資料量的傳輸

客戶端驗證:將RBD image恢復到pod

思路:將新的image name重新命名rename成原來的image name

刪除舊的image

# Step1:停掉pod對image的使用
修改pod的yaml檔案,將spec: replicas: 副本數改為0
# Step2:清空舊image的snapshots
[[email protected] /]# rbd snap purge replicapool/csi-vol-387b2608-61f7-11eb-b9c5-0e28ddb26a3c
Removing all snapshots: 100% complete...done.
# Step3:刪除舊的image
[[email protected] /]# rbd rm replicapool/csi-vol-387b2608-61f7-11eb-b9c5-0e28ddb26a3c
Removing image: 100% complete...done.

將new image name重新命名為old image name

[[email protected] /]# 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”

[[email protected] /]# 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”

[[email protected] /]# 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)