MySQL5.5 Semi-sync备库响应协议分析

这又是一篇介绍Semi-sync的文章。

Semi-sync主库在一定时间内(可配置的超时时间),如果没有收到备库的响应,则会超时从而降级为普通的replication复制。如果超时发生,有时需要查清什么原因导致备库没有及时响应,一方面可以从备库的日志着手,另一方面,如果需要更细致的信息则需要从备库端的网络包查找原因。这里介绍如何分析一个Semi-sync备库响应主库的数据包。

概述:先使用tcpdump抓取正确(主要是src和dst都正确)的数据包;然后借助wireshark玻璃TCP/IP等层的头信息,仅保留发送的MySQL数据包;再分析MySQL Semi-sync Slave响应的协议。

1. tcpdump原始数据包

通过如下tcpdump抓取主机的网络包:

nohup tcpdump -n -nn -tttt -i bond0 -s 65535 'port 3306 and ((dst host master.host and src host slave.host and len < 100) or (dst host slave.host and src host master.host))' -w tcpdump.ret -C 50 &

参数简单说明:

-n 表示ip不要转换为主机名 -nn表示端口号,不要转为为服务名(例如3306会被转换为mysql) -tttt 打印出完成的格式化的时间戳 -C 50 表示抓取的结果放到文件中,文件大小不超过50MB
2. 使用wireshark找到对应的包

Semi-sync备库响应主库包,一般大小整个包大小约95字节。找到该网络包如下:

完整网络包内容:

0000 00 24 e8 57 76 5e 00 1d 70 82 ca c0 08 00 45 00 .$.Wv^.. p.....E. 0010 00 51 a6 e2 40 00 3e 06 89 34 ac 13 46 44 ac 17 .Q..@.>. .4..FD.. 0020 6e 21 b3 35 0c ea b2 2d 26 2a da 46 3c df 80 18 n!.5...- &*.F<... 0030 04 82 35 ef 00 00 01 01 08 0a 5a a2 7f cd 50 43 ..5..... ..Z...PC 0040 c1 5b 19 00 00 00 ef 38 40 01 00 00 00 00 00 6d .[.....8 @......m 0050 79 73 71 6c 2d 62 69 6e 2e 30 30 31 35 31 36 ysql-bin .001516
3. MySQL数据包分析

剥去TCP/IP等层(使用wireshark就可以了),剩下MySQL 包如下:

0040 19 00 00 00 ef 38 40 01 00 00 00 00 00 6d .[.....8 @......m 0050 79 73 71 6c 2d 62 69 6e 2e 30 30 31 35 31 36 ysql-bin .001516

更具Semi-sync备库响应源码分析如下:

+============================+ | packetlength 0 : 4 | 对应的:19 00 00 00 表示包数据长度为0x19=25字节 +----------------------------+ | magic_num 4 : 1 | 对应的:ef 这是一个kPacketMagicNum,表示这是一个Semi-sync slave响应 +----------------------------+ | binlog_pos 5 : 4 | 对应的:38 40 01 00 Binlog Pos:0x14038 = 81976 +----------------------------+ | event_length 9 : 20 | 对应的:00 00 00 00 6d 79 73 71 6c .... 31 36 (mysql-bin.001516) +----------------------------+

可以看出,改网络包,响应主库端的mysql-bin.001516中的偏移为81976的事务。

4. 最后【更新2011-10-19】

通过tcpdump的网络包,我们可以看到毫秒(甚至微秒)级别数据包的传送情况。依据此,通常可以精确分析出Semi-sync在何时、何处出现超时。然后,可以继续分析为何出现超时。

That’s all… 这篇枯燥吧,哈哈

广告:我们寻找靠谱的人 | 感谢作者

Leave a Reply

Your email address will not be published. Required fields are marked *