本文以 Oracle MySQL 为例,介绍如何在 KubeBlocks 中创建备份并恢复。
根据不同的分类方式,我们可以将备份分为多种类型。从方式上,可以分为卷快照备份和文件备份;从内容上,可以分为数据备份和日志备份;从量上,可分为全量备份和增量备份;从时间上,可以分为定时备份和按需备份等等。
本文将介绍如何在 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:
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
这是备份策略的模版,主要描述:
为 Cluster 的哪个组件备份
是否定时备份
快照备份怎么设置
文件备份怎么设置
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),包括:
备份工具 image
backup 的脚本
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 对有状态的集群提供了数据保护策略,不同策略提供了不同的数据方式。
可以试一下下列场景:
如果我们通过
kbcli cluster delete 删除了集群,我们的备份还在吗?
如果把 cluster 的
terminationPolicy 改为
WipeOut,再删除,备份还在吗?
如果把 cluster 的
terminationPolicy 改为
DoNotTerminate,再删除,会发生什么?
A.2 查看备份信息
在 Section 4,我们通过 backup 子命令创建备份。
kbcli cluster backup mycluster --type snapshot
我们会看到新生成了一个备份对象,并可以通过
describe-backup 子命令查看更多信息:
kbcli cluster describe-backup <your-back-up-name>
编辑推荐:
- 轻松集成系列二:如何在 KubeBlocks 中创建备份并恢复?以 Oracle MySQL 为例03-01
- 解读JetBrains 2023年开发者生态报告 | StoneDB数据库观察 #1103-01
- 轻松集成系列三:如何在 KubeBlocks 中配置参数模板|以 Oracle MySQL 为例03-01
- 轻松集成系列四:如何在 KubeBlocks 中更新参数|以 Oracle MySQL 为例03-01
- 明明只改了一行语句,为啥锁有这么多?03-01
- 2023 年中国金融级分布式数据库市场报告:TiDB 位列领导者梯队03-01
- HTAP 还可以这么玩?丨TiDB 在 IoT 智慧园区的应用03-01
- 糟了,数据库崩了,又好像没蹦03-01
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 解读JetBrains 2023年开发者生态报告 | StoneDB数据库观察 #11
- 轻松集成系列三:如何在 KubeBlocks 中配置参数模板|以 Oracle MySQL 为例
- 轻松集成系列四:如何在 KubeBlocks 中更新参数|以 Oracle MySQL 为例
- 明明只改了一行语句,为啥锁有这么多?
明明只改了一行语句,为啥锁有这么多?
26-03-01 - 2023 年中国金融级分布式数据库市场报告:TiDB 位列领导者梯队
2023 年中国金融级分布式数据库市场报告:TiDB 位列领导者梯队
26-03-01 - HTAP 还可以这么玩?丨TiDB 在 IoT 智慧园区的应用
HTAP 还可以这么玩?丨TiDB 在 IoT 智慧园区的应用
26-03-01 - 糟了,数据库崩了,又好像没蹦
糟了,数据库崩了,又好像没蹦
26-03-01 - MVCC多版本控制机制:mysql事务时光机!
MVCC多版本控制机制:mysql事务时光机!
26-03-01 - MVCC多版本控制机制:mysql事务时光机!
MVCC多版本控制机制:mysql事务时光机!
26-03-01 - MySQL隔离级别解析:数据一致性与高并发之间的平衡术!
MySQL隔离级别解析:数据一致性与高并发之间的平衡术!
26-03-01
