為了應(yīng)對(duì)這種敏態(tài)場(chǎng)景,傳統(tǒng)做法是人工介入,比如在建表的時(shí)候,需要人為指定一個(gè)shardkey做分表,但是一般這種方法SQL語(yǔ)法未必能夠兼容所有數(shù)據(jù)庫(kù),另外也需要用戶自己去預(yù)判數(shù)據(jù)熱點(diǎn),不是很靈活。同時(shí)還有一點(diǎn),比如需要擴(kuò)容的時(shí)候,一些普通的場(chǎng)景需要DBA(數(shù)據(jù)庫(kù)運(yùn)維工程師)發(fā)起,可能會(huì)中斷這個(gè)業(yè)務(wù)的執(zhí)行。人工擴(kuò)容沒(méi)有辦法及時(shí)處理。

想讓數(shù)據(jù)庫(kù)能夠具備一個(gè)自主應(yīng)對(duì)敏態(tài)場(chǎng)景能力,盡可能解放人力,讓用戶像使用單機(jī)數(shù)據(jù)庫(kù)一樣使用分布式數(shù)據(jù)庫(kù)。

首先介紹一下TDSQL的架構(gòu),這是一個(gè)TDSQL的整體架構(gòu),它是一個(gè)全分布式的,并且實(shí)現(xiàn)了存算分離的數(shù)據(jù)庫(kù),它由三個(gè)模式構(gòu)成,首先最上面的是MySQL Engine,它是一個(gè)計(jì)算節(jié)點(diǎn),它的一個(gè)目的是將SQL語(yǔ)句轉(zhuǎn)化成KV請(qǐng)求發(fā)送給存儲(chǔ)集群,它會(huì)做一些查詢?nèi)趸?/p>

下面這個(gè)是TDStore,它是一個(gè)Share Nothing存儲(chǔ)的分布式集群,它是一個(gè)KV的存儲(chǔ)模塊,用來(lái)接收Engine下發(fā)的一些KV請(qǐng)求,可以看到TDStore做了一個(gè)數(shù)據(jù)分片,把整個(gè)范圍的數(shù)據(jù)劃分成各個(gè)連續(xù)的Region,每一個(gè)Region其實(shí)是一個(gè)獨(dú)立的Raft pool,它的Raft pool每一個(gè)副本是打散在不同的TDStore上,這樣我們就實(shí)現(xiàn)了一個(gè)初步的負(fù)載均衡。TDStore同時(shí)提供了一個(gè)分布式事務(wù)的下沉,使用2副本保證一個(gè)分布式事務(wù)提交的原子性。

右邊這個(gè)模塊是一個(gè)全局的原數(shù)據(jù)管理模塊MC,它提供的是一個(gè)全局遞增的時(shí)間戳管理,還有它提供了一個(gè)全局的資源調(diào)度,比如說(shuō)發(fā)現(xiàn)某一個(gè)TDStore壓力比較大,這個(gè)時(shí)候它就會(huì)向TDStore下發(fā)調(diào)度任務(wù),把它的一部分壓力均衡到另外一些壓力不怎么大的TDStore節(jié)點(diǎn)上,這樣就實(shí)現(xiàn)了一個(gè)比較初步的負(fù)載均衡,等于說(shuō)對(duì)于這種敏態(tài)業(yè)務(wù)的支持是離不開(kāi)MC的幫助的。

接下來(lái)簡(jiǎn)單介紹一下TDSQL是如何去進(jìn)行數(shù)據(jù)的調(diào)度以及負(fù)載均衡的,介紹一下Region調(diào)度原理。

Region目前的調(diào)度分為分裂、遷移和切主三種,剛剛提到過(guò)TDSQL其實(shí)是以Region做數(shù)據(jù)管理的,也就是說(shuō)每個(gè)Region管理的是一段連續(xù)范圍的數(shù)據(jù),并且每個(gè)Region都是獨(dú)立的Raft Pool,所以這些Region的副本會(huì)散落在不同的TDSQL節(jié)點(diǎn)上,可能每一個(gè)TDSQL所包含的Region數(shù)量是有所差異的。同時(shí)SQL Engine是向Region Leader副本下發(fā)讀寫(xiě)請(qǐng)求的,所以Region Leader副本要比f(wàn)ollower副本承擔(dān)更多的壓力。由此可以得到一個(gè)初步結(jié)論:如果觀察到一個(gè)TDSQL節(jié)點(diǎn)包含了比較多的Region副本數(shù),或者它上面的Leader副本比較多,說(shuō)明這個(gè)TDSQL就承擔(dān)了比較多的壓力。

這里舉一個(gè)具體的例子,這個(gè)圖上展現(xiàn)的是4個(gè)TDSQL構(gòu)成的存儲(chǔ)集群,其中包含三個(gè)Region,我們可以看到Region3比較大,表現(xiàn)上面的數(shù)據(jù)比較多,讀寫(xiě)比較頻繁,所以是一個(gè)熱點(diǎn)Region。此前我們提到過(guò)。Region Leader要承擔(dān)更大的壓力,所以對(duì)于熱點(diǎn)Region3 Leader所在的TDSQL4節(jié)點(diǎn)壓力會(huì)更多一些,同時(shí)我們可以看到TDSQL1有3個(gè)副本,而其他的TDSQL都只負(fù)責(zé)兩個(gè)副本,所以TDSQL 1壓力也比較大。

因此我們最終想達(dá)到一個(gè)目的,我們想把TDSQL1和TDSQL4的一部分壓力轉(zhuǎn)到壓力比較小的TDSQL2上。

具體怎么實(shí)現(xiàn)的?

首先看一下Region分裂的大概原理。

首先我們的Region僅僅只是一個(gè)邏輯上的數(shù)據(jù)分區(qū),可以看到它展現(xiàn)的是一個(gè)大概分類流程,比如說(shuō)一開(kāi)始Region1范圍是A到E,包含了ABCD四個(gè)數(shù)據(jù),經(jīng)過(guò)分裂以后可以看到底層的ABCD四部分?jǐn)?shù)據(jù)沒(méi)有變動(dòng),唯一變動(dòng)的只是說(shuō)新增了一個(gè)新的Region2,原來(lái)的Region1我們稱之為OLD Region,新產(chǎn)生的Region我們叫做New Region,可以看到Region1范圍變成A到C,包含的數(shù)據(jù)是RegionB 2個(gè),Region2的范圍是C到E,它所管理的數(shù)據(jù)是Region D,也就是我們經(jīng)過(guò)分裂以后得到的兩個(gè)Region,他們分別承擔(dān)的是分裂之前的Region的50%的壓力,這樣下來(lái)等于說(shuō)我們可以起到把一個(gè)壓力比較大的Region給分裂成兩個(gè)新Region,這樣就可以擺脫一個(gè)熱點(diǎn)Region的情況。

回到剛剛的例子,首先當(dāng)我們要觸發(fā)分裂的時(shí)候,MC會(huì)向Region的Leader下發(fā)一個(gè)計(jì)算分裂點(diǎn),Leader收到以后會(huì)通過(guò)二分法找到整個(gè)Region范圍內(nèi)的數(shù)據(jù)中間點(diǎn)Key,把這個(gè)Key返回給MC,MC收到以后會(huì)重新向每一個(gè)Region副本下發(fā)分裂任務(wù),當(dāng)TDSQL收到分裂任務(wù)以后,它會(huì)在TDSQL上產(chǎn)生一個(gè)Region 4,相當(dāng)于Region 3的數(shù)據(jù)范圍變小了,把它的后半部分Region范圍單獨(dú)拆分出一個(gè)新的Region 4,這樣來(lái)看雖然Region的熱點(diǎn)沒(méi)有了,但是從TDSQL壓力來(lái)看,沒(méi)有太大變化,比如說(shuō)TDSQL 4,現(xiàn)在它變成了有兩個(gè)Leader,一個(gè)副本的節(jié)點(diǎn),而TDSQL更是承擔(dān)了4個(gè)副本的壓力,所以我們下一步的目的就是把TDSQL1和TDSQL4的壓力均衡到TDSQL2上。

通過(guò)Region遷移去分擔(dān)一部分TDSQL1的壓力,具體的方式就是MC會(huì)向要遷移的目標(biāo)節(jié)點(diǎn),也就是TDSQL2下發(fā)一個(gè)添加副本的任務(wù),TDSQL2收到以后會(huì)創(chuàng)建一個(gè)Region4的副本,等于短時(shí)間內(nèi)Region4從3副本變成4副本的Group,我們的MC會(huì)向TDSQL1下發(fā)一個(gè)銷毀副本的任務(wù),等于Region4就被銷毀掉了,Region4的副本數(shù)又恢復(fù)到3個(gè)。

經(jīng)過(guò)一番操作以后,可以看到TDSQL1變成一個(gè)Leader和2個(gè)Follower,它的壓力降低了很多。

下一步我通過(guò)切主的方式把TDSQL4的Leader切到TDSQL2上,可以看到所有的TDSQL都變成了有1個(gè)Leader和2個(gè)Follower的情況,等于它的負(fù)載就得到一個(gè)均衡。

當(dāng)然剛剛的演示僅僅是一個(gè)示意。實(shí)際在生產(chǎn)環(huán)境中,Region的數(shù)量還有TDSQL節(jié)點(diǎn)數(shù)量會(huì)有很多很多,同時(shí)針對(duì)同一個(gè)Region的分裂遷移和切主三種任務(wù),可能也不會(huì)是這么緊湊的接連執(zhí)行。這里有一個(gè)原因,如果沒(méi)有特殊處理,Region的分裂和切主可能會(huì)對(duì)事務(wù)執(zhí)行有一些影響,影響業(yè)務(wù)的正常進(jìn)行。

接下來(lái)將重點(diǎn)考慮TDSQL是如何盡量?jī)?yōu)化事務(wù)跟Region調(diào)度的并發(fā),去做到Region調(diào)度不殺事務(wù)(以下部分內(nèi)容比較技術(shù),詳情可參見(jiàn)Doit學(xué)院的有關(guān)視頻。)。

(本文基于騰訊云數(shù)據(jù)庫(kù)高級(jí)工程師劉暢演講速記整理而成,未經(jīng)本人審閱

分享到

songjy

相關(guān)推薦