這里筆者推薦一個(gè)比較靠譜的過渡技術(shù)–“表分區(qū)”。主流的關(guān)系型數(shù)據(jù)庫中基本都支持。不同的分區(qū)在邏輯上仍是一張表,但是物理上卻是分開的,能在一定程度上提高查詢性能,而且對應(yīng)用程序透明,無需修改任何代碼。筆者曾經(jīng)負(fù)責(zé)優(yōu)化過一個(gè)系統(tǒng),主業(yè)務(wù)表有大約8000W左右的數(shù)據(jù),考慮到成本問題,當(dāng)時(shí)就是采用“表分區(qū)”來做的,效果比較明顯,且系統(tǒng)運(yùn)行的很穩(wěn)定。
小結(jié)
最后,有很多讀者都想了解當(dāng)前社區(qū)中有沒有開源免費(fèi)的分庫分表解決方案,畢竟站在巨人的肩膀上能省力很多。當(dāng)前主要有兩類解決方案:
基于應(yīng)用程序?qū)用娴腄DAL(分布式數(shù)據(jù)庫訪問層)
比較典型的就是淘寶半開源的TDDL,當(dāng)當(dāng)網(wǎng)開源的Sharding-JDBC等。分布式數(shù)據(jù)訪問層無需硬件投入,技術(shù)能力較強(qiáng)的大公司通常會(huì)選擇自研或參照開源框架進(jìn)行二次開發(fā)和定制。對應(yīng)用程序的侵入性一般較大,會(huì)增加技術(shù)成本和復(fù)雜度。通常僅支持特定編程語言平臺(Java平臺的居多),或者僅支持特定的數(shù)據(jù)庫和特定數(shù)據(jù)訪問框架技術(shù)(一般支持MySQL數(shù)據(jù)庫,JDBC、MyBatis、Hibernate等框架技術(shù))。
數(shù)據(jù)庫中間件,比較典型的像mycat(在阿里開源的cobar基礎(chǔ)上做了很多優(yōu)化和改進(jìn),屬于后起之秀,也支持很多新特性),基于Go語言實(shí)現(xiàn)kingSharding,比較老牌的Atlas(由360開源)等。這些中間件在互聯(lián)網(wǎng)企業(yè)中大量被使用。另外,MySQL 5.x企業(yè)版中官方提供的Fabric組件也號稱支持分片技術(shù),不過國內(nèi)使用的企業(yè)較少。
中間件也可以稱為“透明網(wǎng)關(guān)”,大名鼎鼎的mysql_proxy大概是該領(lǐng)域的鼻祖(由MySQL官方提供,僅限于實(shí)現(xiàn)“讀寫分離”)。中間件一般實(shí)現(xiàn)了特定數(shù)據(jù)庫的網(wǎng)絡(luò)通信協(xié)議,模擬一個(gè)真實(shí)的數(shù)據(jù)庫服務(wù),屏蔽了后端真實(shí)的Server,應(yīng)用程序通常直接連接中間件即可。而在執(zhí)行SQL操作時(shí),中間件會(huì)按照預(yù)先定義分片規(guī)則,對SQL語句進(jìn)行解析、路由,并對結(jié)果集做二次計(jì)算再最終返回。引入數(shù)據(jù)庫中間件的技術(shù)成本更低,對應(yīng)用程序來講侵入性幾乎沒有,可以滿足大部分的業(yè)務(wù)。增加了額外的硬件投入和運(yùn)維成本,同時(shí),中間件自身也存在性能瓶頸和單點(diǎn)故障問題,需要能夠保證中間件自身的高可用、可擴(kuò)展。
總之,不管是使用分布式數(shù)據(jù)訪問層還是數(shù)據(jù)庫中間件,都會(huì)帶來一定的成本和復(fù)雜度,也會(huì)有一定的性能影響。所以,還需讀者根據(jù)實(shí)際情況和業(yè)務(wù)發(fā)展需要慎重考慮和選擇。