MySQL5.7的组提交与并行复制实例教程

从MySQL5.5版本以后,开始引入并行复制的机制,是MySQL的一个非常重要的特性。MySQL5.6开始支持以schema为维度的并行复制,即如果binlog row event操作的是不同的schema的对象,在确定没有DDL和foreign key依赖的情况下,就可以实现并行复制。社区也有引入以表为维度或者以记录为维度的并行复制的版本,不管是schema,table或者record,都是建立在备库slave实时解析row格式的event进行判断,保证没有冲突的情况下,进行分发来实现并行。MySQL5.7的并行复制,multi-threaded slave即MTS,期望最大化还原主库的并行度,实现方式是在binlog event中增加必要的信息,以便slave节点根据这些信息实现并行复制。MySQL 5.7的并行复制建立在group commit的基础上,所有在主库上能够完成prepared的语句表示没有数据冲突,就可以在slave节点并行复制。关于MySQL5.7的组提交,我们要看下以下的参数:

mysql> show global variables like '%group_commit%';+-----------------------------------------+-------+| Variable_name | Value |+-----------------------------------------+-------+| binlog_group_commit_sync_delay | 0 || binlog_group_commit_sync_no_delay_count | 0 |+-----------------------------------------+-------+2 rows in set (0.00 sec)

登录后复制

 

binlog_group_commit_sync_delay这个参数控制着日志在刷盘前日志提交要等待的时间,默认是0也就是说提交后立即刷盘,当设置为0以上的时候,就允许多个事物的日志同事一起提交刷盘,也就是我们说的组提交。组提交是并行复制的基础,我们设置这个值的大于0就代表打开了组提交的功能。最大值只能设置为1000000微妙。binlog_group_commit_sync_no_delay_count ,这个参数表示我们在binlog_group_commit_sync_delay等待时间内,如果事物数达到binlog_group_commit_sync_no_delay_count 设置的参数,就会触动一次组提交,如果这个值设为为0的话就不会有任何的影响。如果到达时间但是事物数并没有达到的话,也是会进行一次组提交操作的。组提交是个比较好玩的方式,我们根据MySQL的binlog就可以看得到组提交到底是怎么回事:

[root@mxqmongodb2 log]# mysqlbinlog mysql-bin.000005 |grep last_committed#170607 11:24:57 server id 353306 end_log_pos 876350 CRC32 0x92093332 GTID last_committed=654 sequence_number=655#170607 11:24:58 server id 353306 end_log_pos 880406 CRC32 0x344fdf71 GTID last_committed=655 sequence_number=656#170607 11:24:58 server id 353306 end_log_pos 888700 CRC32 0x4ba2b05b GTID last_committed=656 sequence_number=657#170607 11:24:58 server id 353306 end_log_pos 890675 CRC32 0xf8a8ad64 GTID last_committed=657 sequence_number=658#170607 11:24:58 server id 353306 end_log_pos 892770 CRC32 0x127f9cdd GTID last_committed=658 sequence_number=659#170607 11:24:58 server id 353306 end_log_pos 894757 CRC32 0x518abd93 GTID last_committed=659 sequence_number=660#170607 11:37:46 server id 353306 end_log_pos 895620 CRC32 0x99174f95 GTID last_committed=660 sequence_number=661#170607 11:37:51 server id 353306 end_log_pos 895897 CRC32 0xb4ffc341 GTID last_committed=661 sequence_number=662#170607 11:38:00 server id 353306 end_log_pos 896174 CRC32 0x6bcbc492 GTID last_committed=662 sequence_number=663#170607 11:39:40 server id 353306 end_log_pos 896365 CRC32 0x1fe16c7c GTID last_committed=663 sequence_number=664

登录后复制

 

