多线程复制

多线程复制MTS(Mult-Threaded Slave Applier)指使用多个线程来并发应用二进制日志。
在MYSQL5.6版本中,多线程复制基于schema来实现,将多个数据库下的事务按照数据库拆分到多个线程上执行,保证数据库级别的事务一致性。
在MYSQL5.7版本后,多线程复制基于主库上并发信息来实现,主库上并发提交的事务不存在事务冲突,在从库上拆分到多个线程执行,保证实例级别的事务一致性。

设置和多线程复制类型和复制线程数:

##设置多线程复制类型和复制线程数:
SET GLOBAL slave_parallel_type='DATABASE';
SET GLOBAL slave_parallel_type='LOGICAL_CLOCK';
SET GLOBAL slave_parallel_workers =8;## 查看多线程复制类型和复制线程数
SELECT @@slave_parallel_type,@@slave_parallel_workers;

基于DATABASE的多线程复制

在MySQL 5.6中引入该特性,如果主库上存在多个数据库,每个数据库的事务相互独立于其他数据库,因此只需要保证数据库内部的事务运行顺序和主库上的运行顺序一致,就可以保证主库和从库上的数据相同。

在MYSQL中开启并行复制功能,SQL线程会变成coordinator线程,coordinator线程会对二进制日志的event进行判断:
1、如果判断事件可以被并行执行,那么选择相应worker线程应用BINLOG事件
2、如果判断事件不可以被并行执行,如DDL操作或跨schema事务,则等待所有worker线程执行完成后,再执行该BINLOG事件。
coordinator线程不仅分发BINLOG事件,也可以执行BINLOG事件。

当实例上数据库数量较少或应用主要对某个数据库进行读写,并行复制的性能可能会比单线程复制更差。
对于跨数据库的事务或跨数据库的外键,都会导致无法多线程并行执行。

基于DATABASE的多线程复制模式下执行位点问题:
1、MySQL使用Low-Water-Mark标记来最小已完成事件点,当发生宕机恢复时,根据Low-Water-Mark标记值来重放其后面的事件,而其中部分事件可能已被执行,重复执行可能会导致SQL线程异常或数据异常。
2、MySQL使用checkpint方式来推进APPLY主库BINLOG的位置,使用SHOW SLAVE STATUS命令显示的Exec_master_log_pos值是最近一次checkpint时的位点,而不是最后一个APPLY事务的值。
3、运行SQL_SLAVE_SKIP_COUNTER命令存在风险,可能会跳过其他事务。
4、对从库进行备份获取到的执行位点可能不是正确位点
5、当多个数据库执行进度相差较大时,可以使用START SLAVE UNITL SQL_AFTER_MTS_GAPS语句来等待延迟较大的数据库执行。

基于LOGICAL_CLOCK的多线程复制

在MySQL 5.7版本中引入,在主库上的某个时间点上,所有完成excution处于prepare阶段的事务都处于一个"相同的数据库版本"上,这些事务之间不存在阻塞或者依赖,因此可以赋予一个相同的时间戳;拥有相同时间戳的事务可以在从库上并行执行并且不会导致相互等待。如果事务间存在依赖,那么被阻塞的事务肯定处于Execution状态而不会进入Prepare状态。

如上图中三个事务:

1、T1事务和T2事务的Commit阶段有重合部分,T2事务和T3事务的Commit阶段有重合部分,因此T1和T2可以在从库上并发执行,T2和T3可以在从库上并发执行。

2、T1事务和T3事务的Commit阶段没有有重合部分,无法判断T3事务是否依赖于T1事务,因此T1和T3不能在从库上并发执行。

Transactions with overlapping commit window can be executed in parallel;

在MYSQL 5.7版本的二进制日志中增加了last_committed和sequence_number,sequence_number表示当前语句所使用的编号,使用last_committed表示当前语句提交时的上一次组提交事务中最大的sequence_number。

相同last_committed的事件可以并行执行,无需考虑事件中的sequence_number。

