當雲端硬碟非預期刪除導致資料丟失時,您可以通過ESSD類型雲端硬碟資料卷的自動極速快照功能,實現資料的快速恢複,以保證儲存資料的安全性。本文介紹如何使用ESSD雲端硬碟的自動極速快照功能實現雲端硬碟儲存資料安全。
前提條件
使用情境
雲端硬碟非預期刪除導致的資料丟失
雲端硬碟回收策略為Delete模式,您在刪除PVC時,PV和雲端硬碟將同時被刪除。當您誤刪除了某個雲端硬碟時,您需要通過已建立的雲端硬碟快照將資料恢複到指定的時間點。若雲端硬碟快照不存在或快照建立後雲端硬碟有新資料寫入,都將導致雲端硬碟儲存資料丟失。
為保護業務資料,Container ServiceACK提供ESSD類型雲端硬碟資料卷刪除前的自動極速快照功能,將建立的雲端硬碟快照保留一段時間,用於恢複雲端硬碟非預期刪除的資料。
使用效果
非預期刪除雲端硬碟時,能通過雲端硬碟極速快照完整地恢複資料。
雲端硬碟極速快照秒級建立,降低了刪除操作所需的時間。
說明極速快照僅支援ESSD類型雲端硬碟使用。
配置要求
CSI-Provisioner組件配置
執行以下命令,將kube-system命名空間下CSI-Provisioner的containers欄位添加env配置:VOLUME_DEL_AUTO_SNAP: "true"
。
kubectl patch deploy csi-provisioner -n kube-system -p '{"spec":{"template":{"spec":{"containers":[{"name":"csi-provisioner","env":[{"name":"VOLUME_DEL_AUTO_SNAP","value":"true"}]}]}}}}'
僅在VOLUME_DEL_AUTO_SNAP
為true
時,允許使用ESSD雲端硬碟刪除前自動建立極速快照功能。
叢集儲存類配置
使用以下模板配置叢集的儲存類。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-datasafe-essd
provisioner: diskplugin.csi.alibabacloud.com
parameters:
type: cloud_essd
volumeDeleteSnapshotRetentionDays: "3" # 該設定僅在reclaimPolicy為"Delete"時生效。
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
allowVolumeExpansion: true
參數 | 說明 |
volumeDeleteSnapshotRetentionDays | 定義ESSD雲端硬碟刪除前自動建立極速快照的保留時間,單位:天。 該欄位為空白時,不能使用建立極速快照功能,所以建議您在使用時配置該參數值。 |
自動建立極速快照
本文以有狀態應用MySQL為例,介紹雲端硬碟在雲端硬碟誤刪除資料導致資料丟失的情境下,如何使用ESSD類型雲端硬碟自動建立極速快照功能保護並恢複資料。
使用以下內容,建立mysql.yaml檔案。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: essd-pvc namespace: autosnapshot spec: accessModes: - ReadWriteOnce resources: requests: storage: 25Gi storageClassName: alicloud-datasafe-essd # 使用叢集儲存類最佳實務配置。 --- apiVersion: v1 kind: Secret metadata: name: mysql-pass namespace: autosnapshot type: Opaque data: username: dGVzdDEK password: dGVzdDEtdmFsdWUK --- apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql-sts namespace: autosnapshot spec: selector: matchLabels: app: mysql-sts serviceName: mysql-sts template: metadata: labels: app: mysql-sts spec: containers: - name: mysql-sts image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 80 name: mysql-sts volumeMounts: - name: mysql mountPath: /var/lib/mysql subPath: mysql volumes: - name: mysql persistentVolumeClaim: claimName: essd-pvc
執行以下命令,部署MySQL應用。
kubectl apply -f mysql.yaml
執行以下命令,確認MySQL應用已掛載對應的雲端硬碟儲存卷。
kubectl get pvc -nautosnapshot | grep essd-pvc
預期輸出:
essd-pvc Bound d-2zeit7uza22vjya1**** 25Gi RWO alicloud-datasafe-essd 54s
其中,
d-2zeit7uza22vjya1****
為已掛載成功的ESSD雲端硬碟執行個體ID。執行以下命令,進入MySQL應用程式容器。
kubectl -n autosnapshot exec -it mysql-sts-0 -- /bin/sh
在容器Shell中執行以下命令,類比資料寫入。
dd if=/dev/urandom of=/var/lib/mysql/mysql/record.txt bs=1M count=1000
在容器Shell中執行以下命令,查看寫入資料的大小。
ls /var/lib/mysql/mysql -l | grep record
預期輸出:
-rw-r--r-- 1 root root 1048576000 Nov 8 02:36 record.txt
資料安全的雲端硬碟刪除
執行以下命令,將MySQL應用副本縮減為0。
kubectl scale sts/mysql-sts -n autosnapshot --replicas=0
執行以下命令,刪除MySQL應用所使用的PVC。
kubectl delete pvc essd-pvc -n autosnapshot
執行以下命令,查詢自動極速快照相關的叢集資源。
kubectl get volumesnapshot
預期輸出:
d-2zeit7uza22vjya1****-delprotect true d-2zeit7uza22vjya1****-delprotect-content 30Gi d-2zeit7uza22vjya1****-delprotect-content 6s 6s
部分參數說明如下。
d-2zeit7uza22vjya1****
:刪除的ESSD雲端硬碟執行個體ID,與essd-pvc刪除前綁定的雲端硬碟執行個體ID一致。d-2zeit7uza22vjya1****-delprotect
:對應極速快照的VolumeSnapshot名稱。d-2zeit7uza22vjya1****-delprotect-content
:對應極速快照的VolumeSnapshotContent名稱。
使用雲端硬碟刪除時建立的自動極速快照恢複資料
下面以使用資料安全的雲端硬碟刪除中建立的自動極速快照為例,介紹如何使用雲端硬碟刪除時建立的自動極速快照在應用中恢複資料。
極速快照的VolumeSnapshot預設位於default命名空間中,當應用部署在非default命名空間時,您需要在應用所在的命名空間中建立新的VolumeSnapshot資源用於恢複資料。本文MySQL應用樣本部署在autosnapshot命名空間中,您就需要在該空間中建立對應的VolumeSnapshot。
使用以下命令,查詢自動極速快照對應的VolumeSnapshotContent中snapshotHandle欄位的值。
kubectl get volumesnapshotcontent d-2zeit7uza22vjya1****-delprotect-content -oyaml | grep snapshotHandle
預期輸出:
snapshotHandle: s-2zegw6gmuc866xgc****
使用以下YAML內容,建立新的VolumeSnapshotContent,並預綁定即將建立的VolumeSnapshot。
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: datasafe-volumesnapshotcontent spec: deletionPolicy: Retain driver: diskplugin.csi.alibabacloud.com source: snapshotHandle: s-2zegw6gmuc866xgc**** # 源VolumeSnapshotContent中snapshotHandle欄位的值。 volumeSnapshotRef: name: datasafe-volumesnapshot # 即將建立的VolumeSnapshot名稱。 namespace: autosnapshot # MySQL應用所在命名空間。
使用以下YAML內容,在MySQL應用所在的命名空間中建立對應的VolumeSnapshot。
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: datasafe-volumesnapshot namespace: autosnapshot spec: source: volumeSnapshotContentName: datasafe-volumesnapshotcontent
使用以下YAML內容,根據自動極速快照名稱建立PVC。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: essd-pvc # 使用MySQL應用中定義的PVC名稱。 namespace: autosnapshot spec: accessModes: [ "ReadWriteOnce" ] storageClassName: alicloud-datasafe-essd resources: requests: storage: 30Gi dataSource: name: datasafe-volumesnapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io
執行以下命令,將MySQL應用副本恢複至1。
kubectl scale sts/mysql-sts -n autosnapshot --replicas=1
執行以下命令,確認PVC已成功綁定到MySQL應用中。
kubectl describe pvc essd-pvc -n autosnapshot | grep "Used By"
預期輸出:
Used By: mysql-sts-0
執行以下命令,進入MySQL應用程式容器。
kubectl -n autosnapshot exec -it mysql-sts-0 -- /bin/sh
執行以下命令,查看類比寫入的資料是否已經恢複。
ls /var/lib/mysql/mysql -l | grep record
預期輸出:
-rw-r--r-- 1 root root 1048576000 Nov 8 02:36 record.txt
預期輸出資料大小
1048576000
和MySQL應用中類比寫入資料的大小一致,說明資料已完成恢複。