轻松集成系列二:如何在 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 备份文档

相关推荐
九河云6 小时前
AWS账号注册费用详解:新用户是否需要付费?
服务器·云计算·aws
神一样的老师6 小时前
利用亚马逊AWS IoT核心和MQTT进行数据采集的综合指南
云计算·aws
昔我往昔13 小时前
阿里云文本内容安全处理
安全·阿里云·云计算
写代码的学渣15 小时前
Linux云计算个人学习总结(一)
linux·运维·云计算
林农17 小时前
C02S11-Linux系统的安全与控制
linux·云计算
danns88821 小时前
什么是 AWS PrivateLink
云计算·aws
shiran小坚果1 天前
AWS RDS MySQL内存使用
数据库·mysql·云计算·database·aws
武汉唯众智创1 天前
职业院校关于大数据、云计算和物联网传感器技术的结合与应用探讨
大数据·云计算·物联网传感器技术
小安运维日记1 天前
Linux云计算 |【第五阶段】CLOUD-DAY8
linux·运维·docker·云计算·k8s·学习方法