备份恢复系统之MySQL篇
一、前言
备份作为容灾的基础,其重要性不言而喻。本文将以我们熟悉的MySQL数据库着手,构建企业级备份恢复系统,希望能带给大家一些借鉴意义。
二、 系统目标
-  
   
从库恢复:指定服务器快速恢复从库实例  -  
   
数据恢复:实现七天内任意时间点的数据恢复  -  
   
数据追踪:获取目标时间段内的相关更新,按需生成原始SQL,回滚SQL,或DML统计信息  
三、实现方案
-  
   
全量备份:xtrabackup  
xtrabackup是percona公司开源的MySQL物理热备工具,其工作原理是在启动时记录日志序列号(LSN),然后复制所有的数据文件,同时运行一个后台进程来监视事务日志,并复制更改,最终得到一个一致性坐标点的全量备份文件。
-  
   
增量备份:mysqlbinlog  
mysqlbinlog可以读取二进制日志文件并写入包含相同内容的新文件,借此实现以原始格式备份二进制文件。
-  
   
数据追踪:my2sql  
my2sql是golang语言实现的MySQL Binlog解析工具,通过解析Binlog,可以生成原始SQL,回滚SQL,去除主键的INSERT SQL等,也可以生成DML统计信息。
-  
   
恢复数据  
| 方案 | 说明 | 场景 | 耗时 | 
|---|---|---|---|
| 数据闪回 | 借助my2sql解析Binlog进行反向重放 | 短时间内DML小数据量误操作 | 分钟级,视恢复数据量而定 | 
| 备份恢复 | 全量数据+增量重放 | 全场景数据恢复 | 小时级,视集群大小而定 | 
由于主从Binlog文件点位的不一致性,所以这里采用GTID联动全量备份和增量Binlog重放。这是由于GTID(全局事务标识)具有全局唯一性,一个事务对应一个GTID,它在整个复制拓扑中都是唯一的。借助GTID,我们就可以无视全量备份来源和增量Binlog来源的不同。
四、架构设计
系统层次
为了实现七天内极端情况下的数据恢复,我们需要对全量数据及增量Binlog进行备份,并保留七天。由此,我们将系统拆分为:存储模块,备份模块,恢复模块。为了更好地了解备份系统的运行状态,需要接入报表支持。现在我们通过系统的功能层次图进一步拆分下系统功能。
对于备份恢复系统,我将它从上到下拆分为四个部分。最上层的平台层是系统的web访问入口,为了简化DMS平台的开发任务量,所以直接使用Django框架原生的后台来管理定时任务。中间的基础服务层主要包括:负责异步调度的Celery,和轻量级的Redis作为消息队列。至于远程调度,Servant是一个通过HTTP协议执行配置命令和服务器文件读写的通用代理,这点可替代为Ansible或者SaltStack。而Ansible主要负责下发脚本,以保持主机脚本的一致性。最后我们重点看下功能层的相关模块:
-  
   
存储模块:管理存储相关功能,包括容量更新及备份清理。为备份策略提供数据支持以便更好地均衡数据  -  
   
数据备份:管理全量备份的备份任务及相关元数据,包括策略,历史,日志和黑名单等  -  
   
Binlog:管理Binlog备份的备份任务及相关元数据。其中Binlog记录包括备份的实例信息,存储信息以及备份文件的点位信息等  -  
   
恢复模块:管理数据恢复及Binlog相关功能,包括恢复从库,恢复数据以及数据追踪  -  
   
报表模块:管理存储,实例及备份相关的统计数据。辅助管理人员更好地了解备份系统的运行状态  
架构简图
其主要分为任务机和调度中心这两个任务线部分。其中:
-  
   
任务机:除了存放软件和下发脚本外,还会根据元数据信息生成备份策略  -  
   
调度中心:根据备份策略异步调度远程主机上的Servant执行相关任务。比如备份,清理等  
五、模块设计
全量备份
-  
   
原则  
-  
   
分散存储:连续两次备份不能存放在同一台存储机上,避免存储机硬件异常导致备份数据丢失  -  
   
存储均衡:依据存储机可用资源,集群备份大小生成备份策略,均衡空间使用  -  
   
高度可控:考虑到数据库环境的复杂性,所以备份的节点,频率,时间,并发,优先级,保留天数等需要高度可配置  -  
   
从库备份:为了避免备份影响到业务服务,数据备份需要通过从库进行  
-  
   
状态流转 
 -  
   
辅助任务  
-  
   
备份状态检查:扫描备份中的任务,若进程不存在,则将状态更新为“已失败”  -  
   
失败任务重试:扫描备份失败的集群,如果失败的历史记录小于10次,则将状态更新为“未开始”,以便下次调度  -  
   
失败记录清理:扫描失败历史记录,若备份已完成,则删除失败的历史记录  -  
   
失败任务通知:DMS平台展示+邮件通知  
增量备份
-  
   
主任务:增量备份是持续性的,需要保持备份进程。这里采用的方式是每十分钟检查一遍备份任务。如果正在备份中,则更新Binlog记录信息。否则尝试进行修复,并根据修复的结果更新备份状态  -  
   
黑名单清理:停止已加黑的备份任务,并清理备份相关记录和备份产生的Binlog文件  -  
   
备份清理:根据保留天数清理过期的备份文件并将记录更新为“已删除”  
点位恢复
-  
   
通过备份历史获取可用的全量备份  -  
   
恢复机上拉起全量备份  -  
   
根据全量备份的开始时间及恢复时间点获取Binlog文件  -  
   
解析最后一个Binlog文件获取恢复时间点的文件点位信息  -  
   
将Binlog作为relay log进行重放:将要恢复的Binlog调整命名后拷贝到relay log目录,然后启动sql_thread进行重放  
mysql> start slave sql_thread until relay_log_file='xxx', relay_log_pos=xxx; 
 -  
   
业务确认恢复数据是否OK。若偏左,可继续重放;若偏右,解析回退期间的binlog,如无DDL,借助my2sql回滚,否则需要重做  -  
   
覆盖生产数据  
作者介绍
欧阳逸云,信也科技集团DBA资深专家。
参考链接
xtrabackup参数介绍:https://www.percona.com/doc/percona-xtrabackup/2.4/xtrabackup_bin/xbk_option_reference.html mysqlbinlog备份介绍:https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog-backup.html my2sql解析工具介绍:https://github.com/liuhr/my2sql 
