网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,为客户提供稳定流畅、低时延、高并发的视频直播、录制、存储、转码及点播等音视频的 PASS 服务。在线教育、远程医疗、娱乐秀场、在线金融等各行业及企业用户只需经过简单的开发即可打造在线音视频平台。现在,网易视频云与大家分享一下开源 MYSQL 多线程逻辑导入工具 MYLOADER 原理与改进.

本篇聊聊与 mydumper 配合使用的 myloader 工具。

myloader 是 MySQL 领域少有的多线程的恢复工具,为了能够更好的理解其如何进行工作,有必要对 mydumper 所生成的备份结果进行简单介绍,下图即为 mydumper 0.9.1 版本所输出的备份目录结构:

[email protected]:~$ ls mydumper-data/

2dumpdb.dumptable.00000.sql dumpdb.dumptable-schema.sql dumpdb-schema-post.sql

3dumpdb.dumptable.00001.sql dumpdb.dumptable-schema-triggers.sql metadata

4dumpdb.dumptable.00002.sql dumpdb.dumptable-schema-view.sql

5dumpdb.dumptable.00003.sql dumpdb-schema-create.sql

a 、 metadata 保存一致性数据导出时的 BinLog 信息和导出开始和结束时间,形如:

1Started dump at: 2016-03-20 21:18:54

2SHOW MASTER STATUS:

3Log: mysql-bin.000027

4Pos: 350229576

5Finished dump at: 2016-03-20 21:19:04

b 、 dumpdb 和 dumptable 分别表示导出的数据库和表的名称;

c 、 dumpdb-schema-create.sql 和 dumpdb-schema-post.sql 分别保存数据库 dumpdb 的建库语句和该库的 functions 、 procedures 及 events ;

d 、 dumpdb.dumptable-schema.sql 保存建表语句; dumpdb.dumptable-schema-view.sql 保存表相关视图; dumpdb.dumptable-schema-triggers.sql 保存表相关的触发器;

e 、 dumpdb.dumptable.00000.sql ~ dumpdb.dumptable.00003.sql 保存 dumptable 表所导出的数据

可将整个过程分为三个阶段:

首先由 myloader 主线程完成建库建表,依次将备份目录下 dumpdb-schema-create.sql 和 dumpdb.dumptable-schema.sql 中的建库和建表语句应用到目标数据库实例中;

接着 myloader 主线程会生成多个工作线程,由这些工作线程将所有 dumpdb.dumptable..sql 文件中的记录导入到对应表中,这个阶段是并行的,并行粒度为文件,工作线程完成所有 dumpdb.dumptable..sql 文件数据导入后销毁;

最后主线程将 dumpdb-schema-post.sql 、 dumpdb.dumptable-schema-view.sql 和 dumpdb.dumptable-schema-triggers.sql 文件中存在的 schema 导入对应数据库和表中

myloader 参数比较简单,主要有如下几个:

-d ,指定待恢复的备份目录,注意,该目录必须是 mydumper 生成的, myloader 会判断该目录下是否存在 metadata 文件;

-q ,即 queries-per-transaction ,表示在工作线程导入表数据时,多少条记录做一次 commit ,默认为 1000 ;

-o ,该参数作用于 myloader 第一阶段,为 true 时会删除目标数据库实例对应数据库下的同名表;

-B ,表示恢复时,将表恢复到指定的数据库中;

-s ,该参数为 myloader 0.9.1 新增参数,用于恢复备份目录中指定的数据库;

-e ,表示在恢复时开启 BinLog ;

-t ,表示主线程需要创建的工作线程数目,影响 myloader 数据恢复并发度,需要综合存储 IO 性能等因素确定具体值。

网易 RDS 对 myloader 工具做了以下几点优化:

增强-s 参数,官方版本-s 仅能指定某个数据库,网易 RDS 对其进行了增强,可以指定多个数据库;

增加-M 参数,用于在多线程情况下,调节数据并发度,如设置 Threads_running=100 ,则工作线程在读取每个数据文件前,会先判断当前数据库实例负载是否达到或超过该值,若是,则该工作线程暂时进入休眠状态;

与 mydumper 相似,网易 RDS 为 myloader 也增加了进度查询功能,能够查询工作线程所需执行的所有导入任务数、当前已经完成的导入任务数及每个导入任务所花费时间。