备份作为容灾的基础,其重要性不言而喻。本文将以我们熟悉的MySQL数据库着手,构建企业级备份恢复系统,希望能带给大家一些借鉴意义。
xtrabackup是percona公司开源的MySQL物理热备工具,其工作原理是在启动时记录日志序列号(LSN),然后复制所有的数据文件,同时运行一个后台进程来监视事务日志,并复制更改,最终得到一个一致性坐标点的全量备份文件。
mysqlbinlog可以读取二进制日志文件并写入包含相同内容的新文件,借此实现以原始格式备份二进制文件。
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主要负责下发脚本,以保持主机脚本的一致性。最后我们重点看下功能层的相关模块:
其主要分为任务机和调度中心这两个任务线部分。其中:
mysql> start slave sql_thread until relay_log_file='xxx', relay_log_pos=xxx;
欧阳逸云,信也科技集团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