分庫分表 vs NewSQL數(shù)據(jù)庫
你知道的越多,不知道的就越多,業(yè)余的像一棵小草!
成功路上并不擁擠,因?yàn)閳?jiān)持的人不多。
編輯:業(yè)余草
jianshu.com/p/9131edd8fd2c
推薦:https://www.xttblog.com/?p=5182
NewSQL數(shù)據(jù)庫先進(jìn)在哪兒?
基于中間件(包括SDK和Proxy兩種形式)+傳統(tǒng)關(guān)系數(shù)據(jù)庫(分庫分表)模式是不是分布式架構(gòu)?

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

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