简介:原创作者:张永伦在经过一系列紧锣密鼓的筹备后,Sharding-Sphere 3.0.0.M2 终于在2018.8.8正式跟大家见面了。发版之前我们解决了几个棘手的问题,今天拓海与大家分享其中一个:MySQL协议相关的一个bug。在bug的定位 ...
原创作者:张永伦在经过一系列紧锣密鼓的筹备后,Sharding-Sphere 3.0.0.M2 终于在2018.8.8正式跟大家见面了。发版之前我们解决了几个棘手的问题,今天拓海与大家分享其中一个:MySQL协议相关的一个bug。在bug的定位过程中,小伙伴们会了解到一些MySQL协议的基本知识和调试方法。Bug描述关于bug的描述,这里使用了项目的issue模板,大家在提bug的时候也请一定遵循这个模板。在本文中使用中文描述,但大家提issue的时候记得用英文,毕竟老外也会来看的。Which version of Sharding-Sphere do you using?3.0.0.M2-SNAPSHOTWhich project do you using? Sharding-JDBC or Sharding-Proxy?Sharding-ProxyExpected behavior持续正常的INSERT数据。Actual behavior循环插入200万数据,当插入到100万左右的时候,客户端无响应。Reason analyze客户端无响应可能是Proxy阻塞引起的,也可能是Proxy导致客户端阻塞引起的。Steps to reproduce the behavior持续插入数据到100万条以上即可复现。Bug初步定位经过初步分析,Proxy日志正常,MySQL里也能查到用户插入的最后一条数据。那么,问题应该就出在最后一条数据插入成功之后。可能有两种情况:1. 插入数据成功后,MySQL返回的消息被Proxy错误解码,导致Proxy异常;2. Proxy返回给客户端的消息编码错误,导致客户端异常。第一种情况,如果Proxy解码错误,Netty会抛异常,TCP连接断开,Proxy会把异常打印到日志,所以这种情况可能性不大。第二种情况可能性较大,需要分析Proxy和客户端之间的消息交互,进一步定位。MySQL协议准确的说应该是MySQL Client/Server协议,另一个叫X Protocol的暂不涉及。任何MySQL客户端(CLI、GUI、MySQL驱动)与MySQL服务器通信,都需要使用这个协议。这个协议包含一系列的命令消息(COM)和响应消息(Response)、编解码方式和交互流程。Bug最终定位以下就是当时抓到的包,看起来非常的“正常”,插入一条数据,返回一条成功的响应,Wireshark也没有解析出错。看现象就是客户端停止了插入数据。使用Wireshark分析MySQL协议Wireshark可以理解为是一个带图形界面的tcpdump,同时集成了非常多的协议解析插件,可以帮助我们方便的抓取和分析MySQL协议。需要注意的是,Wireshark只能抓网络协议包,但MySQL协议还有其他通信方式,如Shared memory,Named pipes,这些是抓不到的,最好不要开这些参数。Linux命令行环境下:可以先用tcpdump抓包,然后将包发送到本地,使用Wireshark解析。命令如下:tcpdump -i any port 3307 -w test.pcapany: 表示所有网络接口。port: tcp端口,Proxy的默认端口是3307,如果你关心MySQL的包,就改为3306。pcap: 一种通用的数据流格式,Wireshark可以直接打开。用Wireshark打开test.pcap,你会发现除了MySQL协议,还显示很多TCP协议的ACK消息: 小结Sharding-Sphere自2016开源以来,不断精进、不断发展。越来越多的企业和个人认可、加入到Sharding-Sphere的开源项目中,为它的成长和发展贡献了巨大力量。我们从未停息过脚步,聆听伙伴的需求和建议,不断开发新的强大功能,不断使其健壮可靠!开源不易, 我们却愿向着最终的目标,步履不停!本文仅代表作者个人观点,不代表巅云官方发声,对观点有疑义请先联系作者本人进行修改,若内容非法请联系平台管理员,邮箱2522407257@qq.com。更多相关资讯,请到巅云www.yx10011.com学习互联网营销技术请到巅云建站www.yx10011.com。 |