輕鬆整合系列二:如何在 KubeBlocks 中建立備份並恢復?以 Oracle MySQL 為例

小猿姐聊技術發表於2023-12-27

本文以 Oracle MySQL 為例,介紹如何在 KubeBlocks 中建立備份並恢復。

根據不同的分類方式,我們可以將備份分為多種型別。從方式上,可以分為卷快照備份和檔案備份;從內容上,可以分為資料備份和日誌備份;從量上,可分為全量備份和增量備份;從時間上,可以分為定時備份和按需備份等等。

本文將介紹如何在 KubeBlocks 上實現最常見的全量快照備份和檔案備份。

前提條件

  1. 瞭解 K8s 基本概念,例如 Pod、PVC、PV、VolumeSnapshot 等

  2. 完成 Tutorial 1

  3. 瞭解 KubeBlocks 中備份相關的常見概念

Table 1. Terminology

Name Description Scope
Backup 備份物件:備份物件的實體。 Namespace
BackupPolicy 備份策略:BackupPolicy 定義了各種備份型別的相關策略, 比如排程、備份保留時間、使用哪種備份工具。 Namespace
BackupTool 備份工具:BackupTool 是 KB 中備份工具的載體,每個 BackupTool 都應該實現對應備份工具的備份邏輯和恢復邏輯。 Cluster
BackupPolicyTemplate 備份策略模版:BackupPolicyTemplate 是備份跟 ClusterDefinition 結合的橋樑。當建立 Cluster 的時候,KubeBlocks 會根據 BackupPolicyTemplate 自動為每個 Cluster 物件生成一個預設的備份策略。 Cluster

Table 1. 展示了 KubeBlocks 中備份相關的常見概念,之後我們會透過示例說明它們的作用和使用方法。

配置環境

首先,明確兩個前提:

  • 快照備份依賴 Kubernetes 的卷快照能力。

  • 檔案備份依賴各個資料庫引擎的備份工具。

1. 安裝CSI Driver

因為卷快照只支援  CSI Driver,確保你的 Kubernetes 已經正確配置。 如果在本地環境,你可以透過 KubeBlocks Addon 功能快速安裝 csi-host-driver:

kbcli addon enable csi-hostpath-driver

如果是雲環境, 需要根據各個雲環境配置相應的 CSI Driver。

2. 將該 storeclass 設定為預設值,方便後續建立 cluster

 kubectl get sc                                                                            
NAME                        PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
csi-hostpath-sc (default)   hostpath.csi.k8s.io     Delete          WaitForFirstConsumer   true                   35s

指定卷型別

在 ClusterDefinition 中指定卷型別 [必須配置]。

  componentDefs:
    - name: mysql-compdef
      characterType: mysql
      workloadType: Stateful
      service:
        ports:
          - name: mysql
            port: 3306
            targetPort: mysql
      volumeTypes:
        - name: data
          type: data

volumeTypes 用於說明卷型別和卷名稱。 卷型別(volumeTypes.type)分為兩種:

  • Data: 資料資訊

  • Log: 日誌資訊

KubeBlocks 支援對資料和日誌的不同備份方式。在這裡,我們只配置了資料卷的資訊。

新增備份配置

我們需要準備兩個檔案  BackupPolicyTemplate 和  BackupTool

BackupPolicy Template

這是備份策略的模版,主要描述:

  1. 為 Cluster 的哪個元件備份

  2. 是否定時備份

  3. 快照備份怎麼設定

  4. 檔案備份怎麼設定

apiVersion: apps.kubeblocks.io/v1alpha1
kind: BackupPolicyTemplate
metadata:
  name: oracle-mysql-backup-policy-template
  labels:
    clusterdefinition.kubeblocks.io/name: oracle-mysql # 透過 label 指定作用域,必須填
spec:
  clusterDefinitionRef: oracle-mysql  # 指定作用域,是哪個 ClusterDef 生成的叢集
  backupPolicies:
  - componentDefRef: mysql-compdef    # 指定作用域,是哪一個元件相關的
    schedule:                         # schedule 用於指定定時備份時間和啟動情況
      snapshot:
        enable: true                  # 啟動定時快照備份
        cronExpression: "0 18 * * *"
      datafile:                       # 禁用定時檔案備份
        enable: false
        cronExpression: "0 18 * * *"        
    snapshot:                         # 快照備份,預設保留最新的 5 個版本
      backupsHistoryLimit: 5
    datafile:                         # 資料檔案備份,依賴備份工具
      backupToolName: oracle-mysql-xtrabackup

如果啟用了定時任務,KubeBlocks 會在後臺建立一個 CronJob。

