突破關(guān)系型數(shù)據(jù)庫桎梏:云原生數(shù)據(jù)庫中間件核心剖析

NewSQL的三種分類中,新架構(gòu)和云數(shù)據(jù)庫涉及了太多與數(shù)據(jù)庫相關(guān)的底層實現(xiàn),為了保證本文的范圍不至太過發(fā)散,我們重點介紹透明化分片數(shù)據(jù)庫中間件的核心功能與實現(xiàn)原理,另外兩種類型的NewSQL在核心功能上類似,但實現(xiàn)原理會有所差別。
一、數(shù)據(jù)分片
傳統(tǒng)的將數(shù)據(jù)集中存儲至單一數(shù)據(jù)節(jié)點的解決方案,在性能和可用性兩方面已經(jīng)難于滿足互聯(lián)網(wǎng)的海量數(shù)據(jù)場景。由于關(guān)系型數(shù)據(jù)庫大多采用B+樹類型的索引,在數(shù)據(jù)量超過閾值的情況下,索引深度的增加也將使得磁盤訪問的IO次數(shù)增加,進而導致查詢性能的大幅下降;同時高并發(fā)訪問請求也使得集中式數(shù)據(jù)庫成為系統(tǒng)的最大瓶頸。
新架構(gòu)的NewSQL會重新設計數(shù)據(jù)庫存儲引擎,將同一表中的數(shù)據(jù)存儲在分布式文件系統(tǒng)中。
數(shù)據(jù)分片中間件則是盡量透明化分庫分表所帶來的影響,讓使用方盡量像使用一個數(shù)據(jù)庫一樣使用水平分片之后的數(shù)據(jù)庫。

消息長度為int<3>類型。它表示隨后的消息體所占用的字節(jié)總數(shù)。需要注意的是,消息長度并不包含序列主鍵的占位在內(nèi)。
序列主鍵為int<1>類型。它表示一次請求后返回的多個MySQL協(xié)議包中,每個協(xié)議包的序號。占位為1字節(jié)的序列主鍵最大值為0xff,即十進制的255,但這并非表示每次請求最多只能包含255個MySQL協(xié)議包,超過255的序列主鍵將再次從0開始計數(shù)。例如一次查詢可能返回幾十萬的記錄,那么MySQL協(xié)議包只需保證其序列主鍵連續(xù),將大于255的序列主鍵重置為0,重新開始計數(shù)即可。
消息體的長度為消息長度所聲明的字節(jié)數(shù)。它是MySQL協(xié)議包中真正的業(yè)務數(shù)據(jù),根據(jù)不同的協(xié)議包類型,消息體的內(nèi)容也不同。


COM_QUERY

COM_STMT_PREPARE
COM_STMT_EXECUTE
流式歸并用于簡單查詢、排序查詢、分組查詢及排序和分組但排序項和分組項完全一致的場景,流式歸并結(jié)果集的遍歷方式是通過每一次調(diào)用next方法取出,無需占用額外的內(nèi)存。
內(nèi)存歸并則需要將結(jié)果集中所有數(shù)據(jù)加載至內(nèi)存處理,如果結(jié)果集數(shù)據(jù)過多,會占用大量內(nèi)存。
原子性(Atomicity)指事務作為整體來執(zhí)行,要么全部執(zhí)行,要么全不執(zhí)行。
一致性(Consistency)指事務應確保數(shù)據(jù)從一個一致的狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€一致的狀態(tài)。
隔離性(Isolation)指多個事務并發(fā)執(zhí)行時,一個事務的執(zhí)行不應影響其他事務的執(zhí)行。
持久性(Durability)指已提交的事務修改數(shù)據(jù)會被持久保存。

在準備階段時,全局事務管理器向每個資源管理器發(fā)送準備消息,用于確認本地事務操作的成功與否;
在提交階段時,若全局事務管理器收到了所有資源管理器回復的成功消息,則向每個資源管理器發(fā)送提交消息,否則發(fā)送回滾消息。資源管理器根據(jù)接收到的消息對本地事務進行提交或回滾操作。

