文档章节

MySQL备份的持续验证:还原备份

有容云
 有容云
发布于 2016/11/16 16:51
字数 2143
阅读 6
收藏 0

Facebook的MySQL数据库遍布在我们位于全球的数据中心内,我们必须能在任何时间内从任何位置发生的故障中恢复。在发生此类灾难事件后,不仅需要尽量快速可靠地恢复服务,而且需要确保整个过程不会丢失任何数据。为此我们构建了一套能够对从备份中恢复数据库的能力进行持续不断测试的系统。

 

我们的还原系统包含两个重要组件:

  • 持续还原层(Continuous Restore Tier,CRT) - 负责对所有还原操作进行调度和监控。该组件会查找包含新备份的数据库,为其创建还原作业,监控还原过程,并确保每个备份可以成功还原。

  • ORC 还原协调器(ORC) - 由负责执行还原的工作进程(Peon)和负载均衡器(Warchief)组成。Warchief接收来自CRT的新建还原作业并将其分配给Peon。Peon承载了负责执行实际还原过程的本地MySQL实例。

 

数据CRT会收集每个还原作业的进度信息,借此帮助我们了解数据库还原操作的资源需求,ORC则可以帮助我们验证备份的完整性。本文将侧重于介绍ORC的内部原理,尤其是内部的Peon状态机(State machine),以及在对单一数据库进行还原的过程中我们遇到并克服的挑战。

 

备份概述

在构建持续还原流程前,我们首先需要了解各种可用备份选项的本质。目前我们主要进行三种备份,所有备份内容均存储在HDFS中:

  1. 完整逻辑备份,使用mysqldump每几天进行一次。

  2. 差异(Diff)备份在所有未进行完整备份的日子里进行。备份过程中会再次创建完整转储,但只存储与上一次完整备份相比有差异的内容。我们会通过元数据记录每次差异备份是基于哪个完整备份进行的。

  3. 二进制日志(Binlog)备份从主数据库持续不断地流式传输至HDFS。

 

完整和差异备份均会将--single-transaction选项传递至mysqldump,这样我们就可以对数据库获得一致的快照,该快照可取自从属(Slave)或主(Master)实例。下文会将差异和完整备份统称为转储(Dump)。

 

由于每天只进行一次转储操作,因此可通过Binlog备份确保自从备份之后,数据库所执行的每一笔事务都能被我们记录在案。随后只要对转储内容执行还原操作将数据库恢复至某个时点,随后通过Binlog对事务进行重播(Replay),即可顺利实现数据库的时点还原。我们的所有数据库服务器都使用了全局事务ID(GTID),因此在从Binlog备份进行事务重播时我们可以获得额外的一层控制能力。

 

除了将备份存储在HDFS中,我们还会将其写入离场位置

 

ORC:ORC还原协调器

架构

 

ORC包含三个组件:

  1. Warchief - 负载均衡器。这是一种可暴露出Thrift接口的Python程序,通过接口可接收新的还原请求,并将其调度至可用的Peon。

  2. ORC DB - 负责维持分配给每个Peon的作业状态、每个作业的当前状态,以及Peon健康度状态等信息的中央MySQL数据库。Warchief会使用该数据库中存储的信息决定要将某个作业分配给哪个Peon,以及故障恢复过程中要使用的Peon。

  3. Peon - 负责还原操作的工作进程。Peon也使用Python编写,可暴露出Thrift接口,通过该接口接收有关Peon的各类状态信息。每个Peon会定期与ORC DB进行同步,查询分配给自己的新作业,并汇报自己的健康度状态。运行Peon的服务器上还运行了一个本地MySQL实例,备份将还原至该实例中。

内部原理:Peon

Peon中包含了从HDFS获取备份,将其载入自己的本地MySQL实例,通过Binlog重播将实例推进至某一时点等操作的所有相关逻辑。Peon处理的每个还原作业会经历下列五个步骤:

  1. 选择(SELECT) - 决定需要用哪个备份进行还原(例如完整或增量,HDFS或离场等)。

  2. 下载(DOWNLOAD) - 将所选文件下载至磁盘。如果要还原的是完整备份,只需下载一个文件。对于差异备份,首先需要下载完整和差异备份,随后在完整备份的基础上应用差异备份,并将最终结果存储到磁盘上。无论备份类型为何,至此我们已经在磁盘上有了一个mysqldump输出的内容。

  3. 加载(LOAD) - 将下载的备份载入Peon的本地MySQL实例。按照与备份文件中每张表有关的语句进行解析,并行恢复每张表,这一过程类似于Percona的Mydumper。

  4. 验证(VERIFY) - 针对载入MySQL的数据执行健康检查(Sanity check)。

  5. 重播(REPLAY) - 如果有必要,在已还原备份的基础上,下载二进制日志备份并进行事务重播。我们会使用mysqlbinlog程序筛选掉来自其他共置数据库以及空事务的Binlog事件,随后对同一个MySQL实例重播所需的事务。

 