當一個新的叢集建立後,會透過  clusterdefinition.kubeblocks.io/name 標籤來查詢對應的 template 名,並建立相應的 BackupPolicy。

如果你成功新增了 BackupPolicyTemplate,但是新建的 Cluster 沒有預設的 BackupPolicy,請檢查:
ClusterDefinionRef 是否正確
BackupPolicyTempte 的 lable 是否正確
是否有多個關聯的 BackupPolicyTemplate
如果是,需要透過annotation標記其中一個為預設模板
annotations:
dataprotection.kubeblocks.io/is-default-policy-template:"true"

BackupTool

描述備份工具的具體執行邏輯,主要服務於檔案備份(datafile),包括:

  1. 備份工具 image

  2. backup 的指令碼

  3. restore 的指令碼

apiVersion: dataprotection.kubeblocks.io/v1alpha1
kind: BackupTool
metadata:
  name: oracle-mysql-xtrabackup
  labels:
spec:
  image: docker.io/perconalab/percona-xtrabackup:8.0.32  #透過xtrabackup備份
  env:                         # 注入依賴的環境變數名稱
    - name: DATA_DIR
      value: /var/lib/mysql
  physical:
    restoreCommands:           # restore 命令
      - sh
      - -c
      ...
  backupCommands:             # backup 命令
    - sh
    - -c
    ...

BackupTool 的配置和備份工具強相關。

比如我們這裡使用 Percona Xtrabackup 工具備份,我們需要在  backupCommand 和  restoreCommands 中填寫指令碼。

BackupTool 主要是為檔案備份服務。如果你只需要快照備份,不需要檔案備份,不需要配置  BackupTool

備份/還原叢集

一切就緒,我們來試試如何備份和還原一個叢集。

1. 建立叢集

helm install mysql ./path-to-your-helm-chart/oracle-mysql
kbcli cluster create mycluster --cluster-definition oracle-mysql

因為我們新增了  BackupPolicyTemplate,叢集建立後,KubeBlocks 會發現為該叢集建立了  BackupPolicy,可用一下命令檢視:

kbcli cluster list-backup-policy mycluster

2. 快照備份

kbcli cluster backup mycluster --type snapshot

type 指定了備份型別,是 Snapshot 還是 datafile。

如果有多個備份策略,可以透過 --policy flag 指定。

3. 檔案備份

KubeBlocks 支援備份到本地和雲上物件儲存。這裡展示如何備份到本地的流程。

(1)修改 backuppolicy,指定 pvc 名稱

如下 line 37,你需要指定備份 pvc 的名稱。

 32 spec:
 33   datafile:
 34     backupToolName: oracle-mysql-xtrabackup
 35     backupsHistoryLimit: 7
 36     persistentVolumeClaim:
 37       name: mycluster-backup-pvc
 38       createPolicy: IfNotPresent
 39       initCapacity: 20Gi

(2)執行備份命令, 將 --type 設定為 datafile

kbcli cluster backup mycluster  --type datafile

4. 從備份建立叢集

(1)先檢視備份

kbcli cluster list-backups

(2)選擇一個備份,透過備份建立叢集

kbcli cluster restore <clusterName> --backup <backup-name>

很快一個新的叢集就建立出來了。

⚠️ 需要注意的是,某些資料庫只有在第一次初始化的時候才建立 root 賬號和密碼。
因此我們透過備份還原出來的資料庫叢集,雖然在流程上建立了新的 root 賬號和密碼,但是並沒有生效,還需要透過原叢集的 root 賬號和密碼登入。

總結

本文透過一個簡短的示例展示了 KubeBlocks 中備份策略的配置。

希望能幫助大家對 KubeBlocks 的備份&還原功能有一個基本的瞭解。

Appendix

A.1 叢集資料保護策略

KubeBlocks 對有狀態的叢集提供了資料保護策略,不同策略提供了不同的資料方式。

可以試一下下列場景:

  1. 如果我們透過  kbcli cluster delete 刪除了叢集,我們的備份還在嗎?

  2. 如果把 cluster 的  terminationPolicy 改為  WipeOut,再刪除,備份還在嗎?

  3. 如果把 cluster 的  terminationPolicy 改為  DoNotTerminate,再刪除,會發生什麼?

A.2 檢視備份資訊

在 Section 4,我們透過 backup 子命令建立備份。

kbcli cluster backup mycluster  --type snapshot

我們會看到新生成了一個備份物件,並可以透過  describe-backup 子命令檢視更多資訊:

kbcli cluster describe-backup <your-back-up-name>


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70035809/viewspace-3001737/,如需轉載,請註明出處,否則將追究法律責任。

相關文章