上面是没有开启组提交的一个日志,我们可以看得到binlog当中有两个参数last_committed和sequence_number,我们可以看到,下一个事物的在主库配置好组提交以后,从库我们要加上如下的参数:last_committed永远都和上一个事物的sequence_number是相等的。这也很容易理解,因为事物是顺序提交的,这么理解起来并不奇怪。下面看一下组提交模式的事物:

[root@mxqmongodb2 log]# mysqlbinlog mysql-bin.000008|grep last_commit#170609 10:11:07 server id 353306 end_log_pos 75629 CRC32 0xd54f2604 GTID last_committed=269 sequence_number=270#170609 10:13:03 server id 353306 end_log_pos 75912 CRC32 0x43675b14 GTID last_committed=270 sequence_number=271#170609 10:13:24 server id 353306 end_log_pos 76195 CRC32 0x4f843438 GTID last_committed=270 sequence_number=272

登录后复制

 

我们可以看到最后两个事物的last_committed是相同的,这意味什么呢,意味着两个事物是作为一个组提交的,两个事物在perpare截断获取相同的last_committed而且相互不影响,最终是会作为一个组进行提交。这就是所谓的组提交。

#MTSslave-parallel-type=LOGICAL_CLOCKslave-parallel-workers=8 #太多的线程会增加线程间同步的开销,建议4-8个slave线程master_info_repository=TABLErelay_log_info_repository=TABLErelay_log_recovery=ONslave-parallel-type有两个之,DATABASE和LOGICAL_CLOCK,DATABASE: 默认值,兼容5.6以schema维度的并行复制, LOGICAL_CLOCK: MySQL 5.7基于组提交的并行复制机制。

登录后复制

综合来说,MySQL5.7的并行复制是基于主库的group commit和从库以下参数的配置:mysql> show variables like ‘%slave_para%’;

+------------------------+---------------+| Variable_name | Value |+------------------------+---------------+| slave_parallel_type | LOGICAL_CLOCK || slave_parallel_workers | 8 |+------------------------+---------------+2 rows in set (0.01 sec)

登录后复制

要想使用MySQL5.7的并行复制,必须首先主库设置binlog_group_commit_sync_delay大于0,然后在从库设置线程数和相关的方式。我们上面设置的是8,再从库就能看到

mysql> show processlist;+----+-------------+--------------------+------+---------+--------+--------------------------------------------------------+------------------+| Id | User        | Host               | db   | Command | Time   | State                                                  | Info             |+----+-------------+--------------------+------+---------+--------+--------------------------------------------------------+------------------+|  1 | system user |                    | NULL | Connect | 373198 | Waiting for master to send event                       | NULL             ||  2 | system user |                    | NULL | Connect |   1197 | Slave has read all relay log; waiting for more updates | NULL             ||  4 | system user |                    | NULL | Connect |   4292 | Waiting for an event from Coordinator                  | NULL             ||  5 | system user |                    | NULL | Connect | 373198 | Waiting for an event from Coordinator                  | NULL             ||  6 | system user |                    | NULL | Connect | 373198 | Waiting for an event from Coordinator                  | NULL             ||  7 | system user |                    | NULL | Connect | 373198 | Waiting for an event from Coordinator                  | NULL             ||  8 | system user |                    | NULL | Connect | 373198 | Waiting for an event from Coordinator                  | NULL             ||  9 | system user |                    | NULL | Connect | 373198 | Waiting for an event from Coordinator                  | NULL             || 10 | system user |                    | NULL | Connect | 373198 | Waiting for an event from Coordinator                  | NULL             || 11 | system user |                    | NULL | Connect | 373198 | Waiting for an event from Coordinator                  | NULL             || 16 | root        | 10.103.16.34:37263 | NULL | Query   |      0 | starting                                               | show processlist |+----+-------------+--------------------+------+---------+--------+--------------------------------------------------------+------------------+

登录后复制

从库会有八个线程来等待事物处理,已经不是一个了。

以上就是MySQL5.7的组提交与并行复制实例教程的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1620660.html

