如何备份 Kubernetes MySQL Operator 集群
Oracle 的 MySQL Operator for Kubernetes 是一种在集群内自动配置 MySQL 数据库的便捷方式。 Operator 的一项主要功能是集成的自动备份支持,可提高弹性。 备份定期将数据库复制到外部存储。
本文将指导大家设置备份到与 Amazon S3 兼容的对象存储服务。 还将了解如何将备份存储在 Oracle 云基础设施 (OCI) 存储或集群内的本地持久卷中。
准备数据库集群
在 Kubernetes 集群中安装 MySQL Operator 并创建一个简单的数据库实例用于测试目的。 复制下面的 YAML 并将其保存到 mysql.yaml:
apiVersion: v1
kind: Secret
metadata:
name: mysql-root-user
stringData:
rootHost: "%"
rootUser: "root"
rootPassword: "P@$$w0rd"
---
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mysql-cluster
spec:
secretName: mysql-root-user
instances: 3
tlsUseSelfSigned: true
router:
instances: 1
使用 Kubectl 应用配置:
$ kubectl apply -f mysql.yaml
等待几分钟,MySQL operator 会配置 Pod。 使用 Kubectl 的 get pods
命令检查进度。 我们应该看到四个正在运行的 Pod:一个 MySQL 路由器实例和三个 MySQL 服务器副本。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-cluster-0 2/2 Running 0 2m
mysql-cluster-1 2/2 Running 0 2m
mysql-cluster-2 2/2 Running 0 2m
mysql-cluster-router-6b68f9b5cb-wbqm5 1/1 Running 0 2m
定义备份计划
MySQL operator 需要两个组件才能成功创建备份:
- 定义备份运行时间的备份计划。
- 配置存储位置和 MySQL 导出选项的备份配置文件。
时间表和配置文件是彼此独立创建的。 这使我们可以使用相同的配置文件按不同的计划运行多个备份。
每个计划和配置文件都与特定的数据库集群相关联。 它们被创建为 InnoDBCluster
对象中的嵌套资源。 我们使用 MySQL 运算符创建的每个数据库都需要其自己的备份配置。
备份计划由数据库的 spec.backupSchedules
字段定义。 每个项目都需要一个计划字段,该字段指定何时使用 cron 表达式运行备份。 这是一个每小时开始备份的示例:
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mysql-cluster
spec:
secretName: mysql-root-user
instances: 3
tlsUseSelfSigned: true
router:
instances: 1
backupSchedules:
- name: hourly
enabled: true
schedule: "0 * * * *"
backupProfileName: hourly-backup
backupProfileName
字段引用要使用的备份配置文件。 我们将在下一步中创建它。
创建备份配置文件
配置文件在 spec.backupProfiles
字段中定义。 每个配置文件都应该有一个名称和一个配置备份操作的 dumpInstance
属性。
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mysql-cluster
spec:
secretName: mysql-root-user
instances: 3
tlsUseSelfSigned: true
router:
instances: 1
backupSchedules:
- name: hourly
enabled: true
schedule: "0 * * * *"
backupProfileName: hourly-backup
backupProfiles:
- name: hourly-backup
dumpInstance:
storage:
# ...
备份存储是在 dumpInstance.storage
字段中基于每个配置文件配置的。 我们需要提供的属性取决于我们使用的存储类型。
S3 存储
MySQL 操作员可以将我们的备份直接上传到与 S3 兼容的对象存储提供商。 要使用此方法,我们必须创建一个 Kubernetes
密钥,其中包含一个带有我们的凭据的 aws CLI 配置文件。
将以下内容添加到 s3-secret.yaml:
apiVersion: v1
kind: Secret
metadata:
name: s3-secret
stringData:
credentials: |
[default]
aws_access_key_id = YOUR_S3_ACCESS_KEY
aws_secret_access_key = YOUR_S3_SECRET_KEY
替换为我们自己的 S3 访问密钥,然后使用 Kubectl 创建秘密:
$ kubectl apply -f s3-secret.yaml
secret/s3-secret created
接下来将以下字段添加到备份配置文件的 storage.s3 部分:
- bucketName – 要将备份上传到的 S3 存储桶的名称。
- prefix – 设置此项以将前缀应用于我们上传的文件,例如 /my-app/mysql。 该前缀允许我们在存储桶中创建文件夹树。
- endpoint——当我们使用第三方 S3 兼容存储时,将此设置为我们的服务提供商的 URL。 如果我们使用的是 Amazon S3,则可以省略此字段。
- config – 包含我们的凭据文件的机密的名称。
- profile – 要在凭据文件中使用的配置文件的名称。 这在上面的示例中设置为默认值。
这是一个完整的例子:
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mysql-cluster
spec:
secretName: mysql-root-user
instances: 3
tlsUseSelfSigned: true
router:
instances: 1
backupSchedules:
- name: hourly
enabled: true
schedule: "0 * * * *"
backupProfileName: hourly-backup
backupProfiles:
- name: hourly-backup
dumpInstance:
storage:
s3:
bucketName: backups
prefix: /mysql
config: s3-secret
profile: default
应用此清单将激活每小时数据库备份到我们的 S3 帐户。
OCI 存储
该 operator 支持 Oracle Cloud Infrastructure (OCI) 对象存储作为 S3 的替代方案。 它以类似的方式配置。 首先为你的 OCI 凭据创建一个密钥
apiVersion: v1
kind: Secret
metadata:
name: oci-secret
stringData:
fingerprint: YOUR_OCI_FINGERPRINT
passphrase: YOUR_OCI_PASSPHRASE
privatekey: YOUR_OCI_RSA_PRIVATE_KEY
region: us-ashburn-1
tenancy: YOUR_OCI_TENANCY
user: YOUR_OCI_USER
接下来使用 storage.ociObjectStorage
节配置备份配置文件:
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mysql-cluster
spec:
secretName: mysql-root-user
instances: 3
tlsUseSelfSigned: true
router:
instances: 1
backupSchedules:
- name: hourly
enabled: true
schedule: "0 * * * *"
backupProfileName: hourly-backup
backupProfiles:
- name: hourly-backup
dumpInstance:
storage:
ociObjectStorage:
bucketName: backups
prefix: /mysql
credentials: oci-secret
修改 bucketName
和 prefix
字段以在你的 OCI 帐户中设置上传位置。 凭据字段必须引用包含你的 OCI 凭据的密钥。
Kubernetes 卷存储
本地持久卷是第三种存储选项。 这不太可靠,因为你的备份数据仍将驻留在 Kubernetes
集群中。 但是,它对于一次性备份和测试目的很有用。
首先创建一个持久卷和附带的声明:
apiVersion: v1
kind: PersistentVolume
metadata:
name: backup-pv
spec:
storageClassName: standard
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /tmp
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: backup-pvc
spec:
storageClassName: standard
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
此示例清单不适合生产使用。 你应该为自己的 Kubernetes
发行版选择合适的存储类和卷安装模式。
接下来通过添加 storage.persistentVolumeClaim
字段配置自你的备份配置文件以使用自己的持久卷:
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mysql-cluster
spec:
secretName: mysql-root-user
instances: 3
tlsUseSelfSigned: true
router:
instances: 1
backupSchedules:
- name: hourly
enabled: true
schedule: "0 * * * *"
backupProfileName: hourly-backup
backupProfiles:
- name: hourly-backup
dumpInstance:
storage:
persistentVolumeClaim:
claimName: backup-pvc
之前创建的持久卷声明由 claimName
字段引用。 MySQL 操作员现在会将备份数据存入该卷。
设置备份选项
备份是使用 MySQL Shell 的 dumpInstance
实用程序创建的。 这默认导出服务器的完整转储。 该格式为每个表写入结构和分块数据文件。 使用 zstd
压缩输出。
我们可以通过 MySQL 操作员备份配置文件中的 dumpOptions
字段将选项传递给 dumpInstance
:
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mysql-cluster
spec:
# ...
backupProfiles:
- name: hourly-backup
dumpInstance:
dumpOptions:
chunking: false
compression: gzip
storage:
# ...
此示例禁用分块输出,为每个表创建一个数据文件,并切换到 gzip
压缩而不是 zstd
。 我们可以在 MySQL 文档中找到可用选项的完整参考。
恢复备份
MySQL Operator 可以使用以前从 dumpInstance
创建的文件来初始化新的数据库集群。 这允许我们将备份直接恢复到 Kubernetes 集群中。 它在恢复情况下或将现有数据库迁移到 Kubernetes 时很有用。
数据库初始化由 InnoDBCluster
对象上的 spec.initDB
字段控制。 在此节中,使用 dump.storage
对象来引用之前使用的备份位置。 该格式与备份配置文件对象中的等效 dumpInstance.storage
字段相匹配。
apiVersion: v1
kind: Secret
metadata:
name: s3-secret
stringData:
credentials: |
[default]
aws_access_key_id = YOUR_S3_ACCESS_KEY
aws_secret_access_key = YOUR_S3_SECRET_KEY
---
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mysql-cluster-recovered
spec:
secretName: mysql-root-user
instances: 3
tlsUseSelfSigned: true
router:
instances: 1
initDB:
dump:
storage:
s3:
bucketName: backups
prefix: /mysql/mysql20221031220000
config: s3-secret
profile: default
应用此 YAML 文件将创建一个新的数据库集群,该集群使用指定 S3 存储桶中的 dumpInstance
输出进行初始化。 前缀字段必须包含存储桶中转储文件的完整路径。 Operator 创建的备份将自动存储在带时间戳的文件夹中; 我们需要通过设置前缀来指示要恢复哪个。 如果要从持久卷恢复,请使用路径字段而不是前缀。
总结
Oracle 的 MySQL Operator 在 Kubernetes 集群中自动化 MySQL 数据库管理。 在本文中,你了解了如何配置 Operator 的备份系统以将完整的数据库转储存储在持久卷或对象存储桶中。
使用 Kubernetes 横向扩展 MySQL 可增加弹性,但外部备份仍然至关重要,以防集群受损或数据被意外删除。 如果需要,MySQL Operator 可以从你的备份中恢复新的数据库实例,从而简化灾后恢复过程。
相关文章
使用 Mysqldump 备份 MySQL 中的数据
发布时间:2023/05/09 浏览次数:192 分类:MySQL
-
本篇文章将介绍如何使用 mysqldump 只备份数据。 在这里,我们将探讨 --no-create-info 、--compact 、--skip-triggers 和 --no-create-db 选项。
更新 MySQL 表中的主键
发布时间:2023/05/09 浏览次数:61 分类:MySQL
-
本篇文章介绍如何更新 MySQL 表中的主键。 我们将使用 ALTER 命令对主键进行任何更改。更新 MySQL 表中的主键 我们可以在多种情况下更新 MySQL 表中的主键。
在 MySQL 中获取命令历史记录
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
本文重点介绍了在 Windows 和 Linux 中获取我们已执行的 MySQL 命令历史记录的各种方法。MySQL命令历史
Oracle 的 decode 函数在 MySQL 中的等价物
发布时间:2023/05/09 浏览次数:115 分类:MySQL
-
本篇文章介绍了三种替代实现,我们可以将它们用作 MySQL 中 Oracle 的 decode() 函数的等价物。 为此,我们将使用 IF()、CASE 以及 FIELD() 和 ELT() 的组合。
使用 Ubuntu 连接远程 MySQL 服务器的不同方法
发布时间:2023/05/09 浏览次数:97 分类:MySQL
-
在本文中我们将学习如何使用 Ubuntu 连接远程 MySQL 服务器来操作数据以及启动和停止 MySQL 服务器。
在 Linux 中安装 MySQL 客户端
发布时间:2023/05/09 浏览次数:72 分类:MySQL
-
在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。
在 MySQL 中转换为十进制
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
有时,我们可能需要将一种数据类型转换为另一种数据类型。 下面是我们如何使用带有 DECIMAL(M,D) 的 CAST() 和 CONVERT() 函数在 MySQL 中转换为十进制。
在 MySQL 中获取当前日期和时间
发布时间:2023/05/09 浏览次数:145 分类:MySQL
-
本篇文章我们将学习 NOW()、CURRENT_TIMESTAMP()(也写为 CURRENT_TIMESTAMP)和 SYSDATE() 来获取 MySQL 中的当前日期和时间。 我们还将看到这三个功能之间的比较。在 MySQL 中获取当前日期和时间
更改 MySQL 服务器中的 max_allowed_packet Size
发布时间:2023/05/09 浏览次数:142 分类:MySQL
-
本篇文章介绍如何更改 MySQL 服务器中的 max_allowed_packet 大小。 为了了解这一点,我们将使用两个操作系统,Windows 10 和 Linux (Ubuntu)。