分庫(kù)分表 vs NewSQL數(shù)據(jù)庫(kù)
NewSQL數(shù)據(jù)庫(kù)先進(jìn)在哪兒?
基于中間件(包括SDK和Proxy兩種形式)+傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)(分庫(kù)分表)模式是不是分布式架構(gòu)?

傳統(tǒng)數(shù)據(jù)庫(kù)面向磁盤(pán)設(shè)計(jì),基于內(nèi)存的存儲(chǔ)管理及并發(fā)控制,不如NewSQL數(shù)據(jù)庫(kù)那般高效利用。 中間件模式SQL解析、執(zhí)行計(jì)劃優(yōu)化等在中間件與數(shù)據(jù)庫(kù)中重復(fù)工作,效率相比較低; NewSQL數(shù)據(jù)庫(kù)的分布式事務(wù)相比于XA進(jìn)行了優(yōu)化,性能更高; 新架構(gòu)NewSQL數(shù)據(jù)庫(kù)存儲(chǔ)設(shè)計(jì)即為基于paxos(或Raft)協(xié)議的多副本,相比于傳統(tǒng)數(shù)據(jù)庫(kù)主從模式(半同步轉(zhuǎn)異步后也存在丟數(shù)問(wèn)題),在實(shí)現(xiàn)了真正的高可用、高可靠(RTO<30s,RPO=0) NewSQL數(shù)據(jù)庫(kù)天生支持?jǐn)?shù)據(jù)分片,數(shù)據(jù)的遷移、擴(kuò)容都是自動(dòng)化的,大大減輕了DBA的工作,同時(shí)對(duì)應(yīng)用透明,無(wú)需在SQL指定分庫(kù)分表鍵。
首先要說(shuō)的就是分布式事務(wù):這是一把雙刃劍。
CAP限制
推薦一篇關(guān)于分布式系統(tǒng)有趣的文章,站在巨人的分布式肩膀上,其中提到:分布式系統(tǒng)中,您可以知道工作在哪里,或者您可以知道工作何時(shí)完成,但您無(wú)法同時(shí)了解兩者;兩階段協(xié)議本質(zhì)上是反可用性協(xié)議。
完備性
兩階段提交協(xié)議是否嚴(yán)格支持ACID,各種異常場(chǎng)景是不是都可以覆蓋?
2PC在commit階段發(fā)送異常,其實(shí)跟最大努力一階段提交類(lèi)似也會(huì)有部分可見(jiàn)問(wèn)題,嚴(yán)格講一段時(shí)間內(nèi)并不能保證A原子性和C一致性(待故障恢復(fù)后recovery機(jī)制可以保證最終的A和C)。
完備的分布式事務(wù)支持并不是一件簡(jiǎn)單的事情,需要可以應(yīng)對(duì)網(wǎng)絡(luò)以及各種硬件包括網(wǎng)卡、磁盤(pán)、CPU、內(nèi)存、電源等各類(lèi)異常,通過(guò)嚴(yán)格的測(cè)試。
之前跟某友商交流,他們甚至說(shuō)目前已知的NewSQL在分布式事務(wù)支持上都是不完整的,他們都有案例跑不過(guò),圈內(nèi)人士這么篤定,也說(shuō)明了分布式事務(wù)的支持完整程度其實(shí)是層次不齊的。
但分布式事務(wù)又是這些NewSQL數(shù)據(jù)庫(kù)的一個(gè)非常重要的底層機(jī)制,跨資源的DML、DDL等都依賴其實(shí)現(xiàn),如果這塊的性能、完備性打折扣,上層跨分片SQL執(zhí)行的正確性會(huì)受到很大影響。
性能
傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)也支持分布式事務(wù)XA,但為何很少有高并發(fā)場(chǎng)景下用呢?
因?yàn)閄A的基礎(chǔ)兩階段提交協(xié)議存在網(wǎng)絡(luò)開(kāi)銷(xiāo)大,阻塞時(shí)間長(zhǎng)、死鎖等問(wèn)題,這也導(dǎo)致了其實(shí)際上很少大規(guī)模用在基于傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的OLTP系統(tǒng)中。
SI是樂(lè)觀鎖,在熱點(diǎn)數(shù)據(jù)場(chǎng)景,可能會(huì)大量的提交失敗。另外SI的隔離級(jí)別與RR并無(wú)完全相同,它不會(huì)有幻想讀,但會(huì)有寫(xiě)傾斜。