(0)
上一篇 2025年2月19日 01:00:09
下一篇 2025年2月19日 01:00:26

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Java框架在人工智能教育和研究中的意义

    在人工智能教育和研究中,java框架具有重大意义,提供以下优势:预构建组件和库,用于快速高效地开发ai应用程序。强大的生态系统,支持ai开发的各个方面。可跨平台,可在支持java虚拟机的平台上运行。开源,允许自由使用和修改。易于学习,便于初…

    2025年4月2日
    400
  • Vue 中如何实现拖拽元素的复制和移动?

    vue是一款流行的javascript框架,它提供了方便的拖拽功能,让我们可以轻易地实现元素的复制和移动。下面,我们就来看一下如何在vue中实现拖拽元素的复制和移动。 一、拖拽元素的基本实现 在Vue中实现拖拽元素的复制和移动,首先需要实现…

    编程技术 2025年4月1日
    200
  • Imageready蝶恋花 动画制作教程

    今天让我们用Imageready来做一个蝴蝶飞过鲜花的动态图,先看下效果吧:  制作步骤: 1、打开一张荷花图片做背景。副标题2、打开一张蝴蝶图片,用魔棒工具在白色区域点一下选中背景,Ctrl Shift I反选,就选出了蝴蝶。  #今天让…

    2025年4月1日 编程技术
    200
  • Photoshop下用滤镜和渐变制作超眩光圈效果教程

    本题利用滤镜和渐变制作的效果很漂亮,我给它起名《时光隧道》!你看象吗? 老规矩,没有复杂步骤,只有简单的重复操作。希望能给你启发哈^_^

    2025年4月1日
    100
  • Photoshop重复变形工具制作花朵效果

    本photoshop教程主要介绍使用重复变形工具制作花朵效果。思路:可以自己随意制作一些图案然后按Ctrl   Alt   Shift   T按一定的规律复制,图案可以使用多种图案组合这样效果更明显!最终效果1.新建一个600 * 600像…

    2025年4月1日
    200
  • photoshop绘制中国古典木质浮雕花纹屏障

    本教程介绍中国古典风格屏障的制作方法。思路:先用滤镜效果制作出木质纹理,然后再用慢慢制作浮雕的花纹及其它装饰。制作方法不是很难,不过创意及效果非常不错。最终效果1、首先新建文件,再新建一层,设置前后景色本教程介绍中国古典风格屏障的制作方法。…

    2025年4月1日 编程技术
    200
  • Photoshop转矢量素材为一块玉

    本Photoshop教程主要是利用一些简单的花纹素材图片制作漂亮的玉雕效果。制作的时候需要一点美术功底,能够表现玉的浮雕效果,新手可能比较费时间!最终效果素材副标题1.首先当然是启动PS,哈。 2.执行:文件-〉新建 如图。 3.打本Pho…

    2025年4月1日 编程技术
    100
  • Photoshop变换复制实例

    这是ps里一个简单而实用的功能,由于要用到几个组合键所以经常忘记怎么用,刚好在网上看到今天给大家发布下,需要的时候可以随时查阅。  

    2025年4月1日
    100
  • Photoshop制作简单的摇摆动画

    前面有一篇flash教程讲解了如何利用as制作不倒翁动画,今天我们利用photoshop来制作一个同样的动画,但是在photoshop就不能有交互了,大家只能是看到不倒翁动画了。相关文章:as实例之简单的不倒翁flash动画最终效果: 素材…

    2025年4月1日 编程技术
    100
  • Photoshop渲染滤镜制作发光球体

    我们在《Photoshop滤镜制作简单的云彩特效》中详细剖析了渲染类滤镜做特效的方法,今天我们来介绍具体的实例——辉煌太阳。   1、photoshop中新建图像,用默认的颜色执行【滤镜_渲染_分层云彩】,并按〖ctrl_f〗重复若干次。效…

    2025年4月1日 编程技术
    100

发表回复

登录后才能评论