一、环 境
复制拓扑: 一主两从
二、预 热
* 从库侧并行分发策略的逻辑图解: 假设下图中的L代表lock interval的开始,C代表lock interval的结束。

下面,我们一起来看看,除了撸源码总结并行复制原理之外,怎么通过MySQL暴露出来的一些信息来查看并行复制的踪迹。
三、揭 底
root@localhost : (none):28: > show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.10.30.162 Master_User: repl Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mysql-bin.000029 Read_Master_Log_Pos: 501683714 Relay_Log_File: mysql-relay-bin.000086 Relay_Log_Pos: 497690559 Relay_Master_Log_File: mysql-bin.000029 Slave_IO_Running: Yes Slave_SQL_Running: Yes ...... Exec_Master_Log_Pos: 501683714 Relay_Log_Space: 501684223 ...... Seconds_Behind_Master: 0 ......
为减少后续的日志解析量,在主库与从库都各自执行binlog日志切换。
# 主库 mysql > flush binary logs; Query OK, 0 rows affected (0.02 sec) # 从库 mysql > flush binary logs; Query OK, 0 rows affected (0.02 sec)
对主库sysbench加并发压力(这里为oltp事务模型)。
[root@physical-machine ~]# sysbench --db-driver=mysql --time=99999 --threads=32 --report-interval=1 --mysql-host=10.10.30.162 --mysql-port=3306 --mysql-user=qbench --mysql-password=qbench --mysql-db=sbtest --tables=2 --table-size=5000000 oltp_read_write --db-ps-mode=disable --mysql-ignore-errors=1062 run
在从库中反复执行如下语句,直到抓取到较多的数据行为止(任选其中一个从库即可)。
ysql > select THREAD_ID,SERVICE_STATE,LAST_APPLIED_TRANSACTION,APPLYING_TRANSACTION,APPLYING_TRANSACTION_START_APPLY_TIMESTAMP from performance_schema.replication_applier_status_by_worker where APPLYING_TRANSACTION!='' order by APPLYING_TRANSACTION;select * from sys.innodb_lock_waits\G +-----------+---------------+----------------------------------------------+----------------------------------------------+--------------------------------------------+ | THREAD_ID | SERVICE_STATE | LAST_APPLIED_TRANSACTION | APPLYING_TRANSACTION | APPLYING_TRANSACTION_START_APPLY_TIMESTAMP | +-----------+---------------+----------------------------------------------+----------------------------------------------+--------------------------------------------+ | 94 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536428 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536438 | 2019-08-27 09:53:16.941561 | | 95 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536429 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536439 | 2019-08-27 09:53:16.941590 | | 96 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536430 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536440 | 2019-08-27 09:53:16.941654 | | 97 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536431 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536441 | 2019-08-27 09:53:16.942482 | | 98 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536432 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536442 | 2019-08-27 09:53:16.942137 | | 99 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536433 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536443 | 2019-08-27 09:53:16.941958 | | 100 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536434 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536444 | 2019-08-27 09:53:16.941935 | | 101 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536435 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536445 | 2019-08-27 09:53:16.945607 | | 102 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536436 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536446 | 2019-08-27 09:53:16.945996 | | 103 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536423 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536447 | 2019-08-27 09:53:16.946397 | | 104 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536424 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536448 | 2019-08-27 09:53:16.946338 | | 105 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536425 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536449 | 2019-08-27 09:53:16.946429 | | 106 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536426 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536450 | 2019-08-27 09:53:16.946892 | | 107 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536396 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536451 | 2019-08-27 09:53:16.947253 | | 108 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536397 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536452 | 2019-08-27 09:53:16.947248 | | 109 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536398 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536453 | 2019-08-27 09:53:16.947896 | | 110 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536399 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536454 | 2019-08-27 09:53:16.948349 | | 111 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536400 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536455 | 2019-08-27 09:53:16.947968 | | 112 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536401 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536456 | 2019-08-27 09:53:16.948032 | | 113 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536402 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536457 | 2019-08-27 09:53:16.948247 | | 114 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536403 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536458 | 2019-08-27 09:53:16.948836 | | 115 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536404 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536459 | 2019-08-27 09:53:16.948152 | | 116 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536408 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536460 | 2019-08-27 09:53:16.948203 | | 117 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536409 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536461 | 2019-08-27 09:53:16.948407 | | 118 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536375 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536462 | 2019-08-27 09:53:16.948316 | | 119 | ON | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536376 | 364efb4f-c7e8-11e9-8f23-5254002a54f2:1536463 | 2019-08-27 09:53:16.948345 | +-----------+---------------+----------------------------------------------+----------------------------------------------+--------------------------------------------+ 26 rows in set (0.00 sec) Empty set (0.00 sec)
上述文本中,相比MySQL 5.7.22版本,我们使用了performance_schema.replication_applier_status_by_worker表中新增的3个字段(当然新增的字段还有很多时间戳的,这里并未使用)。
停止对主库加压的sysbench进程,并登陆到主库服务器中,解析最后一个binlog。
[root@node1 ~]# cd /data/mysqldata1/binlog/ [root@node1 binlog]# ll total 10530608 ...... -rw-r----- 1 mysql mysql 536879186 Aug 27 09:52 mysql-bin.000035 -rw-r----- 1 mysql mysql 91067601 Aug 27 09:53 mysql-bin.000036 -rw-r----- 1 mysql mysql 1092 Aug 26 10:55 mysql-bin.index [root@node1 binlog]# mysqlbinlog mysql-bin.000036 |grep -Ei 'last_committed|gtid_next' > a.sql
在主库中打开a.sql文件,并找到在从库中获取的GTID%20SET对应的日志记录(364efb4f-c7e8-11e9-8f23-5254002a54f2:1536438-1536463),从中找出对应事务的last_committed值。
[root@node1 binlog]# vim a.sql ...... #190827 9:53:16 server id 33061 end_log_pos 75854707 CRC32 0x1aeb8b8e GTID last_committed=35729 sequence_number=35755 rbr_only=yes original_committed_timestamp=1566870796937319 immediate_commit_timestamp=1566870796937319 transaction_length=1103 SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536438'/*!*/; # 为简化内容,以下将本案例中无用的类似"rbr_only=yes original_committed_timestamp=1566870796937319 immediate_commit_timestamp=1566870796937319 transaction_length=1103"信息删除 #190827 9:53:16 server id 33061 end_log_pos 75855810 CRC32 0xd6c147e8 GTID last_committed=35729 sequence_number=35756 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536439'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75857586 CRC32 0xae2abece GTID last_committed=35729 sequence_number=35757 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536440'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75859908 CRC32 0x2c865187 GTID last_committed=35729 sequence_number=35758 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536441'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75861566 CRC32 0xc902562d GTID last_committed=35743 sequence_number=35759 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536442'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75863342 CRC32 0xd424cb7a GTID last_committed=35743 sequence_number=35760 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536443'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75865000 CRC32 0xd02babfd GTID last_committed=35743 sequence_number=35761 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536444'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75867322 CRC32 0x4238d788 GTID last_committed=35743 sequence_number=35762 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536445'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75868980 CRC32 0x251ff97f GTID last_committed=35743 sequence_number=35763 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536446'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75871302 CRC32 0xd2d680c6 GTID last_committed=35743 sequence_number=35764 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536447'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75873078 CRC32 0x603e6480 GTID last_committed=35743 sequence_number=35765 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536448'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75875400 CRC32 0x5bc4e556 GTID last_committed=35743 sequence_number=35766 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536449'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75877722 CRC32 0x0d21cd79 GTID last_committed=35753 sequence_number=35767 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536450'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75879694 CRC32 0x8c8f8092 GTID last_committed=35743 sequence_number=35768 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536451'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75882016 CRC32 0xb99f0971 GTID last_committed=35753 sequence_number=35769 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536452'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75883674 CRC32 0x695fc9da GTID last_committed=35753 sequence_number=35770 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536453'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75885996 CRC32 0x942a4ed5 GTID last_committed=35753 sequence_number=35771 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536454'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75887772 CRC32 0xc63fbf2b GTID last_committed=35753 sequence_number=35772 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536455'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75889548 CRC32 0x685ba5c3 GTID last_committed=35753 sequence_number=35773 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536456'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75891870 CRC32 0xf1a9cd88 GTID last_committed=35753 sequence_number=35774 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536457'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75894192 CRC32 0xaf9c1dc5 GTID last_committed=35753 sequence_number=35775 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536458'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75896164 CRC32 0x5bd7a2b8 GTID last_committed=35753 sequence_number=35776 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536459'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75898486 CRC32 0x296ace5e GTID last_committed=35753 sequence_number=35777 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536460'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75900808 CRC32 0xe8917bed GTID last_committed=35753 sequence_number=35778 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536461'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75902584 CRC32 0x8b8c5080 GTID last_committed=35753 sequence_number=35779 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536462'/*!*/; #190827 9:53:16 server id 33061 end_log_pos 75904906 CRC32 0x4e1c0187 GTID last_committed=35753 sequence_number=35780 ...... SET @@SESSION.GTID_NEXT= '364efb4f-c7e8-11e9-8f23-5254002a54f2:1536463'/*!*/;
上述文本太长可能导致阅读不便,下面给出两张截图(留意图中的红色方框标记处)。

| 作者简介
罗小波·沃趣科技高级数据库技术专家
IT从业多年,主要负责MySQL 产品的数据库支撑与售后二线支撑。曾参与版本发布系统、轻量级监控系统、运维管理平台、数据库管理平台的设计与编写,熟悉MySQL体系结构,Innodb存储引擎,喜好专研开源技术,多次在公开场合做过线下线上数据库专题分享,发表过多篇数据库相关的研究文章。
