找回密码
 会员注册
查看: 10|回复: 0

MyFlash——美团点评的开源MySQL闪回工具

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
72302
发表于 2024-10-6 13:17:52 | 显示全部楼层 |阅读模式
点击上方“公众号”可以订阅哦由于运维、DBA的误操作或是业务bug,我们在操作中时不时会出现误删除数据情况。早期要想恢复数据,只能让业务人员根据线上操作日志,构造误删除的数据,或者DBA使用binlog和备份的方式恢复数据,不管那种,都非常费时费力,而且容易出错。直到彭立勋首次在MySQL社区为mysqlbinlog扩展了闪回功能。在美团点评,我们也遇到过研发人员误删主站的配置信息,从而导致主站长达2个小时不可用的情况。DBA同学当时使用了技术团队自研的binlog2sql完成了数据恢复,并多次挽救了线上误删数据导致的严重故障。不过,binlog2sql在恢复速度上不尽如人意,因此我们开发了一个新的工具——MyFlash,它很好地解决了上述痛点,能够方便并且高效地进行数据恢复。现在该工具正式开源,开源地址为:https://github.com/Meituan-Dianping/MyFlash?。闪回工具现状先来看下目前市面上已有的恢复工具,我们从实现角度把它们划分成如下几类。① mysqlbinlog工具配合sed、awk。该方式先将binlog解析成类SQL的文本,然后使用sed、awk把类SQL文本转换成真正的SQL。优点:当SQL中字段类型比较简单时,可以快速生成需要的SQL,且编程门槛也比较低。缺点:当SQL中字段类型比较复杂时,尤其是字段中的文本包含HTML代码,用awk、sed等工具时,就需要考虑极其复杂的转义等情况,出错概率很大。② 给数据库源码打patch。该方式扩展了mysqlbinlog的功能,增加Flashback选项。优点:复用了MySQL Server层中binlog解析等代码,一旦稳定之后,无须关心复杂的字段类型,且效率较高。缺点:在修改前,需要对MySQL的复制代码结构和细节需要较深的了解。版本比较敏感,在MySQL 5.6上做的patch,基本不能用于MySQL 5.7的回滚操作。升级困难,因为patch的代码是分布在MySQL的各个文件和函数中,一旦MySQL代码改变,特别是复制层的重构,升级的难度不亚于完全重新写一个。③ 使用业界提供的解析binlog的库,然后进行SQL构造,其优秀代表是binlog2sql。优点:使用业界成熟的库,因此稳定性较好,且上手难度较低。缺点:效率往往较低,且实现上受制于binlog库提供的功能。上述几种实现方式,主要是提供的过滤选项较少,比如不能提供基于SQL类型的过滤,需要回滚一个delete语句,导致在回滚时,需要结合awk、sed等工具进行筛选。总结了上述几种工具的优缺点,我认为理想的闪回工具需要有以下特性。a. 无需把binlog解析成文本,再进行转换。b. 提供原生的基于库、表、SQL类型、位置、时间等多种过滤方式。c. 支持MySQL多个版本。d. 对于数据库的代码重构不敏感,利于升级。e. 自主掌控binlog解析,提供尽可能灵活的方式。在这些特性中,binlog的解析是一切工作的基础。接下来我会介绍binlog的基本结构。binlog格式初探binlog格式概览一个完整的binlog文件是由一个format description event开头,一个rotate event结尾,中间由多个其他event组合而成。binlog文件实例:每个event都是由event header 和event data组成。下面简单介绍下几种常见的binlog event。① formart description event表达的含义是:170905 ?01:59:33 server id 10 ?end_log_pos 123 CRC32 0xed1ec563 Start: binlog v 4, server v 5.7.18-log created 170905 ?01:59:33② table map event表达的含义是: ? ?170905 ?01:59:33 server id 10 ?end_log_pos 339 CRC32 0x3de40c0d ? ? ? ?Table_map: `test`.`test4` mapped to number 238③ update row event表达的含义是: ? ?170905 ?01:59:33 server id 10 ?end_log_pos 385 CRC32 0x179ef6dd ? ? ? ?Update_rows: table id 238 flags: STMT_END_F ? ?UPDATE `test`.`test4` WHERE @1=3 SET @1=13;binlog event回滚根据上面的binlog介绍,可以看到每个binlog event中event header有个type_code,其中insert为30,update为31,delete为32。对于insert和delete两个相反的操作,只需把type_code互换,则在binlog event级别完成回滚。而对于update操作,其格式如下。其中,BI是指before image,AI是指after image。我们只需依次遍历修改前的数据和修改后的数据,并一一互换即可。因此整个回滚操作的难点在于回滚update语句,而update语句回滚的核心在于计算出每个AI、BI的长度。下面介绍下长度以及部分字段的计算方法。镜像长度计算镜像是由一个个字段组成的,根据字段类型的不同,其计算长度的方法也不一样。只与字段类型相关。比如int占用4个字节,bingint占用8个字节。其中类型信息可以从table map event中获取。与字段类型及其参数相关。比如decimal(18,9),占用9个字节,参数信息在table map event中。与字段类型、参数以及实际存储的值相关。比如varchar(10),有1个字节表示长度,之后的字节才表示真正的数据。比如varchar(280),有2个字节表示长度。实际的长度和数据在一起。解析binlog中的若干个关键点① length encoded integerbinlog中一个或者多个字节组合,分别表示了不同的含义。比如,timestamp是由固定的4个字节组成,event类型由一个字节表示;数据库名和表名最长为64个字符,即使每个字符占用3个字节,那么占用的字节数为192 select count(*) from testFlashback2; +----------+ | count(*) | +----------+ | ?1048576 | +----------+ 1 row in set (0.16 sec) delete from testFlashback2;测试结果从上述图表中可以看出,MyFlash的速度最快。作者简介广友,美团点评到店综合事业群资深MySQL DBA,2012年毕业于中国科学技术大学,2017年加入美团点评,长期致力于MySQL及周边工具的研究。金龙,2014年加入新美大,主要从事相关的数据库运维、高可用和相关的运维平台建设。对运维高可用与架构相关感兴趣的同学可以关注个人微信公众号“自己的设计师”,定期推送运维相关原创内容。邢帆,美团点评平台事业群和POI事业群MySQL DBA,2017年研究生毕业后加入美团点评,目前已经对MySQL运维有一定经验,并编写一些自动化脚本。招聘美团点评DBA团队招聘各类DBA人才,base北京上海均可。我们致力于为公司提供稳定、可靠、高效的在线存储服务,打造业界领先的数据库团队。这里有基于Redis Cluster构建的大规模分布式缓存系统Squirrel,也有基于Tair进行大刀阔斧改进的分布式KV存储系统Cellar,还有数千各类架构的MySQL实例,每天提供万亿级的OLTP访问请求。真正的海量、分布式、高并发环境。欢迎各位朋友推荐或自荐至jinlong.cai#dianping.com。参考文档MySQL官方文档1,2,3.binlog2sql.mysqlbinlog Flashback for 5.6.MySQL闪回原理与实战.热门博客运维美团外卖自动化业务运维系统——Alfred数据库运维必读的10个问题美团点评数据库高可用架构的演进与设想美团点评技术团队http://tech.meituan.com长按二维码关注我们更多技术博客:美团点评技术博客。PS:正文中标绿的名词均为参考链接,可点击查询。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-11 11:02 , Processed in 0.972606 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表