解密网易MySQL实例迁移高效完成背后的黑科技
《解密网易MySQL实例迁移高效完成背后的黑科技》要点: 网易蜂巢团队:为企业提供专业容器云平台,深度整合IaaS、PaaS及容器技术,提供弹性计算、DevOps工具链、微服务基础设施等服务,帮助企业解决IT、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台. 1简介我们把数据库里部分或全部Schema和数据迁移到另一个实例的行为称为实例迁移,将导出数据的实例称为源实例,导入数据的实例称为目标实例.根据迁移数据库类型的不同,可以分为同种数据库之间的迁移,如从MySQL迁到MySQL;跨数据库类型的迁移,如从Oracle迁移到MySQL等.本文将介绍蜂巢RDS实例迁移功能的实现,并探讨如何高效完成实例迁移任务. 2使用场景那么,为什么要进行MySQL实例迁移呢?实例迁移的场景归纳起来主要有以下几种: 1、从自建实例迁移到RDS:在云服务还未充分推广时,存在大量的自建数据库实例,举网易公司为例,网易博客、网易邮箱等产品数百个MySQL实例直接部署在物理服务器上,随着业务的扩展,必然要对实例进行扩容、升规格等操作,相比自建实例,RDS实例在故障处理、在线扩容、升级等方面存在天然的优势,所以,目前绝大部分网易互联网产品的数据库均已使用实例迁移功能迁移到RDS上; 2、从其他公有云平台迁移到RDS:蜂巢RDS推出近一年以来,很多用户将部署在其他公有云平台上的MySQL实例迁移到蜂巢RDS上,对实例迁移功能进行统计发现有50%是用于迁移其他公有云的MySQL实例. 3实例迁移技术实现在设计实例迁移功能前,我们对业界公有云进行了充分调研,仅有两家主流公有云平台提供实例迁移功能,那么为什么仅两家呢,主要是因为提供在线实例迁移功能需要解决一系列问题,概括起来有以下几点: 1、如何快速地对源实例进行一致性数据备份? 2、如何处理备份过程中对源实例业务的影响? 3、如何快速地将备份导入到目标实例? 4、如何同步源实例的增量数据到目标实例? 5、如何确保实例迁移高效完成? 下面逐条解析蜂巢RDS是如何解决这些难题的. 多线程逻辑备份我们解决第一个问题的方法是采用多线程逻辑备份的方式来进行源实例一致性数据导出. MySQL的数据备份工具有很多,逻辑备份工具包括经典的mysqlpump,MySQL 5.7版本新推出的mysqlpump,Percona开源工具mydumper;物理备份主要是Percona的xtrabackup工具.俗话说没有最好的,只有最合适的,那么在这些备份工具中,哪种工具最适合用于进行实例迁移呢?我们的答案是mydumper. 首先我们排除了xtrabackup,虽然物理备份在性能上有优势,但其无法在远程备份源实例,在进行实例迁移时,我们不可能要求用户赋予操作源实例服务器的权限,尤其在迁移其他公有云平台的RDS实例时更不现实.此外,物理备份产生的备份数据往往比逻辑备份导出的数据更大,因为xtrabackup直接拷贝物理文件,而逻辑备份是导出SQL语句.下面是我们对几种备份工具的对比测试结果,可供参考: 排除了物理备份后,还有三个选项:mysqldump、mysqlpump和mydumper.我们最终选择了mydumper,因为mydumper是多线程的.等等!了解MySQL的同学会质疑,mysqlpump也是多线程的?对,mysqlpump的多线程思想甚至比mydumper更先进,详见参考文献1和2.但mysqlpump是表级的并发,且还不成熟,而mydumper是记录级的并发,针对单个大表的场景,更容易发挥多线程优势. 也许你会好奇,mydumper是如何实现记录级的多线程一致性备份的,其备份流程图如下: mydumper由主线程和多个工作线程配合完成数据一致性备份,主线程执行FTWRL或Lock Tables tablelist Read阻塞写操作来建立一致性备份点并记录当前BinLog和GTID.工作线程在主线程仍持有锁的情况下将各session的事务级别设置为可重复读(repeatable-read),并开始进行快照读,由于此时各表无法进行数据写入或更新,所以工作线程快照读的数据就是主线程建立一致性备份点的数据.待所有工作线程均已开始快照读后,如果不存在MyISAM等非事务性表,主线程即可释放读锁.mydumper原理的详细分析详见参考文献3. 业务负载监控与调整无论是物理备份还是逻辑备份,都会或多或少对数据库线上业务造成影响.如何处理备份过程中对源实例业务的影响是我们需要解决的第二个问题.蜂巢RDS实例的设计原则是线上业务永远比迁移任务更重要.由于无法有效了解源实例所在服务器层的监控数据,我们在MySQL数据库层进行大量的优化来减低影响,包括引入持锁时间超时机制、基于业务负载智能调整导出并发度和InnoDB Buffer Pool(BP)污染控制等. 如前所述,为了能够得到一致性的数据,各种备份工具,包括xtrabackup和mydumper,都需要有个短暂给源实例加读锁的过程,正常情况下短暂,但也会有例外,如源实例中存在数据量较大的MyISAM表时,持锁时间会变长. (编辑:ASP站长网) |