MysqlProtocolAnalyzer一个Java实现的MySql协议解析库

MysqlProtocolAnalyzer

MysqlProtocolAnalyzer 是一个对Mysql的通讯协议的包进行解析的库,纯java编写,输入文件可以是任意的16进制的网络数据包文本文件,当然需要一定的预处理才能使用。本库是默认处理的是tcpdump产生的16进制的数据文件

项目背景

最近在做一个关于数据库的离线式容灾项目,近几年来,容灾已经成为信息数据中心建设的热门课题。很多容灾技术也快速发展起来,对用户来说也有很广阔的选择余地。但由于容灾方案的技术复杂性和多样性,一般用户很难搞清其中的优劣以确定如何选择最适合自己状况的容灾解决方案。
目前有很多种容灾技术,分类也比较复杂。但总体上可以区分为离线式容灾(冷容灾)和在线容灾(热容灾)两种类型。
而我们的项目是一种离线式的容灾,一个数据库集群,在有主备同步的状态下,如果备集群当机了,就会出现主备不一致的状态,当然只要主机群可用那可以通过很多种当时恢复备集群的数据,但是在当主集群发生不可恢复的灾难是,所以的数据都丢失。于是我们采用一种基于网络流量的离线式的容灾方案。首先在集群部署的时候在中间的网络网关或者路由器上的流量(网络数据包)进行抓取,分离出里面对于数据库主机群的数据包导流到我们指定的服务器Q上去,并不是拦截,主机群的网络数据完全不受影响,在服务器Q上安装流量包抓包程序将数据包写入到本地文件。在出现主备不一致的情况时,使用MysqlProtocolAnalyzer对生成的网络包数据进行解析,最终会生成其中主备差异的事务数据(一系列的sql语句),以便恢复备集群。

功能介绍

MysqlProtocolAnalyzer是根据MySql的通讯协议设计的一个对网络数据包进行解析的库(工具),我们在机器上可以通过tcpdump这个工具对某个网卡、端口或者IP地址的数据包进行抓取,抓取到的数据都是字节数据,我们需要将数据里面的TCP/IP层的数据去掉,得到真实的传输的数据。
而MysqlProtocolAnalyzer里面对于MySql协议(http://dev.mysql.com/doc/internals/en/client-server-protocol.html)全部支持。
会将数据解析成为一个一个的实体数据包,主要的数据包类型有MySqlAuthenticationPacket、MySqlColumnDefinitionPacket、MySqlCommandPacket、MySqlCommandPreparedPacket、MySqlEofPacket、MySqlErrorPacket、MySqlExecuteStmtPacket、MySqlHandShakePacket、MySqlOkPacket、MySqlPreparedOkPacket、MySqlResultsetPacket、MySqlResultsetRow等,这些包的作用官方的文档里面有介绍。

源码介绍

整个项目分为4个包
1. com.github.zhujunxxxxx.packet
2. com.github.zhujunxxxxx.type
3. com.github.zhujunxxxxx.tool
4. com.github.zhujunxxxxx.bootstrap
第一个包下面是对于所有的数据包的封装类,第二个包是里面的基本数据的定义,第三个包里面是对于数据包解析的类,第四个是一个快速启动的类。

Mysql协议

在Mysql协议中每个数据包都由三部分组成,分别是 length+sequence+真实数据。
其中length+sequence被称为包头(Packet Header),length占3个字节,sequence占1个字节。
在客户端和MySql服务端交互中,一般的通讯都只有一个包,但是其中其中情况是由多个数据包组成的。对于select语句的响应就是会返回多个数据包组成Resultset Packet,还有prepared语句的响应结果也是包含多个数据包组成PreparedOk packet的。

项目地址

该项目已经开源,项目地址 https://github.com/zhujunxxxxx/MysqlProtocolAnalyzer ,如果觉得有什么疑问请联系我。

注意事项

代码中有部分是在做测试的时候与业务相关的,去掉即可,你只需要留下其中解析包的部分代码。

你可能感兴趣的:(网络编程,java)