#150520 14:23:11 server id 88 end_log_pos 259 CRC32 0x4ead9ad6 GTID last_committed=0 sequence_number=1
#150520 14:23:11 server id 88 end_log_pos 1483 CRC32 0xdf94bc85 GTID last_committed=0 sequence_number=2
#150520 14:23:11 server id 88 end_log_pos 2708 CRC32 0x0914697b GTID last_committed=0 sequence_number=3
#150520 14:23:11 server id 88 end_log_pos 3934 CRC32 0xd9cb4a43 GTID last_committed=0 sequence_number=4
#150520 14:23:11 server id 88 end_log_pos 5159 CRC32 0x06a6f531 GTID last_committed=0 sequence_number=5
#150520 14:23:11 server id 88 end_log_pos 6386 CRC32 0xd6cae930 GTID last_committed=0 sequence_number=6
#150520 14:23:11 server id 88 end_log_pos 7610 CRC32 0xa1ea531c GTID last_committed=6 sequence_number=7
#150520 14:23:11 server id 88 end_log_pos 8834 CRC32 0x96864e6b GTID last_committed=6 sequence_number=8
#150520 14:23:11 server id 88 end_log_pos 10057 CRC32 0x2de1ae55 GTID last_committed=6 sequence_number=9
#150520 14:23:11 server id 88 end_log_pos 11280 CRC32 0x5eb13091 GTID last_committed=6 sequence_number=10
#150520 14:23:11 server id 88 end_log_pos 12504 CRC32 0x16721011 GTID last_committed=6 sequence_number=11
#150520 14:23:11 server id 88 end_log_pos 13727 CRC32 0xe2210ab6 GTID last_committed=6 sequence_number=12
#150520 14:23:11 server id 88 end_log_pos 14952 CRC32 0xf41181d3 GTID last_committed=12 sequence_number=13

多线程复制模式下的事务执行顺序:

MySQL通过参数slave_preserve_commit_order可以控制Slave上的binlog提交顺序和Master上的binlog的提交顺序一样,保证GTID的顺序。该参数只能用于开启了logical clock并且启用了binlog的复制。即对于多线程复制,该参数用来保障事务在slave上执行的顺序与relay log中的顺序严格一致。开启该参数可能会有一点的消耗,因为会让slave的binlog提交产生等待。

比如两个事务依次操作了2个DB:A和B,尽管事务A、B分别被worker X、Y线程接收,但是因为线程调度的问题,有可能导致A的执行时机落后于B。如果经常是“跨DB”操作,那么可以考虑使用此参数限定顺序。当此参数开启时,要求任何worker线程执行事务时,只有当前事务中之前的所有事务都执行后(被其他worker线程执行),才能执行和提交。(每个事务中,都记录了当前GTID的privious GTID,只有privious GTID被提交后,当前GTID事务才能提交)。

建议在生产环境开启该参数。

转载于:https://www.cnblogs.com/gaogao67/p/11151621.html