基本可用保證分布式事務參與方不一定同時在線;
柔性狀態(tài)允許系統(tǒng)狀態(tài)更新有一定的延時,這個延時對客戶來說不一定能夠察覺;
最終一致性通常是通過消息可達的方式保證系統(tǒng)的最終一致性。
子事務序列T1,T2,…,Tn得以完成 。這是事務的最佳情況,即無需回滾的情況。
或者序列T1,T2,…,Tx, Cx,…,C2,C1,(其中x小于n)得以完成。它能夠保證當回滾發(fā)生時,補償操作按照正向操作相反的順序依次執(zhí)行。
Try。完成業(yè)務檢查,預留業(yè)務所需資源。Try操作是整個TCC的精髓所在,可靈活選擇業(yè)務資源鎖的粒度。
Confirm。執(zhí)行業(yè)務邏輯,直接使用Try階段預留的業(yè)務資源,無需再次做業(yè)務檢查。
Cancel。釋放Try階段預留的業(yè)務資源。

檢查A賬戶有效性,即查看A賬戶的狀態(tài)是否為“轉(zhuǎn)帳中”或者“凍結(jié)”;
檢查A賬戶余額是否充足;
從A賬戶中扣減100元,并將狀態(tài)置為“轉(zhuǎn)賬中”;
預留扣減資源,將從A往B賬戶轉(zhuǎn)賬100元這個事件存入消息或者日志中。
不做任何操作。
A賬戶增加100元;
從日志或者消息中,釋放扣減資源。
檢查B賬戶賬戶是否有效。
讀取日志或者消息,B賬戶增加100元;
從日志或者消息中,釋放扣減資源。
不做任何操作。


配置中心用于配置集中化以及動態(tài)配置更新及通知下發(fā);
注冊中心用于服務發(fā)現(xiàn),這里的服務是指數(shù)據(jù)庫中間層實例本身,通過它可以實現(xiàn)狀態(tài)監(jiān)測及自動通知,進而使得數(shù)據(jù)庫中間件具備高可用和自我治愈能力;
限流用于流量的過載保護,分為數(shù)據(jù)庫中間件本身的流量過載保護和對數(shù)據(jù)庫的流量過載保護;
熔斷也是流量過載的保護措施之一,它的不同之處在于熔斷整個客戶端對數(shù)據(jù)庫的訪問,以保護數(shù)據(jù)庫能夠為其他流量正常的系統(tǒng)繼續(xù)提供服務,可以通過前文講的熔斷器模式實現(xiàn)自動熔斷機制;
失效轉(zhuǎn)移用于多數(shù)據(jù)副本的情況,在數(shù)據(jù)完全一致的多數(shù)據(jù)節(jié)點中,當某一節(jié)點不可用后,可通過失效轉(zhuǎn)移的機制讓數(shù)據(jù)庫中間件訪問至另外有效的數(shù)據(jù)節(jié)點操作數(shù)據(jù);
調(diào)用鏈路追蹤則是將對數(shù)據(jù)庫訪問的調(diào)用鏈路、性能、拓撲關(guān)系等指標以可視化的方式展現(xiàn)出來。
同步線上雙寫。即同時將數(shù)據(jù)寫入分片策略修改前的原數(shù)據(jù)節(jié)點及分片策略修改后的新數(shù)據(jù)節(jié)點。可以通過一致性算法來保證雙寫的一致性,如前文介紹過的Paxos或Raft算法;
歷史數(shù)據(jù)遷移。以離線的方式,將需要遷移到新數(shù)據(jù)節(jié)點部分的歷史存量數(shù)據(jù)從原有數(shù)據(jù)節(jié)點遷移過去。可以通過SQL的方式,也可以通過binlog等二進制方式進行處理;
數(shù)據(jù)源切換。將讀寫請求切換至新的數(shù)據(jù)源,并停止對原數(shù)據(jù)節(jié)點的雙寫;
清理冗余數(shù)據(jù)。在舊數(shù)據(jù)節(jié)點中,清理已遷移至新數(shù)據(jù)節(jié)點的相關(guān)數(shù)據(jù)。





