轻松集成系列二:如何在 KubeBlocks 中创建备份并恢复?以 Oracle MySQL 为例

本文以 Oracle MySQL 为例,介绍如何在 KubeBlocks 中创建备份并恢复(点击参考完整 PR)。

根据不同的分类方式,我们可以将备份分为多种类型。从方式上,可以分为卷快照备份和文件备份;从内容上,可以分为数据备份和日志备份;从量上,可分为全量备份和增量备份;从时间上,可以分为定时备份和按需备份等等。

本文将介绍如何在 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:

bash 复制代码
kbcli addon enable csi-hostpath-driver

如果是云环境, 需要根据各个云环境配置相应的 CSI Driver。

2. 将该 storeclass 设置为默认值,方便后续创建 cluster

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

指定卷类型

在 ClusterDefinition 中指定卷类型 [必须配置]。

bash 复制代码
  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 支持对数据和日志的不同备份方式。在这里,我们只配置了数据卷的信息。

添加备份配置

我们需要准备两个文件 BackupPolicyTemplateBackupTool

BackupPolicy Template

这是备份策略的模版,主要描述:

  1. 为 Cluster 的哪个组件备份
  2. 是否定时备份
  3. 快照备份怎么设置
  4. 文件备份怎么设置
yaml 复制代码
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,请检查:

  1. ClusterDefinionRef 是否正确
  2. BackupPolicyTempte 的 lable 是否正确
  3. 是否有多个关联的 BackupPolicyTemplate

如果是,需要通过annotation标记其中一个为默认模板

yaml 复制代码
  annotations:
    dataprotection.kubeblocks.io/is-default-policy-template: "true"

BackupTool

描述备份工具的具体执行逻辑,主要服务于文件备份(datafile),包括:

  1. 备份工具 image
  2. backup 的脚本
  3. restore 的脚本
yaml 复制代码
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 工具备份,我们需要在 backupCommandrestoreCommands 中填写脚本。

BackupTool 主要是为文件备份服务。如果你只需要快照备份,不需要文件备份,不需要配置 BackupTool

备份/还原集群

一切就绪,我们来试试如何备份和还原一个集群。

1. 创建集群

bash 复制代码
helm install mysql ./path-to-your-helm-chart/oracle-mysql
kbcli cluster create mycluster --cluster-definition oracle-mysql

因为我们添加了 BackupPolicyTemplate,集群创建后,KubeBlocks 会发现为该集群创建了 BackupPolicy,可用一下命令查看:

bash 复制代码
kbcli cluster list-backup-policy mycluster

2. 快照备份

bash 复制代码
kbcli cluster backup mycluster --type snapshot

type 指定了备份类型,是 Snapshot 还是 datafile。

如果有多个备份策略,可以通过--policy flag 指定。

3. 文件备份

KubeBlocks 支持备份到本地和云上对象存储。这里展示如何备份到本地的流程。

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

如下 line 37,你需要指定备份 pvc 的名称。

yaml 复制代码
 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

bash 复制代码
kbcli cluster backup mycluster  --type datafile

4. 从备份创建集群

(1)先查看备份

bash 复制代码
kbcli cluster list-backups

(2)选择一个备份,通过备份创建集群

bash 复制代码
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,再删除,会发生什么?

提示:请参考 KubeBlocks 的数据保护行为

A.2 查看备份信息

在 Section 4,我们通过 backup 子命令创建备份。

bash 复制代码
kbcli cluster backup mycluster  --type snapshot

我们会看到新生成了一个备份对象,并可以通过 describe-backup 子命令查看更多信息:

bash 复制代码
kbcli cluster describe-backup <your-back-up-name>

参考资料

KubeBlocks MySQL 备份文档

相关推荐
₯㎕星空&繁华19 小时前
阿里云服务器安装MySQL服务器
服务器·ubuntu·阿里云·云计算
你的大佬9991 天前
阿里云百炼ai模型
人工智能·阿里云·云计算
一只栖枝1 天前
备考华为HCIA - 云计算,培训与自学到底该怎么选?
云计算·华为认证·hcia·考证·职业规划
数据与人工智能律师2 天前
AI的法治迷宫:技术层、模型层、应用层的法律痛点
大数据·网络·人工智能·云计算·区块链
荣光波比2 天前
Docker(三)—— Docker Compose 编排与 Harbor 私有仓库实战指南
运维·docker·容器·云计算
企鹅侠客2 天前
mysqldump导入备份数据到阿里云RDS会报错吗
阿里云·adb·云计算
iHero2 天前
【Jitsi Meet】阿里云Docker安装Jitsi Meet后的调整
阿里云·docker·云计算
荣光波比2 天前
Ansible(三)—— 使用Ansible自动化部署LNMP环境实战指南
运维·自动化·云计算·ansible
荣光波比2 天前
Docker(五)—— Docker Compose 一键搭建 LNMP 架构并部署 WordPress
运维·docker·容器·云计算
mjhcsp3 天前
深入解析 IDM 插件开发挑战赛:技术要点与实践指南
服务器·阿里云·云计算