如何在K8S上备份和恢复MySQLhtml
愈来愈多的生产系统和关键应用运行在K8S上。在生产系统运行有状态应用,并非一件容易的事情,它须要咱们仔细的计划并部署。咱们以前有一篇文章专门介绍如何在K8S上运行高可用的MySQL。此次咱们来介绍下如何备份和恢复MySQL。当咱们在生产环境中备份和恢复MySQL,咱们须要思考下面的问题:mysql
咱们须要备份哪些K8S对象?sql
我如何备份个人持久卷(PVs)?数据库
个人备份文件存储在哪里?安全
个人备份须要保持多久的可用性?服务器
我可否恢复个人备份到另一个K8S集群?数据结构
谁有访问这些备份的权限?app
谁有权限实施备份?curl
咱们可否按照预约的时间计划自动进行备份?ide
备份须要多长时间?
个人备份是安全的吗?
下面的介绍会逐一回答上面的问题,以及介绍如何在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 – 特别是当咱们把备份恢复到该备份本来来自的同一集群的状况下。但当咱们恢复到一个新的集群或者新的命名空间的时候,就须要再次运行Jobs了。
你会在界面中看到状态从Pending变成了Success,你能够选择菜单里的Show Details,来得到备份相关的信息。
结论
对于K8S上的应用来讲,备份和恢复是很是重要的。PX-Backup使得备份和恢复的过程变得很是简单。而且有效地保证了数据的一致性。能够访问Portworx网站获取更详细的文档,或者申请试用。(https://portworx.com/products/px-backup/)