MySQL Replication--多线程复制MTS相关推荐

  1. MySQL\MariaDB 多线程复制初探

    背景: MariaDB 在10.0.5就已经支持了并行复制的功能,即从库多线程复制的功能.MySQL最先在5.6.3中支持.目前暂时没有用MySQL5.6的版本,故暂时只对MariaDB进行一些说明, ...

  2. mysql mts_MySQL新特性MTS

    一.MTS:多线程复制 MTS简介 在MySQL 5.6版本之前,Slave服务器上有两个线程I/O线程和SQL Thread线程.I/O线程负责接收二进制日志(Binary Log,更准确的说是二进 ...

  3. mysql多线程复制crash_MySQL 并行复制(MTS) 从库发生异常crash分析

    背景 半同步复制从库在晚上凌晨2点半发生异常crash,另一个异步复制从库在第二天凌晨3点也发生了异常crash. 版本 mysql 5.7.16 redhat 6.8 mysql> show ...

  4. mysql 5.7配置多线程复制,MySQL5.7复制功能实战,基于事务的复制,多源复制和多线程复制配置...

    这篇是幕课网-MySQL5.7复制功能实战视频教程的学习笔记.http://www.imooc.com/learn/589 第1章 MySQL复制基础 MySQL是异步复制 采取针对特定用户的读写分离 ...

  5. mysql 并行 更新_MySQL 并行复制(MTS) 从库更新的记录不存在实际却存在

    背景 开了并行复制的半同步从库SQL 线程报1032错误,异步复制从库没有报错,偶尔会出现这种 版本 mysql 5.7.16 redhat 6.8 mysql> show variables ...

  6. mysql多线程复制binlog_MySQL并发复制系列一:binlog组提交 (转载)

    http://blog.csdn.net/woqutechteam/article/details/51178803 MySQL  Binary log在MySQL 5.1版本后推出主要用于主备复制的 ...

  7. mysql mts_MySQL进一步完善可用并行复制-MTS并行增量的应用-爱可生

    原标题: MySQL进一步完善可用并行复制-MTS并行增量的应用-爱可生 MTS 并行增量应用 MySQL 的复制延迟在早期版本一直存在,MySQL 5.6.3 版本后开始支持并行复制,并在 5.7 ...

  8. MySQL5.7 Group Replication (MGR)--Mysql的组复制之多主模式

    MGR--Mysql的组复制之多主模式 以下测试在VMware环境: 操作系统:Centos 6.9 X86_64 数据库:Mysql 5.7 (mysql  Ver 14.14 Distrib 5. ...

  9. 《MySQL——备库多线程复制策略。》

    目录 备库并行复制能力 MySQL5.6版本 并行复制策略 MariaDB 并行复制策略 MySQL5.7版本 并行复制策略 MySQL5.7.22版本 并行复制策略 总结 备库并行复制能力 主要涉及 ...

最新文章

  1. 2018全球硬科技创新暨“一带一路”创新合作大会,这些硬科技都要来!
  2. 【转】Hadoop分布式集群搭建hadoop2.6+Ubuntu16.04
  3. RabbitMQ中的虚拟主机、交换机、消息队列、绑定、消息
  4. MATLAB应用实战系列(五十三)-模拟退火算法(附源码)
  5. Jenkins配置基于角色的项目权限管理--转
  6. 【学习心得】当程序员思路被打断
  7. 帝国cms文章页调用当前文章URL如何操作?
  8. How is XSRF token retrieved from backend server
  9. 优达学城深度学习之二——矩阵数学和Numpy复习
  10. hadoop.2.6.0安装hive.1.2.2
  11. SharePoint开发错误—列表自定义表单出现“未将对象引用设置到对象的实例”
  12. Android Zip解压缩目录穿越导致文件覆盖漏洞
  13. 层次分析法详细讲解(小白必看电脑查看)
  14. 测试了一周总结的模拟器玩刺激战场延迟卡顿完美解决办法
  15. maven日记(一):Maven使用入门
  16. 基于springboot的医院体检预约管理系统
  17. 国际象棋绘制java_java使用swing绘制国际象棋棋盘
  18. DIV布局强制英文换行(div英文不怎么给力啊~ 只有用别的方法啦)
  19. SQL语句实现查询SQL Server服务器名称和IP地址_MsSql
  20. weblogic反序列化介绍及环境搭建

热门文章

  1. 洛谷4366——最短路(dijkstra,思维,异或)
  2. win10安装mysql
  3. CriminalIntent项目开发--后篇
  4. STM32 FSMC学习笔记+补充(LCD的FSMC配置)
  5. ASP.NET Core 中文文档 第三章 原理(12)托管
  6. Docker 新网络 overlay 网络
  7. 提高你的Java代码质量吧:如果有必要,使用变长数组吧
  8. 聚集索引和非聚集索引实例
  9. 二叉树的建立和遍历的各种问题
  10. PostgreSQL-JDBC疑似bug:部分接口参数的表名、列名必须全部小写