背景
分庫(kù)分表這個(gè)詞相信很多人都不陌生财岔,在互聯(lián)網(wǎng)公司數(shù)據(jù)到達(dá)一定規(guī)模的時(shí)候,多數(shù)都會(huì)對(duì)數(shù)據(jù)進(jìn)行分庫(kù)分表河爹,或者也有人叫分片使鹅,英文翻譯為Sharding;更加準(zhǔn)確來(lái)說(shuō)我們常常關(guān)心的是水平分片昌抠,即單個(gè)業(yè)務(wù)的某些表到達(dá)一定規(guī)模后患朱,即使建立索引也無(wú)法從根本上帶來(lái)很大的性能提升,這時(shí)我們會(huì)考慮把單表拆分炊苫,以MySQL為例裁厅,B+樹索引的深度會(huì)隨著記錄的增多而逐漸加深,根據(jù)索引查詢的開銷也會(huì)越來(lái)越大侨艾,而單表拆分成多個(gè)表之后执虹,B+樹深度降低,每個(gè)單表獨(dú)立查詢的速度也會(huì)加快唠梨,如果同時(shí)還分庫(kù)的話袋励,并且在不同的實(shí)例上,大量的查詢壓力也會(huì)分擔(dān)到不同的機(jī)器上,這對(duì)單個(gè)數(shù)據(jù)庫(kù)機(jī)器減壓也帶來(lái)好處茬故。
分庫(kù)分表的技術(shù)方案總體上來(lái)講分為兩大類:應(yīng)用層依賴類中間件盖灸、中間層代理類中間件。
應(yīng)用層依賴類中間件
這類分庫(kù)分表中間件的特點(diǎn)就是和應(yīng)用強(qiáng)耦合磺芭,需要應(yīng)用顯示依賴相應(yīng)的jar包(以Java為例)赁炎,比如知名的TDDL、當(dāng)當(dāng)開源的sharding-jdbc钾腺、蘑菇街的TSharding徙垫、攜程開源的Ctrip-DAL、支付寶開源但比較低調(diào)的zdal等放棒。
此類中間件的基本思路就是重新實(shí)現(xiàn)JDBC的API姻报,通過重新實(shí)現(xiàn)DataSource、PrepareStatement等操作數(shù)據(jù)庫(kù)的接口间螟,讓應(yīng)用層在基本(注意:這里用了基本)不改變業(yè)務(wù)代碼的情況下透明地實(shí)現(xiàn)分庫(kù)分表的能力逗抑。中間件給上層應(yīng)用提供熟悉的JDBC API,內(nèi)部通過sql解析寒亥、sql重寫邮府、sql路由等一系列的準(zhǔn)備工作獲取真正可執(zhí)行的sql,然后底層再按照傳統(tǒng)的方法(比如數(shù)據(jù)庫(kù)連接池)獲取物理連接來(lái)執(zhí)行sql溉奕,最后把數(shù)據(jù)結(jié)果合并處理成ResultSet返回給應(yīng)用層褂傀。
此類中間件的優(yōu)點(diǎn)很明顯,就是無(wú)需額外部署加勤,只要和應(yīng)用綁定一起發(fā)布即可仙辟,但是缺點(diǎn)也很明顯,就是不能跨語(yǔ)言鳄梅,比如Java寫的sharding-jdbc顯然不能用在C#項(xiàng)目中叠国,所以攜程的dal也要重新寫一套C#的客戶端。
中間層代理類中間件
這類分庫(kù)分表中間件的核心原理是在應(yīng)用和數(shù)據(jù)庫(kù)的連接之間搭起一個(gè)代理層戴尸,上層應(yīng)用以標(biāo)準(zhǔn)的MySQL協(xié)議來(lái)連接代理層粟焊,然后代理層負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求到底層的MySQL物理實(shí)例,這種方式對(duì)應(yīng)用只有一個(gè)要求孙蒙,就是只要用MySQL協(xié)議來(lái)通信即可项棠,所以用MySQL Workbench這種純的客戶端都可以直接連接你的分布式數(shù)據(jù)庫(kù),自然也天然支持所有的編程語(yǔ)言挎峦。比較有代表性的產(chǎn)品有開創(chuàng)性質(zhì)的Amoeba香追、阿里開源的Cobar、社區(qū)發(fā)展比較好的Mycat 等坦胶。
在技術(shù)實(shí)現(xiàn)上除了和應(yīng)用層依賴類中間件基本相似外透典,代理類的分庫(kù)分表產(chǎn)品必須實(shí)現(xiàn)標(biāo)準(zhǔn)的MySQL協(xié)議晴楔,某種意義上講數(shù)據(jù)庫(kù)代理層轉(zhuǎn)發(fā)的就是MySQL協(xié)議請(qǐng)求,就像Nginx轉(zhuǎn)發(fā)的是Http協(xié)議請(qǐng)求峭咒。
上述無(wú)論哪種類型的產(chǎn)品税弃,除了實(shí)現(xiàn)分庫(kù)分表這一主要功能外,都會(huì)額外實(shí)現(xiàn)一些其他很有實(shí)用價(jià)值的功能讹语,比如讀寫分離钙皮、負(fù)載均衡等蜂科。