10 幾年前,網際網路產業蓬勃發展,相比傳統 IT 企業,網際網路應用每天會產生海量的資料。
如何儲存和分析這些資料成為了當時技術圈的痛點,彼時,分庫分表解決方案應運而生。
當時最流行的 Java 技術論壇是 javaeye ,有位淘寶的技術人員分享了一篇分庫分表的文章 ,這篇文章,我反覆看了幾十遍,想從中吸取更多的營養,但基於我孱弱的技術能力,總是感覺隔靴搔癢。
直到 2012年 Cobar 開源了 ,我的困惑才初步消解了。
1 Cobar 開源了
Cobar 是由 Alibaba 開源的 MySQL 分散式處理中介軟體,它可以在分散式的環境下看上去像傳統資料庫一樣提供海量資料服務。
Cobar 開源後,我迫不及待的的去下載 Cobar 的部署包,配置兩個庫同樣一張表,在兩個庫分別手工插入 1 條記錄,然後透過 Navicat 連線 Cobar 暴露的埠,竟然發現資料表顯示兩條資料 。
看到 Navicat 的顯示,我當時的表情如下:
雖然我極度渴望探索 Cobar 原理的奧秘 , 而且網際網路上關於 Cobar 的文章其實並不多 ,我認識的同事朋友也對分庫分表不熟悉,於是我想到了世界上最笨的方式:
將 Cobar 原始碼抄寫一次,邊抄邊理解,直到可以將程式跑起來。
於是,我建了一個新的 maven 專案,一點點去抄。
最開始是模仿 Cobar 的包的結構,接著是網路通訊設計,最後是 SQL 解析 。
網路通訊模組跑通了,但當我抄到 SQL 解析模組時,因為不理解原理,抄起來實在太費勁了,轟轟烈烈的抄原始碼運動戛然而止,花費了接近三個月的時間。
2 抄原始碼的收穫
雖然那時我並沒有完全理解 Cobar 的實現機制,但收穫還是很大的。
1、網路程式設計
第一次接觸到 Reactor 模式,NIOAcceptor 用於處理前端請求,NIOConnector 則用於管理後端的連線,NIOProcessor 用於管理多執行緒事件處理,NIOReactor 則用於完成底層的事件驅動機制。
我接觸到 Netty 之後,才想到 Cobar 的網路通訊層可以更加優雅點 。事實上 ,MyCat 就是重點最佳化了後端網路通訊層。
2、快取池
第一次知道原來可以在網路通訊裡,封裝統一管理 NIO 的 Buffer 。
3、打包技巧
Cobar 這種 maven 打包方式,目錄結構如下:
我自己寫專案都會參考這種 maven 打包方式,因為這種方式相比原來 tomcat webapp 部署包的方式更加優雅。
4、學習 sharding-jdbc
當我對於分庫分表 Proxy 的設計有了初步認識之後,再來學習噹噹開源的 sharding-jdbc 時就輕鬆很多了。
3 開源分庫分表示例專案
其實,我對於分庫分表技術的執念,更多在在於我強烈的渴望:當遇到需要分庫分表的場景,我有足夠的能力去解決這個問題。
今年 3月份,我開源了一個分庫分表示例專案。
github地址:https://github.com/makemyownlife/shardingsphere-jdbc-demo
這個專案的初衷是:幫助 Java 同學們快速入門分庫分表,但又不止於分庫分表 。
1、 Grpc ID 生成器示例
**2、 shardingsphere jdbc 4.X/5.X 分庫分表例子 **
專案提供了兩個模組,分別使用 jdbc 4.X 和 jdbc 5.X 兩個版本。
同時,有的同學想使用原生 API 實現分庫分表,每個模組裡都準備了原生 API 使用的例子 ,方便同學們除錯。
網上有很多 shardingsphere jdbc 5.X 的例子,但很多使用方式並不標準,勇哥結合官網文件,並對比網上很多例子,花了很多天才梳理好。
3、 antlr 學習例子
shardingsphere 基於 antlr4 設計了新一代的 SQL 解析引擎,勇哥單獨抽出一個模組用來演示:
後面會逐步完善 antlr 的例子,比如簡單的 SQL 查詢解析、JSON 格式解析等。
這個專案還在不斷的進化中,後面還要新增擴容相關的知識點,比如 canal、datax ,希望能幫助大家 !
4 寫到最後
有些公眾號文章寫到:分庫分表,可能真的要退出歷史舞臺了!我從來也沒有否認分散式資料庫架構的先進性 ,但我想分庫分表的更大的優勢在於:簡單。
武漢有些小公司並沒有很強的技術儲備,但他們用極少的研發人員就可以處理很大的資料量。
因為沒有完美的技術,只有最合適的技術 !
最後,來看看 2012年那個傻傻的抄寫程式碼的我,有人說我長得像周杰倫,不過我覺得像梁朝偉 !
如果我的文章對你有所幫助,還請幫忙點贊、在看、轉發一下,你的支援會激勵我輸出更高質量的文章,非常感謝!