MySQL多线程备份工具mydumper

叁叁肆2018-10-18 14:56

此文已由作者温正湖授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。


mydumper(&myloader)是一个针对MySQL和Drizzle的开源 (GNU GPLv3)、高性能的多线程备份和恢复工具。开发人员主要来自MySQL、Facebook和SkySQL公司,目前mydumper由Percona维护并进行新功能开发,是Percona Remote DBA项目的重要组成部分,包含在Percona XtraDB Cluster中。与Xtrabackup相对应,分别用于对数据进行逻辑备份和物理备份,mydumper的第一版0.1发布于2010.3.26;最新版本0.6.2发布于2014.9.16。与MySQL自带的mysqldump相似,两者都是逻辑备份,即通过导出sql的方式进行数据备份,但mydumper与mysqldump又有很大的区别,最典型之处即为其多线程并发备份功能,这在被导出的数据库实例所在的服务器IO性能较好的情况下能够带来很大的性能优势。下面是对两种做的对比测试结果:  



可以发现,在备份时间上,mydumper性能比mysqldump好将近1倍,通过分析不难发现,两者性能的差距主要跟备份实例的IO性能以及mydumper开启的线程数有关系,如果外部实例的IO性能很差,那么可能mysqldump单线程就能够将IO吃满,那改为使用mydumper也无法带来性能提升,但如果实例的IO性能较好,通过增加备份线程数,就可能带来成倍的性能提升。导入时间分别使用与mydumper配合使用的myloader多线程sql导入工具以及mysqldump对应的source命令得到。相应的,在IO性能较好的SSD上,myloader的多线程优势体现明显,比source的单线程执行时间上节省将近2倍。不过在HDD上,由于其本身性能原因,myloader带来的效益变小。
当然,作为一个成熟的备份工具,只具有高性能是不够的,数据的一致性也是非常重要的要求,对于单线程的数据备份,实现数据一致性是较为容易的,以Xtrabackup备份为例,由于myisam表是非事务的,所以只能在加锁期间进行备份。简要流程如下:
1.记录redo log当前lsn,记为lsn1;
2.执行拷贝任务,拷贝数据库的ibdata,*.ibd表空间文件;
3.执行flush tables with read lock;阻塞写操作;
4.记录此时binlog文件及位置,记录redo log的lsn,记为lsn2;拷贝myisam表;
5.unlock tables;
6.拷贝lsn1和lsn2之间的redo log;
mydumper由于是逻辑备份,且需要支持多线程,所以没法采用该方法实现,其实现方式简介如下(这里仅介绍全量迁移模式,不包括daemon模式):
1.flush tables with read lock;阻塞写操作,保证数据一致性;
2.start transaction with consistent snapshot; 
3.记录备份开始时间,通过show master status和show slave status获取和保存binlog文件和位置信息、master信息等;
4.根据用户输入,创建指定多个的工作线程用于后续进行数据库元数据(schema)、No-InnoDB表和InnoDB表的导出;
5.工作线程分别进行初始化,将session的事务级别设置为repeatable read,用于实现一致性读;
6.工作线程执行start transaction with consistent snapshot用于读取一致性数据,由于此时主线程仍持有全局读锁,所以工作线程读到的一致性数据与主线程一致。工作线程阻塞在工作队列上,等待pop主线程往队列中push进的jobs;
7.主线程根据用户输入逐个解析No-InnoDB表、InnoDB表和表元数据,默认基于主键来将表拆分为多个区间select,并将其分别封装为job push到工作队列;
8.工作线程pop出工作队列中的job,逐个执行,由于push的顺序原因,会先完成No-InnoDB表,在做InnoDB表;
9.先dump No-InnoDB表的原因是完成后,主线程既可执行unlock tables,减小对备份实例业务的影响;
10.主线程在释放全局读锁后,关闭MySQL连接, 往工作队列中push进工作线程相同数量的shutdown job用于让工作线程完成dump job后退出;
11.主线程等待所有工作线程退出后,记录备份结束时间后也退出,结束本次备份。
mydumper除了具备高性能和数据一致性功能外,相比mysqldump,在备份的文件上也具备优势,mysqldump将备份导出为一个文件,而mydumper默认为每个表分别创建schema和data文件,还可以限制文件的大小,从而形成多个小文件,这样便以进行更细粒度的备份和数据删除。 
以上所述均为mydumper的优点,其不可避免的存在不足或待优化的点,主要包括在schema导出功能上仍不够成熟、多线程导出可能影响备份实例的正常业务访问和备份源选择参数不够友好等,这些将在后续作为专题进行介绍并提供解决方案。


网易云免费体验馆,0成本体验20+款云产品! 

更多网易技术、产品、运营经验分享请点击


相关文章:
【推荐】 【大数据之数据仓库】kudu性能测试报告分析
【推荐】 3招搞定APP注册作弊