A-A+

TenDB单表并行恢复工具发布

2014年01月31日 TenDB 暂无评论

【项目背景】

TenDB开发团队对大表拆分备份、并行恢复的方案进行可行性分析,并对收益进行评测,详情请猛戳这里:TenDB单表并行恢复方案评测 (以下简称“评测”)。 目前,单表并行恢复方案已经完整实现,并在xxx广东1区及若干小业务中完成灰度;与此同时,本版本还提供了对binary备份的支持,让字符集问题不再吓坏我们的小伙伴。

【项目收益】

xxx广东1区数据并发导入所需时间由原先的18.7小时缩短到7.1小时,速度提升163%

通过对线上业务进行灰度,实现以下目标:

  1. 在现网环境中验证了备份脚本、备份配置、恢复脚本与GCS平台兼容;
  2. 在真实数据环境下对单表做切分备份和恢复,能严格保证数据一致性;
  3. 对不启用/启用单表并发备份恢复进行性能比对,量化收益数据;

【性能测试】

图片1

【数据解读】

  1. 单表并发恢复可以严格保证数据一致性;
  2. 当切片参数(--split_count)取CPU核数附近时,恢复性能近似达到测试最优; 根据测试结果,我们决定采用--largetable_size=10G --split_count=10这个较优结果作为发布版本的新增配置项。
  3. 并发恢复引起的碎片,导致全表read性能损耗在Z3机器上可以忽略不计;根据checksum操作时间,得知在A5机器上会引起18%的读性能下降。

【开发要点】

1. 新增选项

修改mysqldump源代码,增加2个新选项,用于控制mysqldump对size大于一定阈值的表进行拆分备份。 它们分别是--largetable_size,--split_count 仅当--gztab选项被打开时,以下参数组合才可用来控制并发恢复所需的单表切片: mysqldump --gztab=/VALID/DIR/PATH --largetable_size=100G --split_count=10

当单表大于100G时,备份切分为10个分片,按行数均匀切分,最后一个分片的行数小于等于平均值。 注意:实际切分数并不一定等于--split_count指定参数。根据show table status或information_schema.tables中得到的表行数是一个近似值,实际行数会有偏差,但这不会影响数据一致性。

2. --add-locks选项

当--add-locks选项被打开时(--add-locks默认是被打开的,可以通过--skip-opt关闭。当--skip-opt有效时显式指定--add-locks则依然会加锁。),--largetable_size或--split_count不能一起指定,否则进程会出错退出。 原因是--add-locks会在INSERT INTO语句段落前后对表加上写锁,导致看似并发恢复,而实际依然是串行恢复。 为了避免出现这样隐晦而难以排查的错误,我们在选项解析阶段就提前制止这种情况的发生。

3. --disable-keys选项

当--disable-keys选项被打开时(--disable-keys默认是被打开的,可以通过--skip-opt关闭。当--skip-opt有效时需要显式指定--disable-keys。),并且实际分片数大于备份功能被正确启用,那么在INSERT INTO语句之前都会加上 "/*!40000 ALTER TABLE `table_name` DISABLE KEYS */;" 在INSERT INTO语句段结束后恢复: "/*!40000 ALTER TABLE `table_name` ENABLE KEYS */;"

从manual上看,DISABLE KEYS 在MySQL v5.5+中仅对MyISAM存储引擎有增加恢复性能的作用,对InnoDB引擎不再有用。所以实际使用中,我们的备份工具并没有打开此选项。 注意:若业务方有备份&恢复MyISAM表的需求,请打开此选项,可以提升不少性能。

4. dbbackup.conf 备份配置

dbbackup.conf如下图所示,红色部分是本次升级新增参数值。如前所述,mysqldump并行备份依赖于有效--gztab选项,对应dbbackup.conf中的配置项,就是BackType=GZTAB。 LargetableSize的参数值对应mysqldump中--largetable_size选项,对应的字符串单位包括B(Byte),M(MByte),G(GByte),T(TByte). 如果没有单位,默认是B(Byte)。 SplitCount的参数值对应mysqldump中--split_count选项,对应值是整数。

图片2

5. dbbackup.pl 备份脚本

对上述新增选项进行校验、组合,在满足条件的情况下,将--largetable_size=xxx --split_count=xxx传入mysqldump可执行程序。

6. MLOAD.pl 备份脚本
  • 原有MLOAD.pl用如下数据结构维护META信息: $meta_info->{$db}->{$tb}->{$type} ==> a file path 因为原有数据在数据库名-数据表名-类型名一致的情况下,对应唯一dump文件。 现在的逻辑要求在数据库名-数据表名-类型名一致的情况下,对应一批dump文件,且这些文件路径是去重的。没错,只需加一个set装载文件序列即可: $meta_info->{$db}->{$tb}->{$type} ==> a set of dumpped file paths
  • 加强了IMPORT DATA部分的日志打印,将起止时间都记录下来便于排查问题。
  • 引入了一个新包:use List::Util qw/shuffle/ shuffle函数存在于v5.8以上的perl环境中,所以对于v5.8+的perl,我们使用shuffle函数将META中输入文件列表“打散”,不再按db->table顺序恢复;对于v5.8以下老版本的perl运行时环境,依然按照db->table顺序恢复。 目的是大大降低时间片段内多个并发进程同时对相同表插入数据的概率。并发恢复同一个表引起数据库底层竞争而引发的性能损耗,是我们增加这个优化点的原因。
7. 支持binary备份和恢复

本版本加入了对--default-character-set=binary 的备份和恢复支持。MySQL备份时选择字符集是一个难题,特别是字符集不定的业务。实际上,如果使用binary进行备份,就不会存在字符集的转换过程。 但是,当前版本的MySQL使用binary字符集备份并不完美,甚至说是存在bug:备份schema信息(包括表结构、字段注释等)使用的是utf8字符集,而字段的default value信息是和表内容字符集绑定在一起,即可能是任意字符集! 为了解决这个问题,我们在mysqldump时,执行create table语句之前,将character_set_client和character_set_connection同时设置为utf8字符集。这样在恢复数据时,client和connection不会发生字符集转换。当schema结构、字段default value、表内容这些数据落地的时候,根据各自设定的字符集进行解释。 当前,我们的测试和灰度都已经覆盖这种特殊情况。但应用到具体业务中去,还得根据需求,联合开发、运维,逐一确认细节方可实施,以免出现意外情况。这次发布后,现网的备份依然会采用相对保守的非binary备份策略,和以前保持一致,望周知。

原创文章,转载请注明: 转载自腾讯游戏DBA团队

本文链接地址: TenDB单表并行恢复工具发布

文章的脚注信息由WordPress的wp-posturl插件自动生成

Copyright © 腾讯游戏DBA团队 保留所有权利.  

用户登录

分享到: