MySQL Case-使用Wireshark窥探异步复制、半同步、组复制
我们知道异步复制、5.6版本半同步和MySQL 5.7出来的增强半同步,还有MGR在主从复制的过程中流程是不同的,那么我们能不能通过tcpdump或wireshrk看下其中的异同呢?
创建一张a表插入一条数据,进行捕获,只捕获insert操作。
insert into test.a values(1);
异步复制
异步复制的流程如下,在主库二阶段 write binlog后,将binlog event发送给从库的IO Thread然后进行写reloy log,并不会管IO Thread返回ACK信息,那么从wireshark中看到的现象是这样的吗?
wireshark信息如下
步骤2的信息只是步骤1的反馈,不带有任何数据信息,这个我们会与增强半同步进行对比,This is an ACK to the segment in frame:1
而步骤1通过Follow TCP Stream可以大致的看到binlog events事务信息内容与insert into test.a values (1)大致匹配。
半同步after_sync和after_commit
如下图是我们说的5.7版本的alter_sync增强半同步,在write binlog后将binlog events 发送给从库的IO Thread,IO Thread apply应用完后,发送ACK反馈给主库然后才能进行提交,注意这里的ACK是带有信息的,不管是after_commit还是after_sync,我这里看到的tcpdump内容一致,我们以after_sync为例。
mysql> show variables like '%rpl_semi_sync_master_wait_point%';
+---------------------------------+------------+
| Variable_name | Value |
+---------------------------------+------------+
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+---------------------------------+------------+
1 row in set (0.02 sec)
tcpdump信息
我们再来看,2是给1的反馈,但是2的ACK带有PSH,是带有信息的
那么2给1的反馈的内容是什么呢,查看Follow TCP stream,内容是主库写binlog的位置,
查看主库当前的binlog信息,正在写29号日志,所以说步骤2就是增强版同步从库给主库的ACK反馈,而不是那个异步复制中不带任何信息的ACK。
-rw-r----- 1 mysql mysql 1074107316 Aug 24 13:36 mysql-bin.000023
-rw-r----- 1 mysql mysql 1074093810 Aug 24 13:48 mysql-bin.000024
-rw-r----- 1 mysql mysql 1073843110 Aug 24 14:04 mysql-bin.000025
-rw-r----- 1 mysql mysql 1075629275 Aug 24 14:14 mysql-bin.000026
-rw-r----- 1 mysql mysql 1073806081 Aug 24 14:28 mysql-bin.000027
-rw-r----- 1 mysql mysql 1073924039 Aug 24 14:40 mysql-bin.000028
-rw-r----- 1 mysql mysql 286247619 Aug 27 13:38 mysql-bin.000029
步骤1携带的信息与异步一样,可以参考上面异步复制步骤1的内容
Group Replication
MGR没有使用异步复制的Binlog Event传输机制,也不使用MySQL的服务端口来进行通信。MGR创建了一个独立的TCP端口来进行通信,各个MySQL服务器上的Group Replication插件通过这个端口连接在一起,两两之间可以直接通信。
下面我们再看看MGR的复制内容
tcpdump抓取的端口和主从不同,主从抓取的端口是master host和master port对应的IP和port,而MGR是复制用的ip和port是loose-group_replication_local_address = 'master:33061'所指定
tcpdump -i any -s 0 'port 33061 and host 192.168.239.57' -w ./8.0mgr.cap
在不进行事务操作时,可以看到mgr内部的通信,主库57发送信息给两个只读从节点58和59,同样58和59会回复ACK内容
第二个完整的TCP流
通过TCP Stream可以看到57给58发送的内容包含CGR、CGS、CGU信息
58给57回复CGR、CGS、CGT、CGU、CGV、CGW等信息,如下
至于MGR Paxos内部通信具体这些信息具体代表什么含义,实则较为复杂,笔者目前尚不能做出明确的分析和答案
如上是我通过tcpdump观测传统异步复制、半同步复制、MGR之间的区别
更多文章欢迎关注本人公众号,搜dbachongzi或扫二维码
作者:姚崇 Oracle OCM、MySQL OCP、Oceanbase OBCA、PingCAP PCTA认证,擅长基于Oracle、MySQL Performance Turning及多种关系型 NoSQL数据库。