MTS 并行增量应用MySQL 的复制延迟在早期版本一直存在,MySQL 5.6.3 版本后开始支持并行复制,并在 5.7 进一步完善可用并行复制功能,官方将该功能称为 enhanced multi-threaded slave (简称 MTS),从此复制延迟问题得到很大的改善。功能背景DTLE([爱可生数据传输组件](https://github.com/actiontech/dtle))项目组在 2018年9月4日提出内部功能性需求(issue #211)实现支持 MTS 并行回放功能。1.MTS (MySQL 5.7) 原理三问1)首要问题:哪些 TX 可以并行回放?(无冲突!!!)同一 group_commit 的 TX 可以并行回放,因为这些 TX 都进入了 prepare 阶段,事务之间无冲突。2)如何记录同一 group_commit ?每个 TX 都有 sequence number,同一个 binlog file 中 SeqNum 单调递增group_commit 时记录上一次 (group_) commit 的 TX 的 sequence number, 称为 LastCommit (LC)3)如何并行回放?LC 相同的 TX 可以并行回放LC 更大的 TX 需等待前一组 TX 全部执行完(MySQL 8.0 引入 WriteSet 并行回放,另议)想了解更多关于 MTS 的内容可翻阅社区文章社区投稿 | MySQL 主从复制延时常见场景及分析改善图解MySQL | [原理解析] MySQL组提交(group commit)2.MySQL 5.7 如何开启 MTS 支持设置组提交相关参数参数,之前的版本这两个参数不存在。 -- group_commit 等待时间. 大则并行度提高, 但可能造成空等导致响应变慢set global binlog_group_commit_sync_delay=10000; -- 10ms-- group_commit 立即提交TX数量: 即使等待时间未达到, 积压的TX达到此数量则立刻提交set global binlog_group_commit_sync_no_delay_count=32; -- less or equal to thread number 3.为 DTLE 配置支持 MTS 的 job事先配置 一个 DTLE 的 job.json 文件,需要将 ParallelWorkers 参数设置为为并行的线程数 { "Type": "Dest", "NodeName": "udup1", "Driver": "MySQL", "Config": { "Gtid": "", "ApproveHeterogeneous":true, "ReplChanBufferSize": 600, "ParallelWorkers": 16, "ConnectionConfig": { "Host":"127.0.0.1", "Port": 3308, "User": "root", "Password": "password" } } } 注意:MTS仅影响增量复制 4.生成 MTS 数据 1. 纯 INSERT(可用于性能 benchmark, 无益于正确性检测) 2. 通过 sysbench 等多线程写入(增+删+改)。 5.观察 MTS Binlog dtle/helper/mtswatcher/mtswatcher.go cd dtlemake mtswatcher# auto get newest gtid./dist/mtswatcher -host 127.0.0.1 -port 3308 -user root -password password# or assign an (executed) gtid./dist/mtswatcher -host 127.0.0.1 -port 3308 -user root -password password -gtid "f2a4aa16-c8e6-11e7-9ff0-e19f7778f563:1-860460" 输出:属于同一 LC 的 TX 数量 lc: 4065 nTxOfThisLc: 16 totalTx: 4077lc: 4081 nTxOfThisLc: 16 totalTx: 4093lc: 4097 nTxOfThisLc: 6 totalTx: 4099lc: 4103 nTxOfThisLc: 1 totalTx: 4100lc: 4104 nTxOfThisLc: 16 totalTx: 4116lc: 4120 nTxOfThisLc: 16 totalTx: 4132 6.版本注意 5.7 -> 5.6 ∘依旧可并行回放 5.6 -> 5.* ∘如果 seq 为 0,则将其视为 5.6 binlogEntry 并按顺序重播。 7.简单测试 使用如上生成器生成 64000 rows(MySQL 并行度 64) -- 目标端set global binlog_group_commit_sync_delay = 10000; -- 10000us = 10msset global binlog_group_commit_sync_no_delay_count = 16;64000 rows, udup job.json "ParallelWorkers": 16 1 m 21 s ∘同样的时间,MTS 代码(多线程单线程逻辑通用),单线程回放 “ParallelWorkers”:1 9815 rows ∘同样的时间,无 MTS 代码 8942 rows 8.总结 DTLE 不仅关注数据传输的效率,也可优化数据回放效率,能够很好的支持 MySQL 的MTS功能实现数据的并行回放。在回放过程中,在源端的 MySQL 中提前设置好恰当的 MTS 的参数,再根据 DTLE 的配置,即可利用 MySQL 5.7 的 MTS 机制增加回放速度。 近期社区动态 第三期 社区技术内容征稿 所有稿件,一经采用,均会为作者署名。 征稿主题:MySQL、分布式中间件DBLE、数据传输组件DTLE相关的技术内容 活动时间:2019年6月11日 – 7月11日 本期投稿奖励 投稿成功:京东卡200元*1 优秀稿件:京东卡200元*1+社区定制周边(包含:定制文化衫、定制伞、鼠标垫) 优秀稿件评选,文章获得“好看”数量排名前三的稿件为本期优秀稿件。 分类: DTLE 数据传输组件技术分享技术文章 标签:复制数据传输