轻松集成系列二:如何在 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 支持对数据和日志的不同备份方式。在这里,我们只配置了数据卷的信息。

添加备份配置

我们需要准备两个文件 BackupPolicyTemplate 和 BackupTool。

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 工具备份,我们需要在 backupCommand 和 restoreCommands 中填写脚本。

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 备份文档

相关推荐
yichengerp35 分钟前
中小电子厂用什么ERP?电子厂ERP管理软件实施要点与易呈方案推荐
大数据·运维·人工智能·云计算·制造
励志师code35 分钟前
RoCE 网络实战:从 NCCL 调优到 RDMA 硬件计数器排障
linux·运维·网络·云计算
腾讯云大数据1 小时前
本体立骨架,语义供刻度——DataBuddy对企业AI语义架构的一次完整回答
大数据·人工智能·架构·云计算·腾讯云
KIDULT°12 小时前
MySQL系列 (1):数据库原理
运维·数据库·mysql·云计算
yichengerp19 小时前
电子行业常用erp系统有哪些?推荐适合中小电子厂的易呈erp软件,操作简单,易落地
大数据·运维·人工智能·云计算·制造
做运维的阿瑞21 小时前
公有云算力布局的技术逻辑与工程实践
微服务·云计算·csdn开发云
朱包林1 天前
iTerm2终端配置指南
linux·javascript·python·云原生·容器·kubernetes·云计算
酒神dnspup1 天前
IPv6 网站访问异常怎么查?DNSPup 双栈检测、DNS 与端口排障指南
运维·云计算·域名·dns·dnspup
workflower2 天前
矿用机器人人工智能安全与治理体系
人工智能·安全·机器学习·机器人·云计算·无人机
怪奇云呼军2 天前
教育试听预约后没到课,闪电智能 Voice Agent 如何做分层回访?
人工智能·python·算法·云计算·音视频