新聞中心
當(dāng)團(tuán)隊(duì)對(duì)系統(tǒng)業(yè)務(wù)和數(shù)據(jù)庫(kù)進(jìn)行了細(xì)致的梳理,確定了切分方案后,接下來(lái)的問(wèn)題就是如何去實(shí)現(xiàn)切分方案了,目前在sharding方面有不少的開源框架和產(chǎn)品可供參考,同時(shí)很多團(tuán)隊(duì)也會(huì)選擇自主開發(fā)實(shí)現(xiàn),而不管是選擇框架還是自主開發(fā),都會(huì)面臨一個(gè)在哪一層上實(shí)現(xiàn)sharding邏輯的問(wèn)題,本文會(huì)對(duì)這一系列的問(wèn)題逐一進(jìn)行分析和考量。

成都創(chuàng)新互聯(lián)公司從2013年成立,先為紅旗等服務(wù)建站,紅旗等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為紅旗企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
一、sharding邏輯的實(shí)現(xiàn)層面
從一個(gè)系統(tǒng)的程序架構(gòu)層面來(lái)看,sharding邏輯可以在DAO層、JDBC API層、介于DAO與JDBC之間的Spring數(shù)據(jù)訪問(wèn)封裝層(各種spring的template)以及介于應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)之間的sharding代理服務(wù)器四個(gè)層面上實(shí)現(xiàn)。
圖1. Sharding實(shí)現(xiàn)層面與相關(guān)框架/產(chǎn)品
- 在DAO層實(shí)現(xiàn)
當(dāng)團(tuán)隊(duì)決定自行實(shí)現(xiàn)sharding的時(shí)候,DAO層可能是嵌入sharding邏輯的***位置,因?yàn)樵谶@個(gè)層面上,每一個(gè)DAO的方法都明確地知道需要訪問(wèn)的數(shù)據(jù)表以及查詢參數(shù),借助這些信息可以直接定位到目標(biāo)shard上,而不必像框架那樣需要對(duì)SQL進(jìn)行解析然后再依據(jù)配置的規(guī)則進(jìn)行路由。另一個(gè)優(yōu)勢(shì)是不會(huì)受ORM框架的制約。由于現(xiàn)在的大多數(shù)應(yīng)用在數(shù)據(jù)訪問(wèn)層上會(huì)依賴某種ORM框架,而多數(shù)的shrading框架往往無(wú)法支持或只能支持一種orm框架,這使得在選擇和應(yīng)用框架時(shí)受到了很大的制約,而自行實(shí)現(xiàn)sharding完全沒(méi)有這方面的問(wèn)題,甚至不同的shard使用不同的orm框架都可以在一起協(xié)調(diào)工作。比如現(xiàn)在的java應(yīng)用大多使用hibernate,但是當(dāng)下還沒(méi)有非常令人滿意的基于hibernate的sharding框架,(關(guān)于hibernate hards會(huì)在下文介紹),因此很多團(tuán)隊(duì)會(huì)選擇自行實(shí)現(xiàn)sharding。
簡(jiǎn)單總結(jié)一下,在DAO層自行實(shí)現(xiàn)sharding的優(yōu)勢(shì)在于:不受ORM框架的制約、實(shí)現(xiàn)起來(lái)較為簡(jiǎn)單、易于根據(jù)系統(tǒng)特點(diǎn)進(jìn)行靈活的定制、無(wú)需SQL解析和路由規(guī)則匹配,性能上表現(xiàn)會(huì)稍好一些;劣勢(shì)在于:有一定的技術(shù)門檻,工作量比依靠框架實(shí)現(xiàn)要大(反過(guò)來(lái)看,框架會(huì)有學(xué)習(xí)成本)、不通用,只能在特定系統(tǒng)里工作。當(dāng)然,在DAO層同樣可以通過(guò)XML配置或是注解將sharding邏輯抽離到“外部”,形成一套通用的框架. 不過(guò)目前還沒(méi)有出現(xiàn)此類的框架。
- 在ORM框架層實(shí)現(xiàn)
在ORM框架層實(shí)現(xiàn)sharding有兩個(gè)方向,一個(gè)是在實(shí)現(xiàn)O-R Mapping的前提下同時(shí)提供sharding支持,從而定位為一種分布式的數(shù)據(jù)訪問(wèn)框架,這一類類型的框架代表就是guzz另一個(gè)方向是通過(guò)對(duì)既有ORM框架進(jìn)行修改增強(qiáng)來(lái)加入sharding機(jī)制。此類型的代表產(chǎn)品是hibernate shard. 應(yīng)該說(shuō)以hibernate這樣主流的地位,行業(yè)對(duì)于一款面向hibernate的sharding框架的需求是非常迫切的,但是就目前的hibernate shards來(lái)看,表現(xiàn)還算不上令人滿意,主要是它對(duì)使用hibernate的限制過(guò)多,比如它對(duì)HQL的支持就非常有限。在mybatis方面,目前還沒(méi)有成熟的相關(guān)框架產(chǎn)生。有人提出利用mybatis的插件機(jī)制實(shí)現(xiàn)sharding,但是遺憾的是,mybatis的插件機(jī)制控制不到多數(shù)據(jù)源的連接層面,另一方面,離開插件層又失去了對(duì)sql進(jìn)行集中解析和路由的機(jī)會(huì),因此在mybatis框架上,目前還沒(méi)有可供借鑒的框架,團(tuán)隊(duì)可能要在DAO層或Spring模板類上下功夫了。
- 在JDBC API層實(shí)現(xiàn)
JDBC API層是很多人都會(huì)想到的一個(gè)實(shí)現(xiàn)sharding的***場(chǎng)所,如果我們能提供一個(gè)實(shí)現(xiàn)了sharding邏輯的JDBC API實(shí)現(xiàn),那么sharding對(duì)于整個(gè)應(yīng)用程序來(lái)說(shuō)就是完全透明的,而這樣的實(shí)現(xiàn)可以直接作為通用的sharding產(chǎn)品了。但是這種方案的技術(shù)門檻和工作量顯然不是一般團(tuán)隊(duì)能做得來(lái)的,因此基本上沒(méi)有團(tuán)隊(duì)會(huì)在這一層面上實(shí)現(xiàn)sharding,甚至也沒(méi)有此類的開源產(chǎn)品。筆者知道的只有一款商業(yè)產(chǎn)品dbShards采用的是這一方案。
- 在介于DAO與JDBC之間的Spring數(shù)據(jù)訪問(wèn)封裝層實(shí)現(xiàn)
在springd大行其道的今天,幾乎沒(méi)有哪個(gè)java平臺(tái)上構(gòu)建的應(yīng)用不使用spring,在DAO與JDBC之間,spring提供了各種template來(lái)管理資源的創(chuàng)建與釋放以及與事務(wù)的同步,大多數(shù)基于spring的應(yīng)用都會(huì)使用template類做為數(shù)據(jù)訪問(wèn)的入口,這給了我們另一個(gè)嵌入sharding邏輯的機(jī)會(huì),就是通過(guò)提供一個(gè)嵌入了sharding邏輯的template類來(lái)完成sharding工作.這一方案在效果上與基于JDBC API實(shí)現(xiàn)的方案基本一致,同樣是對(duì)上層代碼透明,在進(jìn)行sharding改造時(shí)可以平滑地過(guò)度,但它的實(shí)現(xiàn)卻比基于JDBC API的方式簡(jiǎn)單,因此成為了不少框架的選擇,阿里集團(tuán)研究院開源的Cobar Client就是這類方案的一種實(shí)現(xiàn)。
- 在應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)之間通過(guò)代理實(shí)現(xiàn)
在應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)之間加入一個(gè)代理,應(yīng)用程序向數(shù)據(jù)發(fā)出的數(shù)據(jù)請(qǐng)求會(huì)先通過(guò)代理,代理會(huì)根據(jù)配置的路由規(guī)則,對(duì)SQL進(jìn)行解析后路由到目標(biāo)shard,因?yàn)檫@種方案對(duì)應(yīng)用程序完全透明,通用性好,所以成為了很多sharding產(chǎn)品的選擇。在這方面較為知名的產(chǎn)品是mysql官方的代理工具:Mysql Proxy和一款國(guó)人開發(fā)的產(chǎn)品:amoeba。mysql proxy本身并沒(méi)有實(shí)現(xiàn)任何sharding邏輯,它只是作為一種面向mysql數(shù)據(jù)庫(kù)的代理,給開發(fā)人員提供了一個(gè)嵌入sharding邏輯的場(chǎng)所,它使用lua作為編程語(yǔ)言,這對(duì)很多團(tuán)隊(duì)來(lái)說(shuō)是需要考慮的一個(gè)問(wèn)題。amoeba則是專門實(shí)現(xiàn)讀寫分離與sharding的代理產(chǎn)品,它使用非常簡(jiǎn)單,不使用任何編程語(yǔ)言,只需要通過(guò)xml進(jìn)行配置。不過(guò)amoeba不支持事務(wù)(從應(yīng)用程序發(fā)出的包含事務(wù)信息的請(qǐng)求到達(dá)amoeba時(shí),事務(wù)信息會(huì)被抹去,因此,即使是單點(diǎn)數(shù)據(jù)訪問(wèn)也不會(huì)有事務(wù)存在)一直是個(gè)硬傷。當(dāng)然,這要看產(chǎn)品的定位和設(shè)計(jì)理念,我們只能說(shuō)對(duì)于那些對(duì)事務(wù)要求非常高的系統(tǒng),amoeba是不適合的。
二、使用框架還是自主開發(fā)?
前面的討論中已經(jīng)羅列了很多開源框架與產(chǎn)品,這里再整理一下:基于代理方式的有MySQL Proxy和Amoeba,基于Hibernate框架的是Hibernate Shards,通過(guò)重寫spring的ibatis template類是Cobar Client,這些框架各有各的優(yōu)勢(shì)與短板,架構(gòu)師可以在深入調(diào)研之后結(jié)合項(xiàng)目的實(shí)際情況進(jìn)行選擇,但是總的來(lái)說(shuō),我個(gè)人對(duì)于框架的選擇是持謹(jǐn)慎態(tài)度的。一方面多數(shù)框架缺乏成功案例的驗(yàn)證,其成熟性與穩(wěn)定性值得懷疑。另一方面,一些從成功商業(yè)產(chǎn)品開源出框架(如阿里和淘寶的一些開源項(xiàng)目)是否適合你的項(xiàng)目是需要架構(gòu)師深入調(diào)研分析的。當(dāng)然,最終的選擇一定是基于項(xiàng)目特點(diǎn)、團(tuán)隊(duì)狀況、技術(shù)門檻和學(xué)習(xí)成本等綜合因素考量確定的。
當(dāng)前名稱:DB分庫(kù)分表(3):關(guān)于使用框架還是自主開發(fā)以及sharding實(shí)現(xiàn)層面的考量
轉(zhuǎn)載注明:http://fisionsoft.com.cn/article/djsoepc.html


咨詢
建站咨詢