解決分布式事務(wù)是否只能用兩階段提交協(xié)議? oceanbase1.0中通過(guò)updateserver避免分布式事務(wù)的思路很有啟發(fā)性 ,不過(guò)2.0版后也變成了2PC。
業(yè)界分布式事務(wù)也并非只有兩階段提交這一解,也有其它方案its-time-to-move-on-from-two-phase(如果打不開(kāi),國(guó)內(nèi)有翻譯版https://www.jdon.com/51588)
HA與異地多活
主從模式并不是最優(yōu)的方式,就算是半同步復(fù)制,在極端情況下(半同步轉(zhuǎn)異步)也存在丟數(shù)問(wèn)題
目前業(yè)界公認(rèn)更好的方案是基于paxos分布式一致性協(xié)議或者其它類(lèi)paxos如raft方式,Google Spanner、TiDB、cockcoachDB、OB都采用了這種方式,基于Paxos協(xié)議的多副本存儲(chǔ),遵循過(guò)半寫(xiě)原則,支持自動(dòng)選主,解決了數(shù)據(jù)的高可靠,縮短了failover時(shí)間,提高了可用性,特別是減少了運(yùn)維的工作量,這種方案技術(shù)上已經(jīng)很成熟,也是NewSQL數(shù)據(jù)庫(kù)底層的標(biāo)配。
分布式一致性算法本身并不難,但具體在工程實(shí)踐時(shí),需要考慮很多異常并做很多優(yōu)化,實(shí)現(xiàn)一個(gè)生產(chǎn)級(jí)可靠成熟的一致性協(xié)議并不容易。例如實(shí)際使用時(shí)必須轉(zhuǎn)化實(shí)現(xiàn)為multi-paxos或multi-raft,需要通過(guò)batch、異步等方式減少網(wǎng)絡(luò)、磁盤(pán)IO等開(kāi)銷(xiāo)。
Scale橫向擴(kuò)展與分片機(jī)制
paxos算法解決了高可用、高可靠問(wèn)題,并沒(méi)有解決Scale橫向擴(kuò)展的問(wèn)題,所以分片是必須支持的。NewSQL數(shù)據(jù)庫(kù)都是天生內(nèi)置分片機(jī)制的,而且會(huì)根據(jù)每個(gè)分片的數(shù)據(jù)負(fù)載(磁盤(pán)使用率、寫(xiě)入速度等)自動(dòng)識(shí)別熱點(diǎn),然后進(jìn)行分片的分裂、數(shù)據(jù)遷移、合并,這些過(guò)程應(yīng)用是無(wú)感知的,這省去了DBA的很多運(yùn)維工作量。以TiDB為例,它將數(shù)據(jù)切成region,如果region到64M時(shí),數(shù)據(jù)自動(dòng)進(jìn)行遷移。
分庫(kù)分表模式也能做到在線擴(kuò)容,基本思路是通過(guò)異步復(fù)制先追加數(shù)據(jù),然后設(shè)置只讀完成路由切換,最后放開(kāi)寫(xiě)操作,當(dāng)然這些需要中間件與數(shù)據(jù)庫(kù)端配合一起才能完成。
分布式SQL支持
常見(jiàn)的單分片SQL,這兩者都能很好支持。NewSQL數(shù)據(jù)庫(kù)由于定位與目標(biāo)是一個(gè)通用的數(shù)據(jù)庫(kù),所以支持的SQL會(huì)更完整,包括跨分片的join、聚合等復(fù)雜SQL。中間件模式多面向應(yīng)用需求設(shè)計(jì),不過(guò)大部分也支持帶拆分鍵SQL、庫(kù)表遍歷、單庫(kù)join、聚合、排序、分頁(yè)等。但對(duì)跨庫(kù)的join以及聚合支持就不夠了。
NewSQL數(shù)據(jù)庫(kù)往往選擇兼容MySQL或者PostgreSQL協(xié)議,所以SQL支持僅局限于這兩種,中間件例如驅(qū)動(dòng)模式往往只需做簡(jiǎn)單的SQL解析、計(jì)算路由、SQL重寫(xiě),所以可以支持更多種類(lèi)的數(shù)據(jù)庫(kù)SQL。
這里也可以看出中間件+分庫(kù)分表模式的架構(gòu)風(fēng)格體現(xiàn)出的是一種妥協(xié)、平衡,它是一個(gè)面向應(yīng)用型的設(shè)計(jì);而NewSQL數(shù)據(jù)庫(kù)則要求更高、“大包大攬”,它是一個(gè)通用底層技術(shù)軟件,因此后者的復(fù)雜度、技術(shù)門(mén)檻也高很多。
存儲(chǔ)引擎
傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的存儲(chǔ)引擎設(shè)計(jì)都是面向磁盤(pán)的,大多都基于B+樹(shù)。B+樹(shù)通過(guò)降低樹(shù)的高度減少隨機(jī)讀、進(jìn)而減少磁盤(pán)尋道次數(shù),提高讀的性能,但大量的隨機(jī)寫(xiě)會(huì)導(dǎo)致樹(shù)的分裂,從而帶來(lái)隨機(jī)寫(xiě),導(dǎo)致寫(xiě)性能下降。
NewSQL的底層存儲(chǔ)引擎則多采用LSM,相比B+樹(shù)LSM將對(duì)磁盤(pán)的隨機(jī)寫(xiě)變成順序?qū)懀蟠筇岣吡藢?xiě)的性能。
不過(guò)LSM的的讀由于需要合并數(shù)據(jù)性能比B+樹(shù)差,一般來(lái)說(shuō)LSM更適合應(yīng)在寫(xiě)大于讀的場(chǎng)景。當(dāng)然這只是單純數(shù)據(jù)結(jié)構(gòu)角度的對(duì)比,在數(shù)據(jù)庫(kù)實(shí)際實(shí)現(xiàn)時(shí)還會(huì)通過(guò)SSD、緩沖、bloom filter等方式優(yōu)化讀寫(xiě)性能,所以讀性能基本不會(huì)下降太多。
NewSQL數(shù)據(jù)由于多副本、分布式事務(wù)等開(kāi)銷(xiāo),相比單機(jī)關(guān)系數(shù)據(jù)庫(kù)SQL的響應(yīng)時(shí)間并不占優(yōu),但由于集群的彈性擴(kuò)展,整體QPS提升還是很明顯的,這也是NewSQL數(shù)據(jù)庫(kù)廠商說(shuō)分布式數(shù)據(jù)庫(kù)更看重的是吞吐,而不是單筆SQL響應(yīng)時(shí)間的原因。
成熟度與生態(tài)
分布式數(shù)據(jù)庫(kù)是個(gè)新型通用底層軟件,準(zhǔn)確的衡量與評(píng)價(jià)需要一個(gè)多維度的測(cè)試模型,需包括發(fā)展現(xiàn)狀、使用情況、社區(qū)生態(tài)、監(jiān)控運(yùn)維、周邊配套工具、功能滿足度、DBA人才、SQL兼容性、性能測(cè)試、高可用測(cè)試、在線擴(kuò)容、分布式事務(wù)、隔離級(jí)別、在線DDL等等
雖然NewSQL數(shù)據(jù)庫(kù)發(fā)展經(jīng)過(guò)了一定時(shí)間檢驗(yàn),但多集中在互聯(lián)網(wǎng)以及傳統(tǒng)企業(yè)非核心交易系統(tǒng)中,目前還處于快速迭代、規(guī)模使用不斷優(yōu)化完善的階段。
對(duì)于互聯(lián)網(wǎng)公司,數(shù)據(jù)量的增長(zhǎng)壓力以及追求新技術(shù)的基因會(huì)更傾向于嘗試NewSQL數(shù)據(jù)庫(kù),不用再考慮庫(kù)表拆分、應(yīng)用改造、擴(kuò)容、事務(wù)一致性等問(wèn)題怎么看都是非常吸引人的方案。
對(duì)于傳統(tǒng)企業(yè)例如銀行這種風(fēng)險(xiǎn)意識(shí)較高的行業(yè)來(lái)說(shuō),NewSQL數(shù)據(jù)庫(kù)則可能在未來(lái)一段時(shí)間內(nèi)仍處于探索、審慎試點(diǎn)的階段。
總結(jié)
如果看完以上內(nèi)容,您還不知道選哪種模式,那么結(jié)合以下幾個(gè)問(wèn)題,先思考下NewSQL數(shù)據(jù)庫(kù)解決的點(diǎn)對(duì)于自身是不是真正的痛點(diǎn):
強(qiáng)一致事務(wù)是否必須在數(shù)據(jù)庫(kù)層解決? 數(shù)據(jù)的增長(zhǎng)速度是否不可預(yù)估的? 擴(kuò)容的頻率是否已超出了自身運(yùn)維能力? 相比響應(yīng)時(shí)間更看重吞吐? 是否必須做到對(duì)應(yīng)用完全透明? 是否有熟悉NewSQL數(shù)據(jù)庫(kù)的DBA團(tuán)隊(duì)?
如果你還未做出抉擇,不妨再想想下面幾個(gè)問(wèn)題:
最終一致性是否可以滿足實(shí)際場(chǎng)景? 數(shù)據(jù)未來(lái)幾年的總量是否可以預(yù)估? 擴(kuò)容、DDL等操作是否有系統(tǒng)維護(hù)窗口? 對(duì)響應(yīng)時(shí)間是否比吞吐更敏感? 是否需要兼容已有的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)? 是否已有傳統(tǒng)數(shù)據(jù)庫(kù)DBA人才的積累? 是否可容忍分庫(kù)分表對(duì)應(yīng)用的侵入?
來(lái)源:jianshu.com/p/9131edd8fd2c
版權(quán)申明:內(nèi)容來(lái)源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無(wú)法確認(rèn),我們都會(huì)標(biāo)明作者及出處,如有侵權(quán)煩請(qǐng)告知,我們會(huì)立即刪除并表示歉意。謝謝!

評(píng)論
圖片
表情
