為了學(xué)習(xí)分庫分表,我把 Cobar 源碼抄了一遍
十幾年前,互聯(lián)網(wǎng)產(chǎn)業(yè)蓬勃發(fā)展,相比傳統(tǒng) IT 企業(yè),互聯(lián)網(wǎng)應(yīng)用每天會(huì)產(chǎn)生海量的數(shù)據(jù)。
如何存儲(chǔ)和分析這些數(shù)據(jù)成為了當(dāng)時(shí)技術(shù)圈的痛點(diǎn),彼時(shí),分庫分表解決方案應(yīng)運(yùn)而生。
當(dāng)時(shí)最流行的 Java 技術(shù)論壇是 javaeye ,有位淘寶的技術(shù)人員分享了一篇分庫分表的文章 ,這篇文章,我反復(fù)看了幾十遍,想從中吸取更多的營養(yǎng),但基于我孱弱的技術(shù)能力,總是感覺隔靴搔癢。
直到 2012年 Cobar 開源了 ,我的困惑才慢慢消解了。
一、Cobar 開源了
Cobar 是由 Alibaba 開源的 MySQL 分布式處理中間件,它可以在分布式的環(huán)境下看上去像傳統(tǒng)數(shù)據(jù)庫一樣提供海量數(shù)據(jù)服務(wù)。
Cobar 開源后,我迫不及待的的去下載部署包,配置兩個(gè)分庫同樣一張表,在兩個(gè)庫分別手工插入 1 條記錄,然后通過 Navicat 連接 Cobar 暴露的端口,竟然發(fā)現(xiàn)數(shù)據(jù)表顯示兩條數(shù)據(jù) 。
我覺得很神奇,也有點(diǎn)不可思議,像魔法一樣。
雖然我極度渴望探索 Cobar 的原理 , 但互聯(lián)網(wǎng)上關(guān)于 Cobar 的文章其實(shí)并不多 ,而且我認(rèn)識(shí)的同事朋友也對(duì)分庫分表同樣不熟悉,我想到了世界上最笨的方法:將 Cobar 源碼抄寫一次,邊抄邊理解,直到可以將程序跑起來。
于是,我建了一個(gè)新的 maven 項(xiàng)目,一點(diǎn)點(diǎn)去抄。
圖片
最開始是模仿 Cobar 的包的結(jié)構(gòu),接著是網(wǎng)絡(luò)通訊設(shè)計(jì),最后是 SQL 解析 。
網(wǎng)絡(luò)通訊模塊跑通了,但當(dāng)我抄到 SQL 解析模塊時(shí),因?yàn)椴焕斫庠?,抄起來?shí)在太費(fèi)勁了,轟轟烈烈的抄源碼運(yùn)動(dòng)戛然而止,花費(fèi)了接近三個(gè)月的時(shí)間。
二、抄源碼的收獲
雖然那時(shí)我并沒有完全理解 Cobar 的實(shí)現(xiàn)機(jī)制,但收獲還是很大的。
1.網(wǎng)絡(luò)編程
第一次接觸到 Reactor 模式,NIOAcceptor 用于處理前端請(qǐng)求,NIOConnector 則用于管理后端的連接,NIOProcessor 用于管理多線程事件處理,NIOReactor 則用于完成底層的事件驅(qū)動(dòng)機(jī)制。
Reactor 模式
我接觸到 Netty 之后,才想到 Cobar 的網(wǎng)絡(luò)通訊層可以更加優(yōu)雅點(diǎn) 。事實(shí)上 ,MyCat 就是重點(diǎn)優(yōu)化了后端網(wǎng)絡(luò)通訊層。
2.緩存池
第一次知道原來可以在網(wǎng)絡(luò)通訊里,封裝統(tǒng)一管理 NIO 的 Buffer 。
圖片
3.打包技巧
Cobar 這種 maven 打包方式,目錄結(jié)構(gòu)如下:
圖片
我自己寫項(xiàng)目都會(huì)參考這種 maven 打包方式,因?yàn)檫@種方式相比原來 tomcat webapp 部署包的方式更加優(yōu)雅。
4.學(xué)習(xí) sharding-jdbc
當(dāng)我對(duì)于分庫分表 Proxy 的設(shè)計(jì)有了初步認(rèn)識(shí)之后,再來學(xué)習(xí)當(dāng)當(dāng)開源的 sharding-jdbc 時(shí)就輕松很多了。
三、開源分庫分表示例項(xiàng)目
其實(shí),我對(duì)于分庫分表技術(shù)的執(zhí)念,更多在在于我強(qiáng)烈的渴望:當(dāng)遇到需要分庫分表的場(chǎng)景,我有足夠的能力去解決這個(gè)問題。
今年 3月份,我開源了一個(gè)分庫分表示例項(xiàng)目。
圖片
https://github.com/makemyownlife/shardingsphere-jdbc-demo
這個(gè)項(xiàng)目的初衷是:幫助 Java 同學(xué)們快速入門分庫分表,但又不止于分庫分表 。
1. Grpc 服務(wù)端 ID 生成器示例
圖片
圖片
2.shardingsphere jdbc 4.X/5.X 分庫分表例子
項(xiàng)目提供了兩個(gè)模塊,分別使用 jdbc 4.X 和 jdbc 5.X 兩個(gè)版本。
圖片
同時(shí),有的同學(xué)想使用原生 API 實(shí)現(xiàn)分庫分表,每個(gè)模塊里都準(zhǔn)備了原生 API 使用的例子 ,方便同學(xué)們調(diào)試。
圖片
網(wǎng)上有很多 shardingsphere jdbc 5.X 的例子,但很多使用方式并不標(biāo)準(zhǔn),勇哥結(jié)合官網(wǎng)文檔,并對(duì)比網(wǎng)上很多例子,花了很多天才梳理好。
3. antlr 學(xué)習(xí)例子
shardingsphere 基于 antlr4 設(shè)計(jì)了新一代的 SQL 解析引擎,勇哥單獨(dú)抽出一個(gè)模塊用來演示:
圖片
antlr 學(xué)習(xí)模塊會(huì)逐步完善更多的例子,比如簡單的查詢 SQL 解析、JSON 格式解析等。
shardingsphere-jdbc-demo 項(xiàng)目還在不斷的進(jìn)化中,后面還要添加擴(kuò)容相關(guān)的知識(shí)點(diǎn),比如 canal、datax ,希望能幫助大家 !















 
 
 










 
 
 
 