MySQL数据同步解构和自研优化工具

1,582 阅读5分钟

作者 Dmall Talker·陈然 多点Dmall-新业务与共享平台研发部

背景

多点在实施单元化项目时,会将数据库部署在中心和异地单元,为了实现业务处理过程能在单元内闭环,相关数据写入操作需要进行异地同步。同时,这种场景下与普通MySQL主从/主主同步存在不同的要求。

主要区别有:

1.  单元间需要根据表和字段值过滤,只需要同步部分数据。

2.  同步要过滤掉所有DDL操作,保证表结构安全。

3.  存在多个单元数据表向中心汇总和双向复制情况。

因为适应以上要求,数据库团队开发了以数据库Binlog解析、写事件过滤、SQL重构,合并执行等为核心模块,满足单元化场景下的数据同步。在此基础上,还整合开发同步链路管理后台,为快速部署/实时管理/可用性等要求提供保障机制。成为一个较完整的数据同步中心(Data Replication Center,简称DRC)。

目前公司业务发展迅速,数据库/表迁移拆分等场景越来越多,利用DRC的实现,我们衍生出一套保障数据平滑迁移的自动化工具。

实现原理

数据同步分为全量同步和增量同步两部分。

全量同步使用show master status,记录当前位点/GTID信息。之后将源MySQL表的全量数据拉取,使用replace into语句写入到目标MySQL。全量同步后启动增量同步过程,增量同步使用全量同步开始时刻获得的位点/GTID信息保障数据完整性。在全量同步期间产生的Binlog因为重构SQL的幂等性,可以保障数据一致。 增量同步核心模块分为Replicator和Applier两部分,简要结构如下图:

1.png Replicator负责建立对源MySQL的连接,它使用全量同步阶段获得的起始位点/GTID向源MySQL发起主从同步请求,开始Binlog事件流监听。根据WRITE_ROWS_EVENT/UPDATE_ROWS_EVENT/DELETE_ROWS_EVENT等写事件,Replicator可以感知源库写入记录行是否满足过滤规则中配置的表/列值是否符合要求,对满足过滤规则的写操作,Replicator解析Binlog为对外申明的Protobuff格式Event数据放入到内部缓冲队列中,等待外部应用拉取。

Applier向Replicator请求其内部缓冲队列中的Event数据,每个数据体中包含对表个多行操作,Applier内部会数据体中变更行进行SQL重新生成和合并整理,保障执行顺序严格与源端一致,同时兼顾SQL执行效率。简要描述如下:

2.png Applier每次完成执行的数据会发送ACK通知Replicator。Replicator将执行数据对应的位点/GTID保存到zookeeper中,保障Replicator重启后增量同步阶段能从上一次成功执行的位点继续监听Binlog。

集群管理和可用性保障

具备数据同步功能后,DRC仅能通过手动部署的方式运行。为了进行可视化管理和持续集成,我们开发了管理后端DRC-Manager。能对所有中心和单元链路进行配置修改、运行状态查、快速部署、核心模块升级等功能。DRC-Manager使DRC称为能高效平台化操作工具。

DRC-Manager 实现和HA

DRC-Manager(以下称manager)集群在所有DRC核心模块的服务器部署,通过zookeeper选择主结点,主从节点通关心跳机制管控集群内从结点运行状况。在单结点内manager管理本台设备的所有链路定时发送的运行状况报告,并做运行时监控/守护/告警。

当manager主结点发现有从结点故障时,可以将故障结点上运行的链路自动迁移至单元内其他结点上运行,从而实现可用性保障。

3.png DRC 与数据库MHA联动

为保障线上数据库进行主从切换时,DRC组件能实时感知到环境变化,切换源目的端数据库,我们设计了一套MHA与DRC联动机制。将MHA发生HA时调用的触发程序(master_ip_failover)内的新旧主库信息(ip,port,位点,gtid等)通知到DRC-Manager。DRC-Manager在所有链路中查询受到影响的链路,变更同步配置信息,将源/目的端MySQL切换到可用实例,并从可靠位点/GTID开始进行增量同步过程。

4.png

数据表平滑迁移工具

当前线上运行的数据库/表数量增加迅速,DBA同学经常接到研发部门要求迁移表或分库分表需求,以满足业务应用的垂直拆分或表的横向扩容场景,以前需要DBA经过比较繁琐的配置和数据清理操作。DRC技术具备天然支持表的迁移/拆分特性,针对这种情况,我们开发了垂直业务拆分/分库分表自动化工具,使表的迁移拆分高效平滑。

5.png 因为数据迁移不存在Binlog过滤问题我们将全量和增量的Replicator/Applier进行合并,增加目标端MySQL实例路由和表路由功能,上图演示一张table_dmall数据表根据order_no列拆分为2库100张分表的情况。根据验证情况,线上同时拆分2张1-4亿数据量的单表为200张分表,同步时间在2小时左右,迁移切换期间对线上业务无影响。