天天看點

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

作者:夢實

PolarDB-X 2.0(以下簡稱PolarDB-X)與DRDS(DRDS也稱為PolarDB-X 1.0)都是阿裡雲上的分布式資料庫産品。看起來她們都是Share-Nothing的架構,用水準擴充來解決單機資料庫瓶頸問題。很多同學是以會有疑惑,她們倆到底有什麼樣的差別?

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資源:

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

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

如寶馬3系和5系:PolarDB-X 與 DRDS 并駕齊驅
  1. 擴容

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

PolarDB-X中,你隻需要選擇節點數,資料将自動均衡地分布在各個存儲節點上。

  1. 資料同步

如果你要将DRDS中的資料同步到下遊,很多時候你需要使用DTS來訂閱其中的每一個MySQL執行個體,并仔細處理同一個邏輯表的不同分表之間例如表名的差異等細節,并且DDL操作會讓這個同步鍊路中斷。

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

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

如寶馬3系和5系:PolarDB-X 與 DRDS 并駕齊驅
  1. 讀寫分離

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

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

同時,PolarDB-X的存儲節點,支援Follower上的一緻性讀,是以你不需要擔心在備庫上讀取資料會讀到老的資料,任何時候去讀,都能讀到最新的資料。

如寶馬3系和5系:PolarDB-X 與 DRDS 并駕齊驅
  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的架構圖:

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

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

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

這是PolarDB-X的架構圖:

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

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

  1. PolarDB-X使用X-DB作為其DN(資料節點)。X-DB使用Paxos( PolarDB-X 一緻性共識協定 —— X-Paxos )做到了RPO=0。
  2. PolarDB-X相比DRDS,引入了一個新的元件:GMS(Global Meta Service),他具備非常重要的作用:
    • 提供分布式事務所使用的全局自增的時間戳
    • 根據負載情況,排程資料的分布,使節點之間達到均衡
    • 提供統一的中繼資料,例如INFORMATION_SCHEMA
    • 對CN與DN進行管理,例如切換、上下線等
  1. DRDS的擴容基于binlog,依賴外圍管控系統完成。PolarDB-X的擴容基于分布式事務,由核心完成。
  2. 架構繼續往下細化,我們可以看一下其資料的分布情況:

DRDS下的RDS是傳統的主備(或者三節點)架構,主備以執行個體級為機關,正常情況下備庫不提供服務:

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

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

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

事務模型

事務的實作機制,是一個資料庫最根本的特征,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操作,它們就可能讀到不一樣的結果。

如下的時間線:

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

其中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的中轉,會增加一跳的網絡延遲:

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

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

如寶馬3系和5系:PolarDB-X 與 DRDS 并駕齊驅
  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%
節點CPU QPS RT-AVG RT-MAX RT-95%
PolarDB-X 710.6% 97067.20 3.09ms 108.12ms 6.53ms
DRDS 1289% 69787.34 4.30ms 110.30ms 10.67ms

sysbench-oltp

  • 150并發
  • +14.4%
1139% 22587.23 119.52ms 757.47ms 471.02ms
1236% 19732.12 136.82ms 798.47ms 415.74ms
  1. MPP引擎對分析類查詢的加速

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

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

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

小結

PolarDB-X與DRDS的差異是方方面面的,DRDS是分庫分表中間件的代表,PolarDB-X是雲原生分布式資料庫。有一個形象的比喻,DRDS和PolarDB-X的關系相當于寶馬3系和5系,她們将長期共存,為不同需求的使用者提供服務。

【相關閱讀】

PolarDB-X 存儲架構之“基于Paxos的最佳生産實踐” PolarDB-X 私有協定:提升叢集的性能和穩定性 技術解讀 | PolarDB-X 分布式事務的實作 技術解讀 | PolarDB-X 強一緻分布式事務 PolarDB-X 一緻性共識協定 (X-Paxos)