每个步骤有自己对应的失败状态,因此如果某个作业在DOWNLOAD步骤失败,将显示为DOWNLOAD_FAILED状态,并且不会继续进入到LOAD步骤中。

 

Binlog的选择逻辑

还原过程中最具挑战的部分可能就是确定所要下载并重播的Binlog。完整和差异备份可以从主或从属数据库获取,然而我们只从主数据库创建Binlog备份。这意味着简单的时间戳对比已经无法用于确定要重播的Binlog。

 

我们于2014年在所有服务器上部署了GTID,因此每笔事务都可以获得一个全局唯一标识符。此外每台运行MySQL的服务器也维持了一个gtid_executed(GTID集)变量,可将其作为对应实例目前已执行事务数量的计数器。

 

在具备GTID的情况下,从主数据库重播至从属数据库的事务可以维持自己的GTID,这也意味着我们可以清楚地知道每笔事务是否包含在某个GTID集中。此外还可以针对服务器的gtid_executed值进行超集/子集(Superset/subset)比较,因为该值实际上就是一种严格递增的计数器和数学意义上的函数。

 

通过配合使用这些技术,即可在创建转储时记录服务器的gtid_executed值,同时记录每个Binlog文件中包含的GTID集,借此执行一致的比较并确定Binlog中的哪些事务需要重播。此外一旦需要重播的第一笔事务确定后,无需重新对比其他GTID即可确定需要重播的所有后续事务。我们还会使用mysqlbinlog的--stop-datetime选项确定Binlog流要在何处停止。

 

结论

面对灾难性事件,备份是最后一重保障,备份的存在使得我们具备了更自信的故障恢复能力。然而仅仅创建备份是不够的。ORC可以帮助我们对备份进行持续不断的测试,借此验证备份的完整性,并让我们更清楚地确定成功还原数据所需提供的资源。

 

以Facebook的规模,打造一个类似ORC这样的系统还需要具备大量警报、监控,以及自动化的失败检测和补救机制。这些功能均是通过CRT实现的,我们将通过另一篇文章介绍如何将这种还原过程扩展至成千上万个数据库。

 

来源:Infoq

地址:http://www.infoq.com/cn/articles/continuous-validation-of-mysql-backup

翻译:Divij Rajkumar

 

爆料:本周三(2016年11月16日),有容云作为微软Azure公有云平台的合作伙伴,将参加微软Azure主办的商业用户大会,更多精彩内容敬请期待。

本文转载自:http://www.infoq.com/cn/articles/continuous-validation-of-mysql-backup

有容云
粉丝 2
博文 52
码字总数 38431
作品 0
深圳
私信 提问
MySQL备份与恢复(二)

二、使用xtrabackup进行MySQL数据库备份 前面介绍mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库...

FJCA
2017/03/23
0
0
MySQL-Xtrabackup备份还原

前言 通常我们都是使用xtrabackup工具来备份数据库,它是一个专业的备份工具,先来简单介绍下它。 Xtrabackup percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库,它...

一入IT深似海·
2018/08/05
0
0
生产环境MySQL快速备份工具XtraBackup使用案例

生产环境MySQL快速备份工具XtraBackup使用案例 MySQL的备份有很多种方式,最常用的应该是MySQLdump了,将数据库导出一个 sql文件,还原的时候source db.sql 就欢快的执行了。小伙伴愉快的布上...

人情世故
2016/05/23
307
0
XtraBackup应用说明(支持TokuDB)

XtraBackup应用说明(支持TokuDB) 背景: 关于物理备份工具xtrabackup的一些说明可以先看之前写过的文章说明:XtraBackup 安装使用和xtrabackup 使用说明(续),本篇文章将介绍xtrabackup在...

xiaocao13140
2018/05/21
0
0
史上最简单的 MySQL 教程(三十六)「数据备份与还原(中)」

数据备份与还原 基础概念: 备份,将当前已有的数据或记录另存一份; 还原,将数据恢复到备份时的状态。 为什么要进行数据的备份与还原? 防止数据丢失; 保护数据记录。 数据备份与还原的方...

qq_35246620
2017/10/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
6
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
4
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
7
0
从零基础到拿到网易Java实习offer,我做对了哪些事

作为一个非科班小白,我在读研期间基本是自学Java,从一开始几乎零基础,只有一点点数据结构和Java方面的基础,到最终获得网易游戏的Java实习offer,我大概用了半年左右的时间。本文将会讲到...

Java技术江湖
昨天
7
0
程序性能checklist

程序性能checklist

Moks角木
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部