文档章节

技术分享 | MTS并行增量应用

爱可生
 爱可生
发布于 07/15 10:05
字数 999
阅读 25
收藏 2

原创作者: 爱可生开源社区


MySQL 的复制延迟在早期版本一直存在,MySQL 5.6.3 版本后开始支持并行复制,并在 5.7进一步完善可用并行复制功能,官方将该功能称为 enhanced multi-threaded slave(简称 MTS),从此复制延迟问题得到很大的改善。

 

功能背景

DTLE([爱可生数据传输组件])项目组在 2018年9月4日提出内部功能性需求(issue #211)实现支持 MTS 并行回放功能。

https://github.com/actiontech/dtle

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 

设置组提交相关参数参数,之前的版本这两个参数不存在。

1. -- group_commit 等待时间. 大则并行度提高, 但可能造成空等导致响应变慢
2. set global binlog_group_commit_sync_delay=10000; -- 10ms
3. -- group_commit 立即提交TX数量: 即使等待时间未达到, 积压的TX达到此数量则立刻提交
4. set global binlog_group_commit_sync_no_delay_count=32; -- less or equal to thread number

3. DTLE 配置支持 MTS  job

事先配置 一个 DTLE 的 job.json 文件,需要将 ParallelWorkers 参数设置为为并行的线程数

1. {
2. "Type": "Dest",
3. "NodeName": "udup1",
4. "Driver": "MySQL",
5. "Config": {
6. "Gtid": "",
7. "ApproveHeterogeneous":true,
8. "ReplChanBufferSize": 600,
9. "ParallelWorkers": 16,
10. "ConnectionConfig": {
11. "Host":"127.0.0.1",
12. "Port": 3308,
13. "User": "root",
14. "Password": "password"
15. }
16. }
17. }

注意:MTS仅影响增量复制

4.生成 MTS 

1. 纯 INSERT(可用于性能 benchmark, 无益于正确性检测)。生成器:

https://github.com/actiontech/dtle/files/3372365/main.go.zip

2. 通过 sysbench 等多线程写入(增+删+改)。

5.观察 MTS Binlog

dtle/helper/mtswatcher/mtswatcher.go

1. cd dtle
2. make mtswatcher
3. # auto get newest gtid
4. ./dist/mtswatcher -host 127.0.0.1 -port 3308 -user root -password password
5. # or assign an (executed) gtid
6. ./dist/mtswatcher -host 127.0.0.1 -port 3308 -user root -password password -gtid "f2a4aa16-c8e6-11e7-9ff0-e19f7778f563:1-860460"

输出:属于同一 LC 的 TX 数量

1. lc: 4065 nTxOfThisLc: 16 totalTx: 4077
2. lc: 4081 nTxOfThisLc: 16 totalTx: 4093
3. lc: 4097 nTxOfThisLc: 6 totalTx: 4099
4. lc: 4103 nTxOfThisLc: 1 totalTx: 4100
5. lc: 4104 nTxOfThisLc: 16 totalTx: 4116
6. lc: 4120 nTxOfThisLc: 16 totalTx: 4132

6.版本注

  • 5.7 -> 5.6

∘依旧可并行回放

  • 5.6 -> 5.*

∘如果 seq 为 0,则将其视为 5.6 binlogEntry 并按顺序重播。

7.简单测

使用如上生成器生成 64000 rows(MySQL 并行度 64)

1. -- 目标端
2. set global binlog_group_commit_sync_delay = 10000; -- 10000us = 10ms
3. set global binlog_group_commit_sync_no_delay_count = 16;
  • 回放全部64000行,"ParallelWorkers": 16,花费时间:1m21s

  • 在上述时间(1m21s)内,使用MTS代码进行单线程回放可以回放9815 行

  • 在上述时间内,使用老版代码回放,可以回放8942 行

MTS回放速度是单线程的6倍左右!!!

8.

DTLE 不仅关注数据传输的效率,也可优化数据回放效率,能够很好的支持 MySQL 的MTS功能实现数据的并行回放。在回放过程中,在源端的 MySQL 中提前设置好恰当的 MTS 的参数,再根据 DTLE 的配置,即可利用 MySQL 5.7 的 MTS 机制增加回放速度。

© 著作权归作者所有

爱可生
粉丝 12
博文 152
码字总数 290849
作品 1
徐汇
私信 提问
故障分析|浅谈ERROR 1872与5.6/5.7 MTS group recovery

转自:神谕的暗影长廊 最近遇到一个在MTS环境下,ERROR 1872 Slave failed to initialize relay log info structure from the repository的故障。本文将浅显分析在MTS环境下,该错误的成因,...

3306pai
05/21
0
0
MySQL 5.7并行复制实现原理与调优

文章转自: http://mp.weixin.qq.com/s?_biz=MjM5MjIxNDA4NA==&mid=205236417&idx=1&sn=15281c834348911cea106478aa819175#rd 2015-05-26 姜承尧 InsideMySQL 前言 这篇文章花了Inside君整整......

浮生凤年
2018/06/26
0
0
MySQL开源数据传输中间件架构设计实践

本文根据洪斌10月27日在「3306π」技术 Meetup - 武汉站现场演讲内容整理而成。 主要内容: 本次分享将介绍目前数据迁移、数据同步、数据消费,多IDC架构中数据复制技术所面临问题及现有的产...

爱可生
2018/11/07
85
0
MySQL · 功能分析 · 5.6 并行复制实现分析

背景 我们知道MySQL的主备同步是通过binlog在备库重放进行的,IO线程把主库binlog拉过去存入relaylog,然后SQL线程重放 relaylog 中的event,然而这种模式有一个问题就是SQL线程只有一个,在...

阿里云RDS-数据库内核组
2015/08/10
0
0
mysql主从复制出现Waiting for Slave Worker to release partition

实为吾之愚见,望诸君酌之!闻过则喜,与君共勉 第一节 并行复制 Mysql5.6的mts(并行复制)是基于database来分发事务的,coordinator(原来的sql thread)按照slave worker与db的对应关系进行处理...

手辨
2017/09/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS3 : transition 属性

本文转载于:专业的前端网站➧CSS3 : transition 属性 CSS3的 transition 属性用于状态过度效果! 1、语法: 1 transition: property duration timing-function delay;2 -moz-transition: ...

前端老手
28分钟前
6
0
一个简单的加密工具,性能貌似不行,待优化

一个简单的加密工具,性能貌似不行,待优化 package com.kxvz.common.crypt;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import java.i......

Kxvz
30分钟前
5
0
vue实现路由懒加载

一、为什么要实现懒加载 减少首屏加载时间,避免白屏 二、常用的懒加载方式有两种:即使用vue异步组件 和 ES中的import a、vue异步加载: import Vue from 'vue' import Router from 'vue-ro...

Bing309
33分钟前
7
0
axios拦截器

axios.interceptors.response.use(response => { if (response.data.code == 0) { return response.data } else if (response.data.code == 600) { Cookies.remove('Admin-Token') router.pu......

Cyoya
35分钟前
6
0
给大家分享下部署云桌面的几个小技巧

从去年4月份开始我们公司就开始使用云桌面来进行上网办公的,在这一年多的使用过程中并没有出现像网上和有些用户说的那样,说云桌面各种坑老是出现这样和那样的问题,而我们之所以用的还不错...

GZASD
35分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部