本文以 Oracle MySQL 为例,介绍如何在 KubeBlocks 中创建备份并恢复(点击参考完整 PR)。
根据不同的分类方式,我们可以将备份分为多种类型。从方式上,可以分为卷快照备份和文件备份;从内容上,可以分为数据备份和日志备份;从量上,可分为全量备份和增量备份;从时间上,可以分为定时备份和按需备份等等。
本文将介绍如何在 KubeBlocks 上实现最常见的全量快照备份和文件备份。
前提条件
- 了解 K8s 基本概念,例如 Pod、PVC、PV、VolumeSnapshot 等
- 完成 Tutorial 1
- 了解 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
这是备份策略的模版,主要描述:
- 为 Cluster 的哪个组件备份
- 是否定时备份
- 快照备份怎么设置
- 文件备份怎么设置
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,请检查:
- ClusterDefinionRef 是否正确
- BackupPolicyTempte 的 lable 是否正确
- 是否有多个关联的 BackupPolicyTemplate
如果是,需要通过annotation标记其中一个为默认模板
yamlannotations: dataprotection.kubeblocks.io/is-default-policy-template: "true"
BackupTool
描述备份工具的具体执行逻辑,主要服务于文件备份(datafile),包括:
- 备份工具 image
- backup 的脚本
- 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 对有状态的集群提供了数据保护策略,不同策略提供了不同的数据方式。
可以试一下下列场景:
- 如果我们通过
kbcli cluster delete
删除了集群,我们的备份还在吗? - 如果把 cluster 的
terminationPolicy
改为WipeOut
,再删除,备份还在吗? - 如果把 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>