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的。
專案地址
注意事項
程式碼中有部分是在做測試的時候與業務相關的,去掉即可,你只需要留下其中解析包的部分程式碼。