PolarDB-X 2.0:使用一個透明的分布式數(shù)據(jù)庫是一種什么體驗
透明分布式,是PolarDB-X即將發(fā)布的能力,它能讓應(yīng)用在使用PolarDB-X的過程中,猶如使用單機(jī)數(shù)據(jù)庫一般的體驗。
與傳統(tǒng)的中間件類型的“分布式數(shù)據(jù)庫”相比,有了透明分布式能力的PolarDB-X,不再需要應(yīng)用考慮分區(qū)鍵的概念,應(yīng)用可以完全將單機(jī)MySQL上開發(fā)的建表語句、應(yīng)用代碼直接遷移到PolarDB-X上運(yùn)行起來。
本文將為大家介紹PolarDB-X透明分布式的新體驗。
在PolarDB-X上安裝一個WordPress
WordPress是一個開源的博客軟件,它使用MySQL作為其數(shù)據(jù)庫。操作是在PolarDB-X上安裝一個WordPress,來體驗PolarDB-X的透明分布式能力。
我們將遵循簡單的三步走:
不修改DDL直接建表
不修改應(yīng)用直接跑起來
做下壓測,做下調(diào)優(yōu)
總結(jié)如下:
使用官方的WordPress鏡像,不做任何修改,其安裝程序就能自動的在PolarDB-X上完成建表、數(shù)據(jù)初始化等工作,其使用的都是標(biāo)準(zhǔn)的MySQL語法。
對此WordPress進(jìn)行壓測,PolarDB-X的各項監(jiān)控數(shù)據(jù)顯示,各節(jié)點處于的負(fù)載、數(shù)據(jù)量均處于均衡的狀態(tài)。
通過PolarDB-X提供的SQL分析、DAS等工具,可以方便的找到系統(tǒng)中熱點SQL。
DBA可以直接通過創(chuàng)建索引、修改數(shù)據(jù)分布等DDL語句對系統(tǒng)性能做進(jìn)一步的優(yōu)化,不需要修改應(yīng)用。
PolarDB-X實現(xiàn)透明分布式的武器
下面為大家分享下,PolarDB-X是如何實現(xiàn)透明分布式的。
透明數(shù)據(jù)分區(qū)
PolarDB-X是一個典型的Share Nothing的分布式數(shù)據(jù)庫,其簡化架構(gòu)如下:
其核心組件為無狀態(tài)的計算節(jié)點CN,與有狀態(tài)的存儲節(jié)點DN。
要了解PolarDB-X的透明分布式能力,首先要了解數(shù)據(jù)在PolarDB-X上是如何分布的。
在PolarDB-X中,一個表由多個索引組成,包括主鍵、二級索引等。PolarDB-X會對每個索引進(jìn)行獨立的進(jìn)行分區(qū),其分區(qū)鍵為索引的key。
例如一個典型的電商場景,訂單表,擁有一個主鍵(id),兩個索引(seller_id與buyer_id):
- create table orders ( id bigint, buyer_id varchar comment '買家', seller_id varchar comment '賣家', primary key(id), index sdx(seller_id), index bdx(buyer_id))
對于主鍵索引,會按照id對其進(jìn)行分區(qū)
對于索引sdx,會按照seller_id進(jìn)行分區(qū)
對于索引bdx,會按照buyer_id進(jìn)行分區(qū)
如下圖所示:
對索引進(jìn)行分片之后,PolarDB-X會將這些分片打散到不同的存儲節(jié)點里,并會按照數(shù)據(jù)量等信息進(jìn)行負(fù)載均衡,如下圖所示:
在PolarDB-X中,建表語句中可以不考慮分區(qū)鍵,PolarDB-X也能自動的對表進(jìn)行分片與負(fù)載均衡。
因此,應(yīng)用遷移PolarDB-X時,可以將單機(jī)MySQL中的建表語句導(dǎo)出,不需要修改直接在PolarDB-X中執(zhí)行即可。
透明的分布式事務(wù)
分布式事務(wù)是PolarDB-X中的最重要的基礎(chǔ)能力,它廣泛的應(yīng)用于業(yè)務(wù)內(nèi),避免了業(yè)務(wù)對事務(wù)代碼進(jìn)行改造;同時,PolarDB-X內(nèi)部也用事務(wù)來實現(xiàn)索引。
PolarDB-X的分布式事務(wù)有以下幾個特征:
與Spanner一樣,滿足外部一致性這種最強(qiáng)的一致性級別
語法與MySQL完全兼容,無需對應(yīng)用進(jìn)行改造
行為上支持兼容MySQL的RC與RR級別
Online DDL
PolarDB-X支持類型豐富的Online DDL,這里介紹一些有代表性的DDL類型。
索引維護(hù)
與單機(jī)MySQL的索引有所差異,PolarDB-X的索引均為全局索引,包含以下幾種類型:
普通索引
唯一索引
聚簇索引
其中聚簇索引是PolarDB-X相對于MySQL的一種新類型的索引,它會包含表中的所有列,從而避免了回表的代價。
PolarDB-X中對索引的創(chuàng)建都通過DDL來完成,并且都是Online的,不會阻塞業(yè)務(wù)。
例如:
創(chuàng)建一個普通的索引:CREATE INDEX idx1 ON t1(name)
創(chuàng)建一個聚簇的索引:CREATE CLUSTERED INDEX idx1 ON t1(name)
INSTANT ADD COLUMN
加列操作是業(yè)務(wù)中最為常見的DDL類型。在MySQL中,加列操作的耗時是與數(shù)據(jù)量相關(guān)的(MySQL8.0中在表的最后面加列是INSTANT的)。
在PolarDB-X中,在任意位置加列都是INSTANT的,這個代表加列操作為恒定的秒級耗時,與數(shù)據(jù)量無關(guān),不會對業(yè)務(wù)產(chǎn)生任何影響。
分區(qū)調(diào)整
PolarDB-X支持4種表的分布策略,Hash、Range、List、Broadcast。由于Hash能避免連續(xù)寫入的熱點,PolarDB-X默認(rèn)使用Hash策略,大多數(shù)情況下,此策略能夠很好的滿足系統(tǒng)的性能需要。
但是如果業(yè)務(wù)在運(yùn)行期間,希望選擇合適的分區(qū)策略來提升系統(tǒng)性能,在PolarDB-X中可以方便的通過DDL語句進(jìn)行調(diào)整,PolarDB-X會按照新的分區(qū)策略重新組織表的數(shù)據(jù)。
例如:
修改表的分區(qū)策略為Hash:ALTER TABLE t1 PARTITION BY HASH(name)
修改表的分片數(shù)為32:ALTER TABLE t1 PARTITION BY HASH(name) PARTITIONS 32
將表變?yōu)閺V播表:ALTER TABLE t1 BROADCAST
修改表的分區(qū)策略為RANGE:ALTER TABLE t1 PARTITION BY RANGE(id)
任意兩種分區(qū)策略之間都可以通過DDL語句進(jìn)行轉(zhuǎn)換:
回填速度自適應(yīng)
想必很多同學(xué)有過這樣的經(jīng)驗:一個超大的表進(jìn)行DDL操作,由于數(shù)據(jù)量比較大,這個DDL操作無法在一天內(nèi)完成,為了避免對業(yè)務(wù)影響,人肉在白天業(yè)務(wù)高峰期來臨的時候,調(diào)整參數(shù),降低DDL的回填速度,晚上在業(yè)務(wù)高峰期結(jié)束后,提高DDL的回填速度。
PolarDB-X中的回填,會根據(jù)當(dāng)前的系統(tǒng)負(fù)載,自動調(diào)節(jié)速度。
例如:
在這個例子中,分了四個階段:
開始沒有業(yè)務(wù)負(fù)載,DDL回填速度上升到25W行/s
業(yè)務(wù)負(fù)載開始上升,DDL回填速度迅速下降到13W行/s
業(yè)務(wù)TPS穩(wěn)定在1W5,DDL回填速度穩(wěn)定在13W行/s
DDL結(jié)束后,業(yè)務(wù)TPS穩(wěn)定在1W6
從這個例子中,我們可以看到PolarDB-X DDL的回填速度會自動根據(jù)業(yè)務(wù)負(fù)載進(jìn)行調(diào)整,并且DDL期間,對業(yè)務(wù)的TPS影響很小。
讓Online更Online
為了進(jìn)一步減少DDL期間對業(yè)務(wù)的影響,PolarDB-X還使用了多項技術(shù),例如:
元數(shù)據(jù)多版本,詳見:https://zhuanlan.zhihu.com/p/347885003
可暫停、可取消
MDL死鎖檢測
總結(jié)
PolarDB-X的透明分布式能力,將極大的減少應(yīng)用從單機(jī)數(shù)據(jù)庫遷移分布式數(shù)據(jù)庫的成本。同時,我們未來也會讓它變得更透明,我們正在做的一些事情包括:
更精細(xì)的調(diào)度策略
熱點數(shù)據(jù)的可視化展示,與SQL審計分析聯(lián)動的智能診斷
在有全局索引的情況下,支持分區(qū)級的truncate
數(shù)據(jù)的按時間滾動、清理
等等