如何在K8S上备份和恢复MySQL
越来越多的生产系统和关键应用运行在K8S上。在生产系统运行有状态应用,并不是一件容易的事情,它需要我们仔细的计划并部署。我们之前有一篇文章专门介绍如何在K8S上运行高可用的MySQL。这次我们来介绍下如何备份和恢复MySQL。当我们在生产环境中备份和恢复MySQL,我们需要思考下面的问题:
下面的介绍会逐一回答上面的问题,以及介绍如何在K8S生产环境备份和恢复MySQL。
在K8S上备份MySQL的必要步骤
在我们制定备份和恢复计划的时候,很重要的一点是不是所有的数据都需要同等级别的保护。在生产环境中,我们需要满足我们的商业需求和客户需要的最合适的保护级别。下面我们来了解一下在生产环境中创建备份和恢复的一些必要的步骤。
1. 了解谁负责来创建备份
2. 所需RPO(恢复点目标)的级别
3. 确保清晰的知道备份到哪个位置
4. 备份的时间计划以及备份的留存时间计划
5. 确保与应用关联的数据也被正确备份了,从而确保应用的一致性
我们来详细过一遍备份MySQL的关键步骤,包括一些代码样例和截图。
对MySQL进行备份和恢复
在我们备份MySQL之前,我们必须首先正确配置PX-Backup,使它可以访问集群。>本篇文章并没有覆盖如何安装PX-Backup,可以参考以前的系列文章,有一篇专门讲解如何安装PX-Backup。在PX-Backup界面里,选择“Add Cluster”
接下来需要提供一个集群名称,以及为集群提供一个Kubeconfig (https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/),以及Portworx的一些信息。注意Kubeconfig控制了对集群进行访问的权限类型,对PX-Backup也是这样。如果我们仅仅对一个命名空间有访问权限,我们就只能为这一个命名空间进行备份和恢复。如果你没有Portworx集群信息,或者并没有为卷来使用Portwrox,这部分可以先留空。
这步完成后,就可以看到集群已经被添加到主界面了,在集群那里就会出现一个绿色的备份图标,点击就可以进入备份界面。
如果你的备份图标不是绿色的,看一下集群里运行的是不是Stork 2.4+的版本(https://docs.portworx.com/portworx-install-with-kubernetes/storage-operations/stork/#install)>参考备份界面里面Add Cluster的界面,可以复制下面的命令来为集群增加stork。
(正在运行 Portworx)
KBVER=$(kubectl version --short | awk -Fv '/Server Version: /{print $3}')
curl -fsL -o stork-spec.yaml "https://install.portworx.com/2.5?kbver=${KBVER}&comp=stork"
kubectl apply -f stork-spec.yaml
(没有运行 Portworx)
curl -fsL -o stork-spec.yaml "https://install.portworx.com/2.5?comp=stork&storkNonPx=true"
kubectl apply -f stork-spec.yaml
配置你的备份目标位置
在备份MySQL之前,我们必须创建一个备份目标位置,点击Cloud Settings,继续输入备份目标位置的身份信息等。
关于不同的备份目标位置,这里有详细的文档(https://backup.docs.portworx.com/use-px-backup/credentials/)。一般来说,至少需要创建一个云账户(如AWS,Azure,Google),以及创建一个备份位置(如云对象存储的位置)。
当你创建了一个备份位置,你可以选择之前创建的云账户,输入相关的信息。
创建一个备份的时间计划
这步是可选的。
我们需要创建一个备份时间计划,来明确备份的频率(以达到RPO的目标),以及保存多少个备份。(注意:如果需要RPO为零,则需要使用PX-DR)。点击设定菜单的Schedule Policies,会出现一个界面来帮助你配置备份的时间计划。
点击浏览栏的Add按钮,
在这个界面,创建你需要的备份时间计划。你可以选择定期、每天、每周、或者每月,然后选择需要保存多少个备份。在后续对MySQL进行备份的过程中,就可以选择这个备份时间计划。
创建应用一致的MySQL备份的前置和后置规则
当系统验证发现数据已经准备好可以备份了,就可以开始备份了。这就是我们说的应用感知。为了保持应用的一致性,我们希望在备份前和备份后进行一定的控制。通过PX-Backup,我们可以配置前置和后置规则(https://backup.docs.portworx.com/use-px-backup/rules/),这些规则会通过在一个或多个Pods里运行命令来达到我们的目标。首先,我们需要理解MySQL是如何存储状态的。这会对我们的备份方式和规则有很大的帮助。MySQL服务器管理的信息,都保存在data directory里,(https://dev.mysql.com/doc/refman/8.0/en/data-directory.html)
这个data directory位于MySQL服务器的文件系统的/var/lib/mysql 目录里。在这个目录里存储的文件和数据对于MySQL维持数据一致性非常重要。因此,我们mount K8S持久卷声明(PVCs),到MySQL镜像的data directory也非常重要。在K8S里,volumeMount的配置文件差不多是下面的样子:
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-data
在data directory内,MySQL存储与系统、性能和客户数据有关的:数据结构,表,日志文件、配置、以及数据库数据。Mount持久卷,使得PX-Backup可以在需要的时候对MySQL的数据进行快照和备份。
MySQL有一个叫做mysqldump的工具,可以专门用来对MySQL做备份。由于PX-Backup可以为多种数据类型提供数据备份和恢复的抽象,我们可以复制mysqldump的最佳工作方式(https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_add-locks)。例如flush和锁定日志和数据库表,并保存到PX-Backup的前置和后置规则里。PX-Backup的规则和备份可以跨多个MySQL实例和跨云来使用,这对于DevOps团队管理云环境和多云环境很有帮助。
MySQL的前置规则
在备份MySQL的时候,推荐方式是把一些特定数据flush到磁盘里,这样可以确保备份的一致性。如数据库表和日志,就应该被flush。对MySQL而言,另外很重要的一点是锁定数据库表,这样在备份期间,没有新的I/O请求来增加数据库记录,否则MySQL就无法保持一致性。
为了达到这样的目标,我们可以在前置规则中部署FLUSH TABLES WITH READ LOCK命令,它会进行下面的操作:
(FLUSH TABLES WITHREAD LOCK)- 关闭所有打开的数据库表,通过全局化的读锁定,来锁定所有数据库的所有表。对于文件系统是可以及时进行快照的Veritas或者ZFS来说,这是一个非常便捷的备份方式。
可以使用UNLOCK TABLES来解除锁定。
由于PX-Backup对K8S里的持久卷做快照,这会帮助我们完成我们的目标。
在PX-Backup的界面里,创建规则。
> 注意:我们设定规则在后台运行,这需要一个WAIT_CMD(https://docs.portworx.com/portworx-install-with-kubernetes/storage-operations/create-snapshots/snaps-3d/#step-1-create-rules),来使得规则可以正确的执行和退出。
MySQL的后置规则
由于我们在备份之前,Flush并锁定了MySQL的数据。那么在备份完成后,我们必须从全局化的读锁定中,解除对数据库的锁定。根据MySQL的技术文档,这是因为在FLUSH TABLES WITHREAD LOCK操作后,全局化的锁定并不会自动解锁。FLUSH LOGS(https://dev.mysql.com/doc/refman/8.0/en/flush.html#flush-logs)也是一个好的操作,它关闭并重新打开服务器正在执行写入操作的所有日志文件,并且更新日志的序列数字。如果用户需要在备份前后保持一个清晰的日志的区别,这个操作就很重要。Flushing Logs在我们现在的步骤中并不是必须的,但我们把它加入到后置规则中,以保持操作的完整。
在PX-Backup界面中创建规则。
> 注意: 备份的后置规则不允许在后台运行,所以我们需要WAIT_CMD(https://docs.portworx.com/portworx-install-with-kubernetes/storage-operations/create-snapshots/snaps-3d/#step-1-create-rules)
为MySQL创建一个备份
现在我们已经完成了配置,我们也已经为应用创建了规则。我们可以开始备份我们的MySQL了。我们需要进入应用所在集群的备份界面,选择我们的应用正在运行所在的命名空间。
在命名空间内,我们可以选择MySQL相关的标签,可以仅备份具备标签的特定的对象。或者在命名空间备份界面中,通过点击右上角的Backup按钮备份整个命名空间。
如果你需要备份特定的对象,在跳出的菜单栏中,输入下面的信息,
信息输入完成后,点击创建,
一旦创建完成,备份会进入Pending状态,然后进入In Progress状态。这时的备份图标是下面的样子。
如果需要了解备份过程的进展,可以选择菜单栏里面的Show Details按钮,这会允许你查看当前的状态,以及与备份有关的元数据。所有的进展和错误信息都会在这个界面显示出来。
我们之前创建的前置和后置规则的一些状态信息也会显示出来。当这些规则在执行的时候,会显示为进行中。如果有任何的错误,也会在这个界面显示出来。
当规则执行完成,它会继续备份卷,信息细节也会变化,下面是一些信息的例子:
一旦备份成功完成,图标就会显示成下面的样子。
如果中间有任何错误,图标就会变成下面的红色的样子,在Show Details栏位,会显示错误的信息。
从备份中恢复MySQL
开始恢复,选择菜单栏里的Backups,
找到你需要恢复的备份,选择菜单栏里的Restore。
在下面的界面中,你可以提供恢复的名称,恢复到的目标集群,以及其它一些选项,包括:
会恢复备份到这个备份原本来自的命名空间。注意是否需要覆盖现有资源这个选项。
会允许我们提供一个新的命名空间,来恢复备份。注意这个新的命名空间不需要在此之前就已经创建好。
恢复的过程会覆盖现有的对象。实际操作中这些对象会被删除并重新创建。
Jobs通常运行一次就会完成。通常不需要反复运行这些Jobs – 特别是当我们把备份恢复到该备份原本来自的同一集群的情况下。但当我们恢复到一个新的集群或者新的命名空间的时候,就需要再次运行Jobs了。
你会在界面中看到状态从Pending变成了Success,你可以选择菜单里的Show Details,来获得备份相关的信息。
结论
对于K8S上的应用来说,备份和恢复是非常重要的。PX-Backup使得备份和恢复的过程变得非常简单。并且有效地保证了数据的一致性。可以访问Portworx网站获取更详细的文档,或者申请试用。(https://portworx.com/products/px-backup/)