如寶馬3系和5系:PolarDB-X 與 DRDS 並駕齊驅

作者:夢實

DRDS,其本質是搭建在標準MySQL(阿里雲上的RDS For MySQL)上的分庫分表中間件,具有很高的靈活性。

PolarDB-X是使用雲原生技術的分佈式數據庫,具有一體化的數據庫體驗,其存儲節點是經過了高度定製的MySQL,從而提供了大量中間件無法提供的能力(使用全局MVCC的強一致的分佈式事務、私有RPC協議帶來的性能提升、Follower上的一致性讀能力等等)。

本文帶大家從各個角度剖析下,PolarDB-X與DRDS的異同。

首先簡單說下她們相似的地方:

  1. 她們都能基於Share-Nothing的架構,具備極強的水平擴展能力

  2. 她們都基於MySQL的生態體系,具有很高的MySQL兼容性

  3. 她們使用同樣的SQL引擎,具備相似的SQL執行能力

  4. 她們均提供分佈式事務、全局索引等常見中間件不具備的高階能力

  5. 她們都在阿里巴巴內部廣泛使用,歷經多年雙十一的考驗,穩定可靠

接下來我們重點看下她們有哪些區別。

使用體驗

拋開技術原理,我們先看下最直觀的產品體驗上有哪些異同。

  1. 購買實例

由於DRDS是一箇中間件,所以其和MySQL的接線劃分得比較清晰,DRDS本身不包含MySQL(RDS)資源,MySQL由用戶單獨購買。你需要在兩個產品的控制檯上單獨進行購買,並在DRDS控制檯上將其組裝在一起。

PolarDB-X提供的是一個整體的數據庫服務,你只需要創建一個PolarDB-X實例即可,其中包含了所需要的計算資源、存儲資源。

  1. 建庫

DRDS中,建庫需要在控制檯完成,並且在建庫過程中需要選擇已有或者購買新的MySQL資源:

PolarDB-X中,你可以像使用單機數據庫一樣,使用你習慣的工具進行連接,然後使用CREATE DATABASE指令創建數據庫:

  1. 擴容

DRDS中,你需要評估每個MySQL的容量,並選擇將哪些分庫挪到新的MySQL存儲上。

PolarDB-X中,你只需要選擇節點數,數據將自動均衡地分佈在各個存儲節點上。

  1. 數據同步

如果你要將DRDS中的數據同步到下游,很多時候你需要使用DTS來訂閱其中的每一個MySQL實例,並仔細處理同一個邏輯表的不同分表之間例如表名的差異等細節,並且DDL操作會讓這個同步鏈路中斷。

PolarDB-X提供一個統一的binlog服務,你可以使用DTS像訂閱一個單機MySQL一樣來訂閱它。這個binlog服務完全兼容MySQL,其屏蔽了所有的分佈式的細節,讓下游服務認爲它是一個普通的單機MySQL(例如PolarDB-X支持包括SHOW BINLOG EVENTS在內的所有BINLOG相關的指令)。

  1. 讀寫分離

DRDS中,你可以使用只讀實例(備庫)來進行一些高消耗的SQL,避免對在線業務產生影響。但是,你需要手動來判斷這些SQL的類型,並通過HINT、不同的連接串等方式,將其放到正確的地方來執行。同時,你需要注意備庫上存在延遲,你需要改造你的業務系統,使其能夠容忍這種延遲。

PolarDB-X中,應用使用一個連接串即可,你無需關注這些SQL的類型和代價(用不着給它們加HINT),它的優化器會自動識別這些SQL的代價,並且使用正確的資源池來執行它們,盡最大可能避免AP的SQL影響到TP的SQL。

同時,PolarDB-X的存儲節點,支持Follower上的一致性讀,因此你不需要擔心在備庫上讀取數據會讀到老的數據,任何時候去讀,都能讀到最新的數據。

  1. 運維

由於DRDS允許使用你自己購買的MySQL實例進行組件,因此你擁有這些MySQL實例完整的運維權限,你可以對它們做任何你想做的事情,例如:

  • 負載不均衡時,單獨對其中一個節點進行規格的升級
  • 將其中的某個存儲節點給其他的業務使用
  • 使用任意版本的RDS(5.6、5.7、8.0均可)
  • 訂閱任意一個RDS的binlog

但是,這種靈活性也存在一定的風險,例如,我們沒有辦法阻止你直接刪除其中的一個分庫,這會導致DRDS無法正常訪問這個分庫上的數據。

PolarDB-X對用戶屏蔽了存儲節點,你不能、也不需要直接訪問其存儲節點,它將一個數據庫的整體視角呈現給用戶,它通過自動的負載均衡、邏輯binlog、混合負載的HTAP等能力來減少你對存儲節點直接訪問的需求。目前PolarDB-X DN主要基於的的MySQL版本爲5.7,後續8.0的支持也已經在規劃中。

架構差異

以上的差異,很多由其架構決定,我們看下PolarDB-X與DRDS在架構上的差異點。

這是DRDS的架構圖

DRDS的架構中,大量功能依賴外圍管控系統完成,例如:

  • 擴容,使用內部一個叫精衛的組件來進行。
  • 元數據,一個地域內會共享一個叫Diamond的存儲
  • 主備探活、切換,依賴一個叫ADHA的組件
  • 等等

這是PolarDB-X的架構圖

PolarDB-X中,核心功能全部內聚到內核。

  1. PolarDB-X使用X-DB作爲其DN(數據節點)。X-DB使用Paxos做到了RPO=0。

  2. PolarDB-X相比DRDS,引入了一個新的組件:GMS(Global Meta Service),他具備非常重要的作用:

  • 提供分佈式事務所使用的全局自增的時間戳
  • 根據負載情況,調度數據的分佈,使節點之間達到均衡
  • 提供統一的元數據,例如INFORMATION_SCHEMA
  • 對CN與DN進行管理,例如切換、上下線等
  1. DRDS的擴容基於binlog,依賴外圍管控系統完成。PolarDB-X的擴容基於分佈式事務,由內核完成。

  2. 架構繼續往下細化,我們可以看一下其數據的分佈情況:

DRDS下的RDS是傳統的主備(或者三節點)架構,主備以實例級爲單位,正常情況下備庫不提供服務:

PolarDB-X下的DN,均爲三節點架構,Paxos組以分片爲單位,一個節點可以同時是一個分片的Leader與另一個分片的Follower,資源利用率更高:



事務模型

事務的實現機制,是一個數據庫最根本的特徵,PolarDB-X與DRDS上的事務機制,有着非常巨大的差異。

DRDS使用的是MySQL官方提供的XA事務。XA事務可以保證寫入操作的原子性。

但是,標準的XA存在一個問題是,可能會在一個分片讀到已提交的數據,再另一個分片讀到未提交的數據。

例如,有兩張空表t1(pk,name,addr) dbpartition by hash(pk),t2(pk,name,addr) dbpartition by hash(name)。假如應用在事務1中對兩張表分別進行一個插入操作insert into t1 values (1,'sun','hz'),insert into t2 values (1,'sun','hz'):

begin;
insert into t1 (pk,name,addr) values (1,'sun','hz');
insert into t2 (pk,name,addr) values (1,'sun','hz');
prepare p1;
prepare p2;
commit p1;
commit p2;

同時,有另一個只讀事務,分別對t1與t2進行count操作,它們就可能讀到不一樣的結果。

如下的時間線:

其中t1時刻,在一個事務內對t1和t2表進行查詢,會得到不一樣的記錄數,這是一個不一致的結果。

DRDS中,爲了解決這個問題,使用的是加鎖的實現,在衝突多的情況下,有比較高的代價。

PolarDB-X使用自研的全局MVCC事務,在兩階段提交(2PC)的基礎上,增加了事務快照時間戳(snapshot_ts)和提交時間戳(commit_ts)的支持。時間戳來自於全局 TSO 的分配,因此能做到外部一致的事務保證,並且避免了額外的加鎖。在上述例子中,t1的時間由於比commit的時間晚,因此一定能讀到兩張表都是1的結果。

PolarDB-X的事務機制相對比較複雜,請大家參考:PolarDB-X 強一致分佈式事務原理

性能提升

PolarDB-X的性能相對DRDS有很大的提升,主要體現在幾個方面。

  1. 精簡的網絡結構

DRDS連接RDS,使用的是RDS標準的訪問鏈路,中間需要經過SLB的中轉,會增加一跳的網絡延遲:

PolarDB-X的CN節點與DN節點均在一個物理網絡中,中間是點對點的直連,不經過任何SLB/LVS等中轉,具有最低的網絡延遲,下圖是一個CN到DN的網絡拓撲示意:

  1. 私有RPC協議

DRDS使用標準的MySQL協議連接RDS,發送標準的SQL語句。但這裏會有不少的開銷,例如:

  • SQL經過DRDS優化器的優化後,還需被MySQL的優化器再次優化,如果涉及到多個MySQL分片,重複的次數會更多。

  • MySQL協議中有很多的冗餘元素,例如結果集的頭,裏面存儲了結果集每一行的名字、類型等信息,這些是不需要的。

  • MySQL協議返回的數據與DRDS內部計算使用的數據並不是一個格式,這中間需要經過再次轉換。

  • DRDS使用連接池來連接MySQL,MySQL的連接與線程是綁定關係,同一個連接上同一時間只能執行一個SQL。這導致DRDS與RDS之間需要維持大量的連接。

PolarDB-X爲了解決DRDS存在的這些問題,對MySQL進入了大量定製,中間的通信才用了私有的RPC協議,與MySQL協議相比有以下幾個優勢:

  • 傳遞的不再是SQL,而是執行計劃,避免MySQL重複對SQL進行解析、優化的代價。

  • 使用異步模型,連接與線程、連接與會話不在是一一綁定的關係,使用比較少的連接即可滿足需求。

  • 精簡了通信中不需要的信息,例如結果集的頭等。

  • 傳輸的數據格式與CN計算使用的格式完全一致,避免數據的二次轉換。

通過使用私有的RPC協議,PolarDB-X相對於DRDS,在很多場景下得到了性能提升。

sysbench-select

  • 1.6億行數據

  • 300併發

  • 計算節點和存儲節點規格均爲16c64g

  • +39%

sysbench-oltp

  • 1.6億行數據

  • 150併發

  • 計算節點和存儲節點規格均爲16c64g

  • +14.4%

  1. MPP引擎對分析類查詢的加速

DRDS中使用的是SMP(單機並行)技術,PolarDB-X中使用的是MPP(多機並行)技術。這使得PolarDB-X相對於DRDS,在面對複雜分析查詢時,可以使用更多的資源來加速。這個性能差異體現在TPC-H上非常顯著。下面是同資源情況下,DRDS與PolarDB-X在TPC-H上的對比:

DRDS 總耗時386s,PolarDB-X總耗時274s。

小結

PolarDB-X與DRDS的差異是方方面面的,DRDS是分庫分表中間件的代表,PolarDB-X是雲原生分佈式數據庫。有一個形象的比喻,DRDS和PolarDB-X的關係相當於寶馬3系和5系,她們將長期共存,爲不同需求的用戶提